假设我们有一些3D complex值函数f(x,y,z)。使用Plotly,我试图绘制大小为| f(x,y,z)|的等值面。这种功能。到目前为止,一切正常,我的代码似乎运行良好,请在下面的atomic orbitals函数上找到一个有效的示例:
import chart_studio.plotly as py
import plotly.graph_objs as go
import scipy.special as scispe
import numpy as np
import math
a=5.29e-11 # Bohr radius (m)
def orbital(n,l,m,r,theta,phi): # Complex function I want to plot
L=scispe.genlaguerre(n-l-1,2*l+1) # Laguerre polynomial
radial= (2/(n*a))**(3/2) * np.sqrt(math.factorial(n-l-1)/(2*n*math.factorial(n+l))) * np.exp(-2*r/n) * (2*r/n)**l * L(2*r/n)
wavefunction = radial * scispe.sph_harm(m,l, phi, theta)
return wavefunction
#Quantum numbers
n=2
l=1
m=0
goodspan = (3 * n**2 - l * (l+1))/2 #Plot span adpated to the mean electron position
x, y, z = np.mgrid[-goodspan:goodspan:40j, -goodspan:goodspan:40j, -goodspan:goodspan:40j] #in units of a
r = np.sqrt(x**2 + y**2 + z**2) #Function has to be evaluated in spherical coordinates
theta = np.arccos(z/r)
phi = np.arctan(y/x)
AO=orbital(n,l,m,r,theta,phi)
magnitude = abs(AO) # Compute the magnitude of the function
phase = np.angle(AO) # Compute the phase of the function
isoprob = np.amax(magnitude)/2 # Set value the isosurface
fig = go.Figure(data=go.Isosurface(
x=x.flatten(),
y=y.flatten(),
z=z.flatten(),
value=magnitude.flatten(),
opacity=0.5,
isomin=isoprob,
isomax=isoprob,
surface_count=1,
caps=dict(x_show=True, y_show=True)
))
fig.show()
此时,图形的色标取决于大小| f(x,y,z)|的值,因此单个等值面的颜色始终是均匀的。
现在,要使色阶映射到幅度| f(x,y,z)|,我希望将其映射到phaseФ(x,y,z)的值上= arg(f(x,y,z)),因此绘制等值面的每个点的颜色都会告诉我们有关场Ф(x,y,z)的值(它将分布在[-π,理想的π]代替| f(x,y,z)|在这一点上。
基本上,如果可能,我想用Plotly代替Mayavi进行this。
在我看来,所有这些都与设置函数cmin
的cmax
和Isosurface
参数的特殊方式有关,但是我不知道该怎么做。
正如@gnodab在他的评论中提到的那样,可绘制的等值面并不能真正支持按第五维对表面进行着色(至少没有明显的方法可以做到)。我也不确定是否有可能提取描述等值面的数据以某种方式重新绘制为规则曲面。
然而,在this post中,他们描述了如何使用skimage.measure.marching_cubes_lewiner
生成等值面,然后用自定义色标绘制并用'mesh3d'
迹线对其进行着色。这可能就是您想要的。如果有时间,我会尝试一下,以后再编辑答案。