2017-11-01 14 views
1

Mayaviのドキュメント "http://docs.enthought.com/mayavi/mayavi/building_applications.html"を読んで本当に混乱します。Mayaviを使ってインタラクティブに3Dプロットを行う簡単な方法は?

私は、スライダーをドラッグしてプロットの内容を変更するなど、ユーザーとのやりとりを許可する3Dプロットが必要な場合は、には、特性を使用するがありますか?私が何であるかの特性を知らない

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は、実際にはインタラクティブな図を簡単に取得するための非常にきちんとした方法です。そこで質問の例では、ここで注目すべき素晴らしい事は、あなたが実際に(つまり何もon_slider_changeまたは類似はありません)、明示的なコールバックを定義していないということです

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() 

enter image description here

ようになります。

関連する問題