2012-10-17 10 views
6

mayavi.mlabを使用してpoints3d()関数でプロットした点に注釈を付そうとしています。 各ポイントは、text3d()関数を使用してポイントの隣にプロットしたいラベルに関連付けられています。ポイントをプロットすることは速いです、しかしmlab.text3d()関数は、座標の配列を受け入れていないようですので、私はポイントをループに持っていると非常に低速である、個別のテキストをプロットしますmlabを使用してmayaviのテキストで多くの点に注釈を付ける

 for i in xrange(0, self.n_labels): 
      self.mlab_data.append(
       mlab.points3d(pX[self.labels == self.u_labels[i], 0], 
           pX[self.labels == self.u_labels[i], 1], 
           pX[self.labels == self.u_labels[i], 2], 
           color=self.colours[i], 
           opacity=1, 
           scale_mode="none", 
           scale_factor=sf)) 

      idcs, = np.where(self.labels == self.u_labels[i]) 
      for n in idcs.flatten(): 
       mlab.text3d(pX[n, 0], 
          pX[n, 1], 
          pX[n, 2], 
          "%d" % self.u_labels[i], 
          color=self.colours[i], 
          opacity=1, 
          scale=sf) 

どれでもどのように私はこれをスピードアップできるアイデア?また、凡例を追加することは可能ですか(例えばmatplotlibなど)、ドキュメント内に何も見つかりませんでした。

おかげで、

パトリック

答えて

5

あなたがシーンにあなたがポイントまたはテキストを描画するたびにレンダリングされます上記のそれをやっている方法。これは遅いです。あなたは、シーンがレンダリング無効にプロットを行い、その後、figure.scene.disable_renderでシーンをレンダリングすることができます=真/偽

import scipy 
    from mayavi import mlab 

    X = 100 * scipy.rand(100, 3) 
    figure = mlab.figure('myfig') 
    figure.scene.disable_render = True # Super duper trick 
    mlab.points3d(X[:,0], X[:,1], X[:,2], scale_factor=0.4) 
    for i, x in enumerate(X): 
     mlab.text3d(x[0], x[1], x[2], str(i), scale=(2, 2, 2)) 
    figure.scene.disable_render = False # Super duper trick 

私はmorphicの図のクラスでこのトリックなどを使用するビューアhttps://github.com/duanemalcolm/morphic/blob/master/morphic/viewer.py

既存のオブジェクトを再利用するもう1つの方法は、既存のオブジェクトを再利用することです。つまり、テキストを既にプロットしている場合は、再配置しないで、位置とテキストの属性を更新するだけです。これは、mlabオブジェクトを保存することを意味します。私はこれをmorphic.Viewerでどうやって見ることができます。

関連する問題