Cómo trazar una línea de stream 2d en vista 3D en matplotlib

Necesito trazar una línea de stream 2d en vista 3D como esta . Según lo sugerido por la publicación , necesito extraer líneas de flujo y flechas de un gráfico 2d y luego transformarlo en datos 3D. ¿Cómo transformar estos datos optimizados en 2d en datos en 3D y trazar usando mplot3d?

Gracias por adelantado

Raj

EDITAR: @ ​​gg349, con su ayuda, podría trazar una línea de stream en la vista 3D. La ttwig esta aqui

Tengo dos preguntas:

  1. Cómo extraer flechas de Streamplot y trazarlo en 3D como lo hiciste en tu publicación anterior

  2. Cómo extraer datos de imshow () y trazarlos en 3D. La línea de stream 2d con imshow () está aquí

este ejemplo debería hacerte comenzar:

import matplotlib.pyplot as plt import numpy as np fig_tmp, ax_tmp = plt.subplots() x, y = np.mgrid[0:2.5:1000j, -2.5:2.5:1000j] vx, vy = np.cos(x - y), np.sin(x - y) res = ax_tmp.streamplot(xT, yT, vx, vy, color='k') fig_tmp.show() # extract the lines from the temporary figure lines = res.lines.get_paths() #for l in lines: # plot(l.vertices.T[0],l.vertices.T[1],'k') fig = plt.figure() ax = fig.add_subplot(111, projection='3d') for line in lines: old_x = line.vertices.T[0] old_y = line.vertices.T[1] # apply for 2d to 3d transformation here new_z = np.exp(-(old_x ** 2 + old_y ** 2) / 4) new_x = 1.2 * old_x new_y = 0.8 * old_y ax.plot(new_x, new_y, new_z, 'k') 

esto genera una figura temporal intermedia: introduzca la descripción de la imagen aquí

De donde se extraen las líneas. A continuación, aplica la transformación de puntos 2d a 3d de su gusto y traza las mismas líneas en una nueva figura 3d: introduzca la descripción de la imagen aquí

pyplot.streamplot devuelve “líneas” y “flechas”.

“Líneas” consiste en una serie de pares de puntos interpolados (en x, y dados en streamplot) desde la función streamplot. Una línea de flujo particular comienza con un punto semilla (distribuido de manera uniforme, supongo) y termina cuando el integrador dentro de la línea de flujo da el mismo par de puntos más de 5 veces. Luego elige la próxima semilla y repite el procedimiento.

Las “flechas” son en realidad información sobre el objeto de parche con puntos de borde medidos por la figura (gca) a diferencia de “líneas”. Por eso, si obtiene res.arrows.get_paths () y traza los vértices de la misma, se ejecuta desde cero hasta (figsize [0] -2) * dpi y (figsize [1] -2) * dpi.

En principio se puede invertir la lógica de nuevo y obtener la flecha. Pero creo que eso sería tedioso. Así que mejor sería la forma, obtener todos los segmentos de una línea de stream particular de “líneas”. Mapee a 3d y dibuje flechas 3d usando uno o más segmentos, dependiendo de la densidad de flechas que desee.

Condiciones para obtener líneas de stream individuales de “líneas” es. 1. Nueva línea de stream si los cuatro puntos de dos segmentos consecutivos difieren. 2. Fin de una línea de stream si los cuatro puntos de dos segmentos consecutivos son iguales para más de 5 pares consecutivos.

Una solución ingenua podría ser

  fig = figure(figsize=(8,6), dpi =160) ax = fig.add_subplot(111, projection='3d' ) i = 0 for line in lines: i += 1 old_x = line.vertices.T[0] old_y = line.vertices.T[1] # apply for 2d to 3d transformation here new_z = np.exp(-(old_x ** 2 + old_y ** 2) / 4) new_x = 1.2 * old_x new_y = 0.8 * old_y ax.plot(new_x, new_y, new_z, 'k') if i%10 ==1: ax.quiver(new_x[0],new_y[0],new_z[0],new_x[0]-new_x[1],new_y[0]-new_y[1],new_z[0]-new_z[1], length=0.2)