how do you radially 'sweep out' a 1D array

2019-03-22 04:24发布

effectively I have a large 1D array of heights. As a small example consider:

u=array([0,1,2,1,0,2,4,6,4,2,1])

and a 1D array, the same size as u, of radial values which the heights correspond to, e.g.:

r=array([0,1,2,3,4,5,6,7,8,9,10])

Obviously plotting these with:

pylab.plot(r,u)

gives a nice 2D plot.

How can one sweep this out around 360 degrees, to give a 3D contour/surface plot?

If you can imagine it should look like a series of concentric, circular ridges, like for the wavefunction of an atom.

any help would be much appreciated!

2条回答
该账号已被封号
2楼-- · 2019-03-22 05:07

You're better off with something more 3D oriented than matplotlib, in this case...

Here's a quick example using mayavi: alt text

from enthought.mayavi import mlab
import numpy as np

# Generate some random data along a straight line in the x-direction
num = 100
x = np.arange(num)
y, z = np.ones(num), np.ones(num)

s = np.cumsum(np.random.random(num) - 0.5)

# Plot using mayavi's mlab api
fig = mlab.figure()

# First we need to make a line source from our data
line = mlab.pipeline.line_source(x,y,z,s)

# Then we apply the "tube" filter to it, and vary the radius by "s"
tube = mlab.pipeline.tube(line, tube_sides=20, tube_radius=1.0)
tube.filter.vary_radius = 'vary_radius_by_scalar'

# Now we display the tube as a surface
mlab.pipeline.surface(tube)

# And finally visualize the result
mlab.show()
查看更多
Root(大扎)
3楼-- · 2019-03-22 05:18
#!/usr/bin/python

from mpl_toolkits.mplot3d import Axes3D
import matplotlib
import numpy as np
from scipy.interpolate import interp1d
from matplotlib import cm
from matplotlib import pyplot as plt
step = 0.04
maxval = 1.0
fig = plt.figure()
ax = Axes3D(fig)  



u=np.array([0,1,2,1,0,2,4,6,4,2,1])
r=np.array([0,1,2,3,4,5,6,7,8,9,10])
f=interp1d(r,u)

# walk along the circle
p = np.linspace(0,2*np.pi,50)
R,P = np.meshgrid(r,p)
# transform them to cartesian system
X,Y = R*np.cos(P),R*np.sin(P)

Z=f(R)

ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet)
ax.set_xticks([])
plt.show()
查看更多
登录 后发表回答