Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为axes3d创建曲面数据_Python_Matplotlib - Fatal编程技术网

Python 为axes3d创建曲面数据

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,

好吧,我为这个问题道歉,但我在这里发牢骚

我在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\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的最新版本可能会解决此问题。