How to plot a 3D revolution in matplotlib?

Suppose you have a 2D curve defined, for example:

from matplotlib import pylab t = numpy.linspace(-1, 1, 21) z = -t**2 pylab.plot(t, z) 

which produces

http://i.imgur.com/feQzk.png

I would like to revolutionize the achievement of 3D graphics (see http://reference.wolfram.com/mathematica/ref/RevolutionPlot3D.html ). Building a 3d surface is not a problem, but it does not give the expected result:

http://i.imgur.com/ljXHQ.png

How can I rotate this blue curve in 3d graphics?

+6
source share
1 answer

Your plot on your figure seems to use a Cartesian grid. The matplotlib website has three-dimensional cylindrical functions such as Z = f (R) (here: http://matplotlib.org/examples/mplot3d/surface3d_radial_demo.html ). Is this what you are looking for? Below I get with your function Z = -R ** 2: Plot of Z = -R ** 2 function

And to add a line to your function, use the following example: (matplotlib 1.2.0 required)

 from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm import matplotlib.pyplot as plt import numpy as np fig = plt.figure() ax = fig.gca(projection='3d') X = np.arange(-5, 5, 0.25) Y = np.arange(-5, 5, 0.25) X, Y = np.meshgrid(X, Y) Z = -(abs(X) + abs(Y)) ## 1) Initial surface # Flatten mesh arrays, necessary for plot_trisurf function X = X.flatten() Y = Y.flatten() Z = Z.flatten() # Plot initial 3D surface with triangles (more flexible than quad) #surfi = ax.plot_trisurf(X, Y, Z, cmap=cm.jet, linewidth=0.2) ## 2) Cut off # Get desired values indexes cut_idx = np.where(Z > -5) # Apply the "cut off" Xc = X[cut_idx] Yc = Y[cut_idx] Zc = Z[cut_idx] # Plot the new surface (it would be impossible with quad grid) surfc = ax.plot_trisurf(Xc, Yc, Zc, cmap=cm.jet, linewidth=0.2) # You can force limit if you want to compare both graphs... ax.set_xlim(-5,5) ax.set_ylim(-5,5) ax.set_zlim(-10,0) plt.show() 

Result for surfi:

surfi

and surfc:

surfc

+4
source

All Articles