plot 3d en python usando tres listas

Seguí este enlace para trazar la figura 3D. Mi problema es que ya tengo 3 listas para X, Y, Z

X.shape (n,), Y.shape (n,), Z.shape (n,)

Cómo pasar estas listas a surf = ax.plot_surface(X, Y, Z) ya que el enlace muestra que cada una de estas variables tiene la siguiente forma

X.shape (n, n), Y.shape (n, n), Z.shape (n, n)

Si pasé estas coordenadas ya que cada una de las formas es (n,), entonces la figura 3d aparecerá como vacía, ¡no hay puntos que se dibujarán!

Intenté usar np.meshgrid como sigue, ¡pero de esta manera solo se mostrará una superficie en un plano en lugar de puntos 3d!

 X,Y,Z = np.meshgrid(X,Y,Z) X = X[0] Y = Y[0] Z = Z[0] fig = plt.figure() ax = fig.gca(projection='3d') ax.plot_surface(X, Y, Z) plt.show() 

introduzca la descripción de la imagen aquí

La solución dependerá de cómo estén organizados los datos.

Datos en cuadrícula regular

Si los datos X e Y ya definen una cuadrícula, se pueden cambiar fácilmente a una cuadrícula cuadrilátera. P.ej

 #xyz 4 1 3 6 1 8 8 1 -9 4 2 10 6 2 -1 8 2 -8 4 3 8 6 3 -9 8 3 0 4 4 -1 6 4 -8 8 4 8 

se puede trazar como un plot_surface usando

 ax = fig.gca(projection='3d') ax.plot_surface(X.reshape(4,3), Y.reshape(4,3), Z.reshape(4,3)) 

Datos arbitrarios

(a) En caso de que los datos no vivan en una cuadrícula cuadrilátera, se pueden interpolar los datos en una cuadrícula. Un método para hacerlo lo proporciona matplotlib, utilizando matplotlib.mlab.griddata .

 import matplotlib.mlab xi = np.linspace(4, 8, num=10) yi = np.linspace(1, 4, num=10) zi = matplotlib.mlab.griddata(X, Y, Z, xi, yi, interp='linear') ax.plot_surface(xi, yi, zi) 

(b) Finalmente, uno puede trazar una superficie completamente sin el uso de una cuadrícula cuadrilátera. Esto se puede hacer utilizando plot_trisurf .

 plt.plot_trisurf(X,Y,Z) 

Esta respuesta es una versión adaptada de mi respuesta para trazados de contorno .