Python Matplotlib 3D plot-输入数据的2D格式?
我正在用matplotlib绘制两个参数的函数。我复制了matplotlib教程中的一个示例,并使用我自己的输入数据进行转换:向量X和Y(在-3:3中等分数字)和Z=峰值(X,Y),峰值是我在之前定义的函数。怎么了Python Matplotlib 3D plot-输入数据的2D格式?,python,3d,matplotlib,mplot3d,Python,3d,Matplotlib,Mplot3d,我正在用matplotlib绘制两个参数的函数。我复制了matplotlib教程中的一个示例,并使用我自己的输入数据进行转换:向量X和Y(在-3:3中等分数字)和Z=峰值(X,Y),峰值是我在之前定义的函数。怎么了 def peaks(x,y): xsq=x**2 ysq=y**2 xsq_one=(x+1)**2 ysq_one=(y+1)**2 m1=3*(1-x)**2 m2=10*(x/5-x**3-y**5) m3=1/3 return
def peaks(x,y):
xsq=x**2
ysq=y**2
xsq_one=(x+1)**2
ysq_one=(y+1)**2
m1=3*(1-x)**2
m2=10*(x/5-x**3-y**5)
m3=1/3
return m1*numpy.exp(-xsq-ysq_one)-m2*numpy.exp(-xsq-ysq)-m3*numpy.exp(-xsq_one-ysq)
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.gca(projection='3d')
X=Y=numpy.arange(-3,3,0.01).tolist()
Z=[]
for i in range(len(X)):
Z.append(peaks(X[i],Y[i]))
ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.3)
cset = ax.contour(X, Y, Z, zdir='z', offset=-100)
cset = ax.contour(X, Y, Z, zdir='x', offset=-40)
cset = ax.contour(X, Y, Z, zdir='y', offset=40)
ax.set_xlabel('X')
ax.set_xlim(-40, 40)
ax.set_ylabel('Y')
ax.set_ylim(-40, 40)
ax.set_zlabel('Z')
ax.set_zlim(-100, 100)
plt.show()
谢谢你的建议 您需要生成网格网格。十、 Y和Z必须是二维阵列
import numpy
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
def peaks(x,y):
return x * numpy.sin(y)
fig = plt.figure()
ax = fig.gca(projection='3d')
X = Y= numpy.arange(-3, 3, 0.1).tolist()
X, Y = numpy.meshgrid(X, Y)
Z = []
for i in range(len(X)):
Z.append(peaks(X[i],Y[i]))
# Z must be an array
Z = numpy.array(Z)
ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.3)
cset = ax.contour(X, Y, Z, zdir='z', offset=-8)
cset = ax.contour(X, Y, Z, zdir='x', offset=-8)
cset = ax.contour(X, Y, Z, zdir='y', offset=8)
ax.set_xlabel('X')
ax.set_xlim(-8, 8)
ax.set_ylabel('Y')
ax.set_ylim(-8, 8)
ax.set_zlabel('Z')
ax.set_zlim(-8, 8)
plt.show()
被接受的答案不再有效。遗憾的是,评论员拒绝了我建议的编辑,这将使它成为一个有效的asnwer。因此,这里再次给出了相同的答案,但需要做一些小改动,以使其在当前版本的matplotlib中工作
import numpy
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
def peaks(x,y):
return x * numpy.sin(y)
fig = plt.figure()
ax = fig.gca(projection='3d')
X = Y= numpy.arange(-3, 3, 0.1).tolist()
X, Y = numpy.meshgrid(X, Y)
Z = numpy.zeros(X.shape)
for i in range(len(X)):
for j in range(len(Y)):
Z[i,j] = peaks(X[i,j],Y[i,j])
ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.3)
cset = ax.contour(X, Y, Z, zdir='z', offset=-8)
cset = ax.contour(X, Y, Z, zdir='x', offset=-8)
cset = ax.contour(X, Y, Z, zdir='y', offset=8)
ax.set_xlabel('X')
ax.set_xlim(-8, 8)
ax.set_ylabel('Y')
ax.set_ylim(-8, 8)
ax.set_zlabel('Z')
ax.set_zlim(-8, 8)
plt.show()
TypeError:输入z必须是2D数组。。。函数求值是1D…这必须是一个开始,但在这段代码中,我有一个错误(使用自己的peak函数,请参见上文)TypeError:只有长度为1的数组可以转换为Python标量。我将尝试使用网格其他形式。谢谢,您是对的。更快的解决方案是将Z列表转换为数组。我相应地更新了我的答案