Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.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 Matplotlib 3D plot-输入数据的2D格式?_Python_3d_Matplotlib_Mplot3d - Fatal编程技术网

Python Matplotlib 3D plot-输入数据的2D格式?

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

我正在用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 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列表转换为数组。我相应地更新了我的答案