使用三个列表在python中绘制3d

时间:2017-06-04 14:41:45

标签: python numpy matplotlib mplot3d

我按照link绘制了3D图。 我的问题是我已经有3个X,Y,Z列表

  

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

如何将这些列表传递给surf = ax.plot_surface(X, Y, Z)作为链接显示每个变量具有以下形状

  

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

如果我传递这些坐标,因为每个形状都是(n,)那么3d图形将显示为空,没有点将被绘制!

我尝试使用np.meshgrid如下,但这种方式只能在一个平面上显示一个表面而不是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()

enter image description here

1 个答案:

答案 0 :(得分:0)

解决方案取决于数据的组织方式。

常规网格上的数据

如果XY数据已经定义了网格,则可以轻松地将它们重新整形为四边形网格。 E.g。

#x  y  z
 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 

可以使用

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

任意数据

(a)如果数据不是生活在四边形网格上,可以在网格上插入数据。 matplotlib本身使用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)最后,可以在不使用四边形网格的情况下完全绘制曲面。这可以使用plot_trisurf完成。

plt.plot_trisurf(X,Y,Z)

此答案是my answer for contour plots的改编版本。