2012-10-17 11 views
6

Próbuję opisać punkty narysowane za pomocą funkcji points3d() za pomocą mayavi.mlab. Każdy punkt jest powiązany z etykietą, którą chciałbym wydrukować obok punktów za pomocą funkcji text3d(). Kreślenia punktów jest szybka, jednak funkcja mlab.text3d() nie wydaje się akceptować tablice współrzędnych, więc mam do pętli na punkty i wykreślić tekst indywidualnie, co jest bardzo powolny:dodawanie adnotacji do wielu punktów z tekstem w mayavi przy użyciu mlab

 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) 

Wszelkie pomysły, jak mogę to przyspieszyć? Ponadto, czy możliwe jest dodanie legendy (jak na przykład w matplotlib), nie mogłem znaleźć niczego w dokumentach.

Dzięki,

Patrick

Odpowiedz

5

Sposób, w jaki to robią powyżej będzie renderować scenę za każdym razem wykreślić punkt lub tekst. To jest powolne. Można wyłączyć renderowania sceny, wykonaj wykreślanie i następnie renderować scenę przez figure.scene.disable_render = Prawda/Fałsz:

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 

używam tej sztuczki i innych w klasie rysunku w Morphic Viewer https://github.com/duanemalcolm/morphic/blob/master/morphic/viewer.py

Inną dobrą sztuczką w kodzie jest ponowne wykorzystanie istniejących obiektów, tj. Jeśli już został naniesiony tekst, nie należy ich replikować, wystarczy zaktualizować ich położenie i atrybuty tekstu. Oznacza to zapisanie obiektu mlab. Możesz zobaczyć, jak to robię w morfic.Viewer.

Powiązane problemy