为axes3d创建表面数据

时间:2014-01-22 16:51:53

标签: 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, 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的值时。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

要解决您的第一个问题(1)我认为您需要从Axes3D库导入mplot3d,即使您没有直接调用它。也许尝试添加

from mpl_toolkits.mplot3d import Axes3D
在主代码之前

(此行在阅读the tutorial时触发了内存)。

至于(2),XYZ需要是矩阵(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

中提取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()