Matplotlib 3D plot - a 2D format for data entry?

I am drawing a function of two parameters with matplotlib. I copied the example in the matplotlib tutorial and converted my own input: the vectors X and Y (equally spaces to -3: 3) and Z = peaks (X, Y) with peaks - this is the function I defined. What's wrong?

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() 

Thanks for the advice!

+4
source share
1 answer

You need to generate a meshgrid. X, Y and Z must be two-dimensional arrays

 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])) 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() 

enter image description here

+6
source

Source: https://habr.com/ru/post/1394905/


All Articles