7

我试图了解如何构建用于 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]->[1,1,1]->[0,0,2] [0,0,0]-> [1,-1,1]->[0,0,2] 和这些线之间的表面。数组应该是什么plot_surface样子才能得到这样的东西?

4

2 回答 2

3

理解网格是如何plot_surface工作的并不容易。所以首先我会给出一个一般性的解释,然后我会解释如何在你的情况下转换数据。如果您有一个Nx 值数组和一个My 值数组,则需要创建两个分别具有 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)

在此处输入图像描述

于 2017-03-22T11:53:06.427 回答
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)
于 2012-07-15T13:15:02.673 回答