Python 为axes3d创建曲面数据
好吧,我为这个问题道歉,但我在这里发牢骚 我在python中加载了一个数据结构,格式如下:Python 为axes3d创建曲面数据,python,matplotlib,Python,Matplotlib,好吧,我为这个问题道歉,但我在这里发牢骚 我在python中加载了一个数据结构,格式如下: [(1,0,#),(1,1,#),(1,2,#),(1,3,#),(2,0,#),(2,1,#) ... (26,3,#)] 每次我希望在z轴上表示的#都是不同的数字。你可以看到x和y总是整数 绘制散点图很简单: x,y,z = zip(*data) fig = plt.figure() ax = fig.gca(projection = '3d') surface = ax.scatter(x, y,
[(1,0,#),(1,1,#),(1,2,#),(1,3,#),(2,0,#),(2,1,#) ... (26,3,#)]
每次我希望在z轴上表示的#都是不同的数字。你可以看到x和y总是整数
绘制散点图很简单:
x,y,z = zip(*data)
fig = plt.figure()
ax = fig.gca(projection = '3d')
surface = ax.scatter(x, y, z)
plt.show()
但说到曲面,我可以看到两种方法:
1) 调用ax.plot\u trisurf()
,它应该与类似于ax.scatter()
的1D数组一起工作,显然可以工作,但对我来说,它给了我一个错误:
"AttributeError: Axes3D subplot object has not attribute 'plot_trisurf'"
如果在以下位置使用示例源代码,也会出现此错误:
,表明我的安装有问题-我的Matplotlib版本是1.1.1rc,。例如,如果调用了ax.plot\u surface()
,或ax.scatter()
,则不会出现此错误
2) 使用meshgrid()
或griddata()
与ax.plot\u surface()
结合使用-在这两种情况下,经过两天对文档和示例的反复阅读,我仍然不明白如何在我的案例中正确使用它们,特别是在生成Z的值时
任何帮助都将不胜感激。要解决您的第一个问题(1),我相信您需要从
mplot3d
库导入Axes3D
,即使您没有直接调用它。也许可以尝试添加
from mpl_toolkits.mplot3d import Axes3D
在主代码之前(这一行在读取时触发了内存)
对于(2),X
,Y
和Z
需要是矩阵(2d数组)类型的对象。这可能会让人困惑,但你可以考虑一个例子:
# two arrays - one for each axis
x = np.arange(-5, 5, 0.25)
y = np.arange(-5, 5, 0.25)
# create a mesh / matrix like object from the arrays
X, Y = np.meshgrid(x, y)
# create Z values - also in a mesh like shape
Z = np.sin(np.sqrt(X**2 + Y**2))
# plot!
surface = ax.plot_surface(X, Y, Z)
下面是如何从
数据中提取z值的示例
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np
data = [(j,i,i**2 + j) for j in range(1,27) for i in range(4)]
print data
fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(0, 4, 1)
Y = np.arange(1, 27, 1)
X, Y = np.meshgrid(X, Y)
print X.shape
print Y.shape
Z = np.array([z for _,_,z in data]).reshape(26,4)
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm,
linewidth=0, antialiased=True)
fig.colorbar(surf, shrink=0.5, aspect=5)
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
他尝试使用的函数,plot\u trisurf
,不要求输入为2D数组。它应该将x、y、z 1D数组插值到曲面中。@M4rtini“meshgrid()或griddata()与ax.plot_surface()结合使用”都需要2D数组。您可以在尝试调用plot_trisurf
的地方显示代码吗?更新matplotlib的最新版本可能会解决此问题。