2014-01-16 2 views
4

저는 3D 플롯팅을 위해 파이썬과 mayavi2를 사용하고 있습니다. mesh 명령을 사용하여 구를 플로팅하고 있는데, 이제 구의 패널 중 일부를 다른 색으로 채색하고 싶습니다. 이것이 마스크 옵션이있는 것처럼 보이지만 작동하도록 설정할 수는 없습니다 (전체 구가 다시 채워지 게됩니다).Mayavi의 그리드 플롯에 마스크를 사용하는 방법은 무엇입니까?

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는 모두 active_region처럼 shape (7,7)을 갖는 배열입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

음, 그렇게해야합니다. 모든 값이 참이거나 거짓이면 어떻게됩니까? – M4rtini

답변

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)을 통한 상수 값을 사용할 수도 있습니다. 그렇지 않으면, scalar=z 및 설정 a를 사용

m = mlab.mesh(x, y, z, scalars=scalars, mask=mask) 
m.module_manager.scalar_lut_manager.lut.nan_color = 0, 0, 0, 0 

:

는 일정한 스칼라가있는 경우 VTK 5.6 당신이 VTK 5.10이있는 경우 다음과 같은 작업을 수행 할 수 있습니다, 제대로 포인트를 마스크하지 않는 것 같습니다 것을 밝혀 일정한 색상 룩업 테이블. 파이프 라인 편집기에서 "색상 및 범례"를 클릭 한 다음 "launch lut editor"를 클릭하여 직접 만들 수 있습니다. 이 사용자 정의 색상 맵을 사용하려면 다음을 수행하십시오

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와 버전입니다.

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.

+0

지속적인 도움을 주셔서 감사합니다. 그러나 저는 여전히 문제가 있습니다. 업데이트 된 예제를 시도했지만 여전히 마스킹이 표시되지 않습니다. 받은 사진을 첨부 할 수 있습니까? 내 버전 정보 : Mayavi 버전 4.0.0 - VTK 버전 5.6.0 파이썬 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

필자는 여전히 '스칼라'매개 변수가 어떻게 작동하는지 알고 싶습니다. ones_like (X)로 시도하면 마스킹이 해제 된 것처럼 보이고 전체 구가 파란색으로 변합니다. – David

관련 문제