我正在使用python和mayavi2进行3D绘图。我正在使用网格命令绘制球体,现在我想为球体的一些面板着色不同的颜色。看起来这就是面具选项的用途,但我不能让它起作用(我只是让整个球体重新着色)。
http://docs.enthought.com/mayavi/mayavi/auto/mlab_helper_functions.html#mayavi.mlab.mesh “mask:boolean mask array to suppress some data points”
我用:
mesh(X,Y,Z, color = (1,1,1), opacity=0.5)
将整个球体着色为白色,然后
mesh(X,Y,Z, color = (1,0,1), mask = active_region, opacity=0.5)
将某些部分涂成紫色,其中
active_region = [[False False False False False False True]
[False False False False False False True]
[False False False False False True True]
[False False False True True True True]
[False False True True True True True]
[False False False True True True True]
[False False False False False False True]]
但这导致完全紫色的球体。 X,Y和Z都是具有形状(7,7)的数组,就像active_region一样。我做错了什么?
答案 0 :(得分:3)
遮罩基于标量,而不是在设置纯色时。试试这个:
import numpy as np
m = mesh(X,Y,Z, mask=active_region, opacity=0.5)
m.mlab_source = ones_like(X)
通过将标量设置为屏蔽的Nan来进行屏蔽。绘制的几何图形相同,但如果标量为Nan,则不显示蒙版区域。
无论如何,这里有一个完整的工作示例供您参考:
import numpy as np
phi, theta = np.mgrid[0:np.pi:100j, 0:2 * np.pi:100j]
x = np.sin(phi) * np.cos(theta)
y = np.sin(phi) * np.sin(theta)
z = np.cos(phi)
mask = np.zeros_like(x).astype(bool)
mask[::5] = True
mask[:,::5] = True
from mayavi import mlab
mlab.mesh(x, y, z, scalars=z, mask=mask)
请注意,您不需要提供标量,只是如果您提供明确的颜色,则不会有屏蔽。此处的标量也只是设置为z
,您可以使用任何兼容的数组,即使是ones_like(X)
的常量值。
事实证明,如果你有一个恒定的标量VTK 5.6似乎没有正确掩盖你的分数,如果你有VTK 5.10你可以做到以下几点:
m = mlab.mesh(x, y, z, scalars=scalars, mask=mask)
m.module_manager.scalar_lut_manager.lut.nan_color = 0, 0, 0, 0
否则,使用scalar=z
并设置一个恒定的颜色查找表。您可以通过单击管道编辑器上的“颜色和图例”来创建自己的,然后单击“启动lut编辑器”。要使用此自定义颜色映射,请执行以下操作:
scalars = np.ones_like(x)
m = mlab.mesh(x, y, z, scalars=scalars, mask=mask)
m.module_manager.scalar_lut_manager.lut_mode = 'file'
m.module_manager.scalar_lut_manager.file_name = '/path/to/your.lut'
如果你不想搞乱LUT编辑器和所有malarky,这里有一个纯粹的numpy版本,你可以直接从Python。
m = mlab.mesh(x, y, z, scalars=z, mask=mask)
# Lets make some colors:
# this is an array of (R, G, B, A) values (each in range 0-255), there should
# be at least 2 colors in the array.
colors = np.zeros((2, 4), dtype='uint8')
# Set the green value to constant.
colors[:,1] = 255
# the alpha value to fully opaque.
colors[:,3] = 255
# Now use this colormap.
m.module_manager.scalar_lut_manager.lut.table = colors
请注意,colors数组应至少包含2种颜色,并且可以包含任意数量的颜色。对于恒定的颜色2应该足够了。
HTH。