如何使用Mayavi绘制3D复杂场的等值面以避免颜色插值伪影?

以示例库中的原子轨道示例为基础,我尝试使用等值面来可视化 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, 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]) , 0, -1)  ) # --> tuple
    return c

但是,我不知道是否有 mayavi 内置方法允许直接输入具有表面 RGB 颜色的数组。

以上是如何使用Mayavi绘制3D复杂场的等值面以避免颜色插值伪影?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>