我正在尝试了解如何构建用于plot_surface的数组(在Axes3d中)。 我试图建立一个简单的表面来处理那些数组的数据:
In [106]: x
Out[106]:
array([[0, 0],
[0, 1],
[0, 0]])
In [107]: y
Out[107]:
array([[0, 0],
[1, 1],
[0, 0]])
In [108]: z
Out[108]:
array([[0, 0],
[1, 1],
[2, 2]])
但我无法弄清楚它们是如何解释的 - 例如我的情节中z = 2中没有任何内容。 任何人都可以准确地解释将采取哪些值来制作点,哪一行是最终的,最后是表面。
例如,我想建立一个与线点连接的表面:
[0,0,0] - GT; [1,1,1] - > [0,0,2]
[0,0,0] - GT; [1,-1,1] - GT; [0,0,2]
以及这些线之间的表面。
plot_surface
的数组应该是什么样的?
答案 0 :(得分:3)
了解plot_surface
中的网格是如何工作的并不容易。首先,我将给出一般性解释,然后我将解释如何在您的情况下转换数据。
如果您有一组N
x值和一组M
y值,则需要创建两个x和y值的网格(M,N)
。幸运的是numpy.meshgrid
会有所帮助。困惑?查看示例:
x = np.arange(3)
y=np.arange(1,5)
X, Y = np.meshgrid(x,y)
元素(x[i], y[j])
被访问为(X[j,i], Y[j,i])
。它的Z
值当然是Z[j,i]
,您还需要定义它。
话虽如此,您的数据确实会产生(0,0,2)
中的表面点,如预期的那样。实际上,该位置有两个点,来自坐标索引(0,0,0)
和(1,1,1)
。
我附上用以下内容绘制数组的结果:
fig = plt.figure()
ax=fig.add_subplot(1,1,1, projection='3d')
surf=ax.plot_surface(X, Y, Z)
答案 1 :(得分:1)
如果我理解正确,你会尝试通过一组点插值表面。我不认为plot_surface是正确的功能。但如果我错了,请纠正我。我认为你应该寻找插值工具,可能是那些scipy.interpolate。然后可以使用plot_surface绘制插值结果。
plot_surface能够基于x,y坐标在3D空间中绘制网格(具有z值)。 x和y的数组是由numpy.meshgrid创建的。
plot_surface的例子:
import pylab as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
plt.ion()
x = np.arange(0,np.pi, 0.1)
y = x.copy()
z = np.sin(x).repeat(32).reshape(32,32)
X, Y = np.meshgrid(x,y)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X,Y,z, cmap=plt.cm.jet, cstride=1, rstride=1)