【问题标题】:How to use mask for Mayavi's grid plots?如何为 Mayavi 的网格图使用掩码?
【发布时间】:2014-01-16 23:50:34
【问题描述】:

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

http://docs.enthought.com/mayavi/mayavi/auto/mlab_helper_functions.html#mayavi.mlab.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) 

将某些部分染成紫色,其中

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

【问题讨论】:

  • 嗯,应该这样做。如果所有值都是 True 或 False,会发生什么?

标签: python 3d plot enthought mayavi


【解决方案1】:

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

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 编辑器和所有这些问题,这里有一个纯 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 就足够了。

HTH。

【讨论】:

  • 感谢您一直以来的帮助,但我仍然遇到问题。我尝试了更新的示例,但仍然看不到任何掩蔽。你能附上你得到的输出的图片吗?我的版本信息: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,它的工作原理!谢谢!
  • 我仍然非常想知道“标量”参数是如何工作的。当我用 ones_like(X) 尝试时,掩蔽似乎已关闭,整个球体仍变为蓝色。
  • 是的,我不能让它与掩码一起使用,除非像你一样使用 scalars=z,或者 scalars = x 或 y。所以到目前为止我的假设是它必须是前三个变量之一,这对于我想要做的事情真的不起作用。我需要一种自己设置颜色的方法。
  • 你是对的,在这方面似乎存在一个 VTK 错误,因此恒定标量似乎不起作用。如果您有可用的 VTK-5.10,那么您可以解决此问题,但似乎您没有。 “标量”是与数据上每个点相关联的标量属性,数据通过查找表显示为颜色。遮罩通过将所有“Nan”值转换为透明颜色来工作,并且以某种方式使用恒定颜色,VTK 似乎无法使其透明。您的一个选择是创建一个具有恒定颜色的 lut 文件并使用它。
猜你喜欢
  • 2016-03-19
  • 1970-01-01
  • 2019-07-18
  • 2022-06-13
  • 2019-08-21
  • 1970-01-01
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多