2014-01-16 3 views
4

Я использую python и mayavi2 для 3D-графика. Я рисую сферу, используя команду mesh, и теперь я хочу покрасить некоторые из панелей сферы другим цветом. Кажется, что это вариант маски, но я не могу заставить его работать (я просто получаю всю окраску сферы).Как использовать маску для сетчатых участков майяви?

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. Что я делаю не так?

+0

Хм, это должно было быть сделано. Что произойдет, если все значения True или False? – M4rtini

ответ

3

Маскирующие работы на основе скаляров, а не когда вы установили сплошной цвет. Попробуйте это вместо:

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

Маскировка работает, устанавливая скаляр в 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).

Оказывается, что если у вас есть постоянный скаляр ВТК 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 

Обратите внимание, что массив цветов должен иметь как минимум 2 цвета и может иметь столько, сколько вам захочется. Для постоянного цвета 2 должно быть достаточно.

HTH.

+0

Спасибо за продолжение помощи, но у меня все еще есть проблемы. Я попробовал обновленный пример, и я все еще не вижу маскировки. Можете ли вы приложить изображение вывода, которое вы получите? Моя версия информация: MayaVi версия 4.0.0 - ВТК версия 5.6.0 Python 2.7.2 | EPD 7.1-2 WxPython 2.8.10.1 Я также не понимаю, что скаляров, вы можете объяснить или дайте мне ссылку? – David

+0

Я обновился до версии 4.3.0 - версия VTK 5.6.0 Python 2.7.3 | 64-бит | Qt 1.1.2, и он работает! Спасибо! – David

+0

Мне бы очень хотелось узнать, как работает параметр «скаляры». Когда я пытаюсь сделать это с помощью one_like (X), маскировка, кажется, выключена, и вся сфера становится синей. – David