Matplotlib 在Mayavi体积可视化中使用感知均匀的彩色贴图

Matplotlib 在Mayavi体积可视化中使用感知均匀的彩色贴图,matplotlib,data-visualization,mayavi,colormap,perception,Matplotlib,Data Visualization,Mayavi,Colormap,Perception,AFAIK Mayavi没有任何感知上一致的彩色贴图。我天真地试图通过它,但失败了: from mayavi import mlab import multiprocessing import matplotlib.pyplot as plt plasma = plt.get_cmap('plasma') ... mlab.pipeline.volume(..., colormap=plasma) TraitError:无法设置“VolumeFactory”对象的未定义“colormap”

AFAIK Mayavi没有任何感知上一致的彩色贴图。我天真地试图通过它,但失败了:

from mayavi import mlab
import multiprocessing
import matplotlib.pyplot as plt

plasma = plt.get_cmap('plasma')

...
mlab.pipeline.volume(..., colormap=plasma)
TraitError:无法设置“VolumeFactory”对象的未定义“colormap”属性


编辑:我发现可以将Matplotlib colormaps转换为Mayavi colormaps。然而,不幸的是,它不起作用,因为我正试图使用一个使用感知一致的彩色贴图的卷

from matplotlib.cm import get_cmap
import numpy as np
from mayavi import mlab

values = np.linspace(0., 1., 256)
lut_dict = {}
lut_dict['plasma'] = get_cmap('plasma')(values.copy())

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

mlab.pipeline.volume(mlab.pipeline.scalar_field(s), vmin=0, vmax=0.8, colormap=lut_dict['plasma'])  # still getting the same error
mlab.axes()
mlab.show()

如果将其设置为卷的
ColorTransferFunction
,而不是将其设置为
colormap
参数,则它将按预期工作

import numpy as np
from mayavi import mlab
from tvtk.util import ctf
from matplotlib.pyplot import cm

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

volume = mlab.pipeline.volume(mlab.pipeline.scalar_field(s), vmin=0, vmax=0.8)
# save the existing colormap
c = ctf.save_ctfs(volume._volume_property)
# change it with the colors of the new colormap
# in this case 'plasma'
c['rgb']=cm.get_cmap('plasma')(values.copy())
# load the color transfer function to the volume
ctf.load_ctfs(c, volume._volume_property)
# signal for update
volume.update_ctf = True

mlab.show()

虽然like444之前的回答在一定程度上帮助了我解决了一个类似的问题,但它导致了颜色映射之间的错误转换。这是因为matplotlib和tvtk存储颜色信息的格式略有不同:matplotlib使用RGBA,而ColorTransferFunction使用VRGB,其中V是显示的数据中分配给这部分颜色贴图的值。所以通过一对一的复制,绿色变成红色,蓝色变成绿色,阿尔法变成蓝色。以下代码段修复了以下问题:

def cmap_to_ctf(cmap_name):
    values = list(np.linspace(0, 1, 256))
    cmap = cm.get_cmap(cmap_name)(values)
    transfer_function = ctf.ColorTransferFunction()
    for i, v in enumerate(values):
        transfer_function.add_rgb_point(v, cmap[i, 0], cmap[i, 1], cmap[i, 2])
    return transfer_function

在这里发现了一个类似的问题:据我所知,这似乎是一个bug。我在这里提交了一份bug报告: