好的,为这个问题道歉但是我把头发拉出来了。
我有一个以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, z)
plt.show()
但是当谈到表面时,我可以看到两种方法:
1)拨打ax.plot_trisurf()
,这应该适用于与ax.scatter()
类似的1D数组并显然有效here,但对我来说却给了我一个错误:
"AttributeError: Axes3D subplot object has not attribute 'plot_trisurf'"
如果我在以下位置使用示例源代码,也会出现此错误:
http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#tri-surface-plots,表明我的安装有问题 - 我的Matplotlib版本是1.1.1rc。例如,如果调用ax.plot_surface()
,则不会出现此错误,也不会显示ax.scatter()
。
2)将meshgrid()
或griddata()
与ax.plot_surface()
结合使用 - 在任何一种情况下,经过两天的文档和示例,我仍然不明白如何在我的情况下正确使用这些,特别是在生成Z的值时。
非常感谢任何帮助。
答案 0 :(得分:4)
要解决您的第一个问题(1)我认为您需要从Axes3D
库导入mplot3d
,即使您没有直接调用它。也许尝试添加
from mpl_toolkits.mplot3d import Axes3D
在主代码之前(此行在阅读the tutorial时触发了内存)。
至于(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)
答案 1 :(得分:2)
以下是如何从data
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()