Как вы радиально «сметаете» 1D массив для построения 3D фигуры в python? (для представления волновой функции) - PullRequest
2 голосов
/ 12 ноября 2010

эффективно у меня большой массив 1D высот. В качестве небольшого примера рассмотрим:

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

и одномерный массив того же размера, что и u, радиальных значений, которым соответствуют высоты, например ::1004

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

Очевидно, что заговор эти с:

pylab.plot(r,u)

дает хороший 2D-график.

Как можно развернуть это на 360 градусов, чтобы получить трехмерный контур / график поверхности?

Если вы можете себе представить, это должно выглядеть как серия концентрических круговых выступов, как для волновой функции атома.

любая помощь будет высоко ценится!

Ответы [ 2 ]

2 голосов
/ 12 ноября 2010
#!/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()
2 голосов
/ 12 ноября 2010

Вам лучше с чем-то более ориентированным на 3D, чем matplotlib, в данном случае ...

Вот быстрый пример использования 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...