Python 如何为Mayavi'使用面膜;什么是网格图?
我正在使用python和mayavi2进行3D绘图。我正在使用mesh命令绘制一个球体,现在我想给球体的一些面板涂上不同的颜色。看起来这就是遮罩选项的用途,但我无法让它工作(我只是让整个球体重新着色) “掩码:用于抑制某些数据点的布尔掩码数组” 我使用:Python 如何为Mayavi'使用面膜;什么是网格图?,python,3d,plot,enthought,mayavi,Python,3d,Plot,Enthought,Mayavi,我正在使用python和mayavi2进行3D绘图。我正在使用mesh命令绘制一个球体,现在我想给球体的一些面板涂上不同的颜色。看起来这就是遮罩选项的用途,但我无法让它工作(我只是让整个球体重新着色) “掩码:用于抑制某些数据点的布尔掩码数组” 我使用: 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)
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]]
但这会形成一个完全紫色的球体。十、 Y和Z都是形状为(7,7)的阵列,就像活动_区域一样。我做错了什么?掩蔽基于标量工作,而不是在设置纯色时。请尝试以下方法:
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
,您可以使用任何兼容的数组,甚至可以通过像(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
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'
否则,请使用scalar=z
并设置恒定颜色查找表。您可以通过单击管道编辑器上的“颜色和图例”,然后单击“启动lut编辑器”来创建自己的。要使用此自定义颜色贴图,请执行以下操作:
m = mlab.mesh(x, y, z, scalars=scalars, mask=mask)
m.module_manager.scalar_lut_manager.lut.nan_color = 0, 0, 0, 0
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编辑器和所有的马勒克语言,这里有一个纯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
请注意,颜色数组应该至少有2种颜色,并且可以有任意数量的颜色。对于恒定的颜色,2应该足够了
嗯。嗯,应该可以了。如果所有的值都为真或假,会发生什么?谢谢你的持续帮助,但我仍然有问题。我尝试了更新的示例,但仍然没有看到任何掩蔽。你能附上你得到的输出的图片吗?我的版本信息:Mayavi版本4.0.0-VTK版本5.6.0 Python 2.7.2 | EPD 7.1-2 wxPython 2.8.10.1我也不明白什么是标量,你能解释一下或给我一个参考吗?我更新到版本4.3.0-VTK版本5.6.0 Python 2.7.3 | 64位| Qt 1.1.2,它可以工作!谢谢我仍然非常想知道“scalars”参数是如何工作的。当我尝试使用像(X)这样的东西时,遮罩似乎被关闭了,整个球体仍然变成蓝色。是的,除了使用标量=z,就像你所做的,或者标量=X或y,我无法使用遮罩。所以到目前为止,我的假设是,它必须是前三个变量之一,这对我要做的事情确实不起作用。我需要一种自己设置颜色的方法。你是对的,在这方面似乎存在VTK错误,所以常量标量似乎不起作用。如果您有可用的VTK-5.10,则可以解决此问题,但您似乎没有。“标量”是与数据上的每个点关联的标量属性,通过查阅表格,数据显示为颜色。遮罩的工作原理是将所有的“Nan”值转换为透明的颜色,而在某种程度上,由于颜色不变,VTK似乎无法使其透明。您可以选择创建一个具有恒定颜色的lut文件并使用它。