gpt4 book ai didi

python - 如何为 Mayavi 的网格图使用掩码?

转载 作者:太空宇宙 更新时间:2023-11-03 11:05:15 25 4
gpt4 key购买 nike

我正在使用 python 和 mayavi2 进行 3D 绘图。我正在使用 mesh 命令绘制一个球体,现在我想为球体的某些面板着色不同的颜色。看起来这就是 mask 选项的用途,但我无法让它工作(我只是让整个球体重新着色)。

http://docs.enthought.com/mayavi/mayavi/auto/mlab_helper_functions.html#mayavi.mlab.mesh“掩码: bool 掩码数组,用于抑制某些数据点”

我使用:

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 一样。我做错了什么?

最佳答案

mask 基于标量起作用,而不是在您设置纯色时起作用。试试这个:

import numpy as np
m = mesh(X,Y,Z, mask=active_region, opacity=0.5)
m.mlab_source = ones_like(X)

掩码通过将标量设置为被掩码的 Nan 来工作。绘制的几何图形相同,但如果标量是 Nan 的,则不会显示 mask 区域。

无论如何,这里有一个完整的工作示例供您引用:

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)

请注意,您不需要提供标量,只是如果您提供明确的颜色,则不会有 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 编辑器和所有这些麻烦事,这里有一个您可以直接从 Python 执行的纯 numpy 版本。

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.

关于python - 如何为 Mayavi 的网格图使用掩码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21175323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com