Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
647 views
in Technique[技术] by (71.8m points)

numpy - plot 3d in python using three lists

I followed this link to plot the 3D figure. My problem is I have already 3 lists for X, Y, Z

X.shape (n,) , Y.shape (n,) , Z.shape (n,)

How to pass these lists into surf = ax.plot_surface(X, Y, Z) as link show each of these variables have the following shape

X.shape (n,n) , Y.shape (n,n) , Z.shape (n,n)

If I passed these coordinate as them each one shape is (n,) then the 3d figure will appear as empty there is no points will be plotted!

I tried to use the np.meshgrid as following but this way will show only one surface in one plane instead of 3d points!

X,Y,Z = np.meshgrid(X,Y,Z)

X = X[0]
Y = Y[0]
Z = Z[0]

fig = plt.figure()

ax = fig.gca(projection='3d')
ax.plot_surface(X, Y, Z)
plt.show()

enter image description here

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

The solution will depend on how the data is organized.

Data on regular grid

If the X and Y data already define a grid, they can be easily reshaped to a quadrilateral grid. E.g.

#x  y  z
 4  1  3
 6  1  8
 8  1 -9
 4  2 10
 6  2 -1
 8  2 -8
 4  3  8
 6  3 -9
 8  3  0
 4  4 -1
 6  4 -8
 8  4  8 

can plotted as a plot_surface using

ax = fig.gca(projection='3d')
ax.plot_surface(X.reshape(4,3), Y.reshape(4,3), Z.reshape(4,3))

Arbitrary data

(a) In case the data is not living on a quadrilateral grid, one can interpolate the data on a grid. One method to do so is provided by matplotlib itself, using matplotlib.mlab.griddata.

import matplotlib.mlab
xi = np.linspace(4, 8, num=10)
yi = np.linspace(1, 4, num=10)
zi = matplotlib.mlab.griddata(X, Y, Z, xi, yi, interp='linear')
ax.plot_surface(xi, yi, zi)

(b) Finally, one can plot a surface completely without the use of a quadrilateral grid. This can be done using plot_trisurf.

plt.plot_trisurf(X,Y,Z)

This answer is an adapted version of my answer for contour plots.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...