问题描述
以示例库中的 Atomic orbital example 为基础,我尝试使用等值面将 3D 任意复杂场可视化,就像循环 HSV 颜色图说明场的相位一样。
但是,在相场取值接近 pi
和 -pi
的点上存在问题,在下图中对应于红色:
在这些点中,pi
和 -pi
之间存在明显的不连续性,而 mayavi 似乎在这些值之间进行了插值,这导致了上图中出现的“嘈杂色线” .
我的问题:有没有办法解决这个问题,例如禁用颜色插值?
重现情节的代码:
import numpy as np
from mayavi import mlab
L = 1.0
N = 150
xx,yy,zz = np.mgrid[-L:L:N*1j,-L:L:N*1j,-L:L:N*1j]
? = 0.0
σ = 0.30
V = np.exp((-(xx-?)**2 -(yy)**2 -(zz)**2 ) / (2*σ**2))
density = V/np.amax(np.abs(V))
phi = np.arctan2(yy,xx)
density = density *np.exp(6*phi*1j)
figure = mlab.figure('Phase Plot',bgcolor=(0,0),size=(700,700))
field = mlab.pipeline.scalar_field(np.abs(density),vmin= 0.0,vmax= 1.0)
colour_data = (np.angle(density.T.ravel()))
field.image_data.point_data.add_array(colour_data)
field.image_data.point_data.get_array(1).name = 'phase'
field.update()
field2 = mlab.pipeline.set_active_attribute(field,point_scalars='scalar')
contour = mlab.pipeline.contour(field2)
contour.filter.contours= [0.1,]
contour2 = mlab.pipeline.set_active_attribute(contour,point_scalars='phase')
mlab.pipeline.surface(contour2,colormap='hsv',vmin= -np.pi,vmax= np.pi)
mlab.colorbar(title='Phase',orientation='vertical',nb_labels=3)
φ = 30
mlab.view(azimuth= φ,distance = N*4)
mlab.show()
我想解决此问题的另一种方法是使用此函数手动设置表面上的颜色,该函数从复杂数组 Z 返回一组 RGB 颜色:
from matplotlib.colors import hsv_to_rgb
import numpy as np
def complex_to_rgb(Z):
r = np.abs(Z)
arg = np.angle(Z)
h = (arg + np.pi) / (2 * np.pi)
s = np.ones(h.shape)
v = r / np.amax(r) #alpha
c = hsv_to_rgb( np.moveaxis(np.array([h,s,v]),-1) ) # --> tuple
return c
但是,我不知道是否有mayavi内置方法允许直接输入具有表面RGB颜色的数组。
解决方法
我没有在你的程序中看到任何错误,但我认为你必须在序列中创建一个字段,就像 field(1) field(2) field(3) 然后运行程序:
print(field(1))
print(field(2))
等等。
你也应该在写字段程序的顶部尝试这个
import numpy as a np
from mayavi import mlab
? =
σ =
V =
density =
phi =
density =