2017-11-01 1 views
1

Mayavi의 설명서 "http://docs.enthought.com/mayavi/mayavi/building_applications.html"을 읽는 것은 나를 혼란스럽게 만듭니다.Mayavi를 사용하여 대화식으로 3D 플롯을 수행하는 간단한 방법은 무엇입니까?

사용자 상호 작용을 허용하는 3 차원 플롯을 원한다면 (예 : 슬라이더를 드래그하고 플롯의 내용을 변경하는 경우) 의 특성을 사용하는 것이 맞습니까? 설명서에 따르면 표준 절차는 다음과 같습니다.

class visual(HasTraits): 
    scene = ... 
    view = View(...) 
    @on_trait_change(...) 
    def do_something() 
     ... 

어떤 특징이 있는지 모르겠습니다. 나는 생성자 밖에서 정의 된 클래스의 속성 ('특성')이 무엇인지 이해하지 못합니다.

원래 질문으로 돌아가서, 변경 가능한 3D 플롯을 원한다면 왜 직접하지 않습니까? 난 상관하지 않는 경우

import numpy as np 
from mayavi import mlab 
from matplotlib import pyplot as plt 
from matplotlib.widgets import Slider 


def slider_changed(val): 
    s.mlab_source.scalars = np.asarray(x * (val + 1), 'd') 

# mayavi 3d plot 
x, y = np.mgrid[0:3:1,0:3:1] 
s = mlab.surf(x, y, np.asarray(x*0.1, 'd')) 

# a matplotlib slider 
plt.figure() 
ax = plt.subplot(1, 1, 1) 
slider = Slider(ax, valmin=0., valmax=1., label='test') 
slider.on_changed(slider_changed) 

plt.show() 
mlab.show() 

에 대한 애플리케이션에서 3D 플롯을 내장 나에게 보인다이 그것을 할 수있는 더 간단한 방법은, 다음과 같이 작업 예는? 3d 플롯의 많은 특성은 mlab_source의 속성을 통해 조작 할 수 있습니다. 여기 matplotlib 슬라이더를 예제로 사용하고 있지만, pyqt UI 또는 다른 것일 수 있습니다.

그러나, 문서는 파이프 라인 및 파이프 라인 개체의

모든 다른 속성이, 형질 그들이가 수정되었을 경우, 대화 상자 및 화재 콜백으로 시각화 할 수 있습니다 즉 특별한 속성을 표현했다. 특히 이것은 시각화 개체가 수정 될 때 장면이 자동으로 업데이트 될 수 있음을 의미합니다.

자동으로 업데이트되는 것을 원한다면 위의 설명과 같은 방식으로 특성을 사용해야합니까?

+0

이 질문이 무엇을 목표로하는지 잘 모르겠습니다. 업데이트를 구현 한 방식에 만족하면 확실하게 사용할 수 있습니다. – ImportanceOfBeingErnest

+0

나는 혼란스러워서 무엇을 물어볼 지 확신하지 못했습니다. 지금 편집되었습니다. 문제는 내가 특성을 사용해야한다는 것입니다. 이 문서에서, QT 애플리케이션에 mayavi를 임베드하는 방법은 먼저 'HasTraits'에 그것을 포함시킨 다음 QT에 임베드하는 것입니다. qt (또는 matplotlib 또는 다른 UI)에 직접 들어가는 것은 어떨까요? – Alex

답변

1

아마도 특성을 이해하는 데 좋은 시작은 this article 일 것입니다. 우리가 여기서 말하는 그 특성은 developped by Enthough입니다. 그것은 mayavi를 사용하는 것과 관련이없는 것과는 완전히 다른 특성/개념 (특성)이 있다는 사실에 주목할 가치가 있습니다.


나는 오른쪽 특성을 사용할 필요가 없습니다?

당신 s.mlab_source.scalars = np.asarray(x * (val + 1), 'd')를 호출 할 때 특성을 사용하여 있습니다. Mayavi가 기본 데이터를 변경하기 때문에 음모를 간단히 업데이트한다는 사실은 Traits이 사용 된 결과입니다.

Mayavi는 일반적인 개체 대신 단순히 특성을 사용합니다. 그래서 일단 당신이 mayavi를 사용하면 필연적으로 특성을 사용합니다.

내가 자동으로 업데이트되는 것을 원한다면 위에 설명 된 방식으로 특성을 사용해야합니까?

아니요, 직접 카운터 예를 들었습니다. 플롯을 업데이트하기 위해 서브 클래스 HasTraits을 사용할 필요는 없습니다. 당신은 당신이 생각할 수있는 다른 해결책을 사용할 수 있습니다. 그러나 일단 GUI로 Mayavi 씬을 삽입하고 싶다면 문서에서 언급 한 방법대로 수행하는 것이 좋습니다.

또한 서브 클래 싱 HasTraits은 실제로 대화 형 그림을 쉽게 얻을 수있는 매우 청초한 방법입니다. 그래서 질문의 예는

enter image description here

여기에서 주목해야 할 좋은 것은

import numpy as np 
from mayavi import mlab 

from traits.api import HasTraits, Range, Instance,on_trait_change 
from traitsui.api import View, Item, Group 
from mayavi.core.ui.api import MayaviScene, SceneEditor, MlabSceneModel 

x, y = np.mgrid[0:3:1,0:3:1] 

class MyModel(HasTraits): 
    slider = Range(-5., 5., 0.5,)  
    scene = Instance(MlabSceneModel,()) 

    def __init__(self): 
     HasTraits.__init__(self) 
     self.s = mlab.surf(x, y, np.asarray(x*1.5, 'd'), figure=self.scene.mayavi_scene) 

    @on_trait_change('slider') 
    def slider_changed(self): 
     self.s.mlab_source.scalars = np.asarray(x * (self.slider + 1), 'd') 

    view = View(Item('scene', editor=SceneEditor(scene_class=MayaviScene)), 
       Group("slider")) 

my_model = MyModel() 
my_model.configure_traits() 

같은 것은 (즉, 더 on_slider_change 또는 유사한 없음) 당신이 실제로 명시 적 콜백을 정의하지 않는다는 것입니다 볼 수 있었다.

관련 문제