2012-10-17 10 views
6

Ich versuche, Punkte mit der Funktion point3d() mit mayavi.mlab geplottet. Jeder Punkt ist mit einer Beschriftung verknüpft, die ich mit der text3d() - Funktion neben den Punkten darstellen möchte. Trägt man die Punkte ist schnell, aber die mlab.text3d() Funktion scheint nicht Arrays von Koordinaten zu akzeptieren, so dass ich über die Punkte Schleife und zeichnen den Text individuell, die sehr langsam ist:viele Punkte mit Text in mayavi kommentieren mit 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) 

Alle Ideen, wie ich das beschleunigen könnte? Ist es auch möglich, eine Legende hinzuzufügen (wie zum Beispiel in Matplotlib), konnte ich nichts in den Dokumenten finden.

Danke,

Patrick

Antwort

5

Die Art und Weise Sie es oben tun werden, wird die Szene jedes Mal, wenn Sie einen Punkt oder Text plotten machen. Das ist langsam. Sie können die Szene deaktivieren Rendering, tun das Plotten und dann rendern Sie die Szene durch figure.scene.disable_render = True/False:

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 

Ich benutze diesen Trick und andere in Abbildung Klasse in morphic-Viewer https://github.com/duanemalcolm/morphic/blob/master/morphic/viewer.py

Ein weiterer guter Trick im Code ist die Wiederverwendung vorhandener Objekte, dh wenn Sie den Text bereits geplottet haben, sollten Sie ihn nicht erneut plotten, sondern nur seine Position und Textattribute aktualisieren. Dies bedeutet, dass das mlab-Objekt gespeichert wird. Sie können sehen, wie ich das in morphic.Viewer mache.