Python中标量场的可视化

5

我需要在Python中可视化几个重叠的标量场。我发现mayavi库可以绘制此类图。问题是我不知道如何为标量场自定义颜色映射。我的想法是为每个场都有不同深浅的同一种颜色。我尝试了采用一个例子,但它不起作用。这里是我使用红色阴影可视化标量场的代码:

import numpy as np
from mayavi import mlab

x, y, z = np.ogrid[-10:10:20j, -10:10:20j, -10:10:20j]
s = np.sin(x*y*z)/(x*y*z)

src = mlab.pipeline.scalar_field(s)
volume = mlab.pipeline.volume(src)

lut = np.zeros((256, 4), np.uint8)
lut[:,-1] = 255
lut[:, 0] = np.linspace(0, 255, 256)

volume.module_manager.scalar_lut_manager.lut.table = lut

mlab.draw()
mlab.view(40, 85)

mlab.show()

然而,生成的图始终采用标准的蓝红查找表。

你有找到解决方案吗?我也遇到了类似的问题:https://stackoverflow.com/questions/36946231/using-perceptually-uniform-colormaps-in-mayavi-volumetric-visualization - crypdick
哦,当我尝试将“table”重新分配给修改后的“lut”时,它什么也没做。我要提交一个错误报告。 - crypdick
据我所知,这似乎是一个错误。我已在此处提交了错误报告:https://github.com/enthought/mayavi/issues/371 - crypdick
不,我没有成功解决这个问题...让我们看看你的错误报告会被如何评论。 - desa
1个回答

1

我无法使用lut_manager找到解决方案,但是下面的解决方案,遵循this github reply,对我有效。

import numpy as np
from mayavi import mlab
# import color transfer function from vtk
from tvtk.util import ctf
# import matlab colormaps
from matplotlib.pyplot import cm

x, y, z = np.ogrid[-10:10:20j, -10:10:20j, -10:10:20j]
s = np.sin(x*y*z)/(x*y*z)

src = mlab.pipeline.scalar_field(s)
volume = mlab.pipeline.volume(src)

# save the color transfer function of the current volume
c = ctf.save_ctfs(volume._volume_property)
# change the alpha channel as needed
c['alpha'][1][1] = 0.5
# change the color points to another color scheme
# in this case 'magma'
c['rgb']=[[a[0],a[1],a[2],cm.magma.colors.index(a)/255] for a in cm.magma.colors]
# load the new color transfer function
ctf.load_ctfs(c, volume._volume_property)
# signal for update
volume.update_ctf = True

mlab.show()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接