应该如何构建plot_surface的数组?

时间:2012-07-14 19:57:45

标签: matplotlib

我正在尝试了解如何构建用于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的数组应该是什么样的?

2 个答案:

答案 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)

enter image description here

答案 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)