2012-10-17 5 views
6

Sto provando ad annotare i punti tracciati con la funzione points3d() usando mayavi.mlab. Ogni punto è associato a un'etichetta che vorrei tracciare vicino ai punti usando la funzione text3d(). Tracciare i punti è veloce, tuttavia la funzione mlab.text3d() non sembrano accettare array di coordinate, quindi devo ciclo sopra i punti e tracciare il testo individuale, che è molto lento:annotando molti punti con testo in mayavi usando 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) 

Qualsiasi idee su come potrei accelerare? Inoltre, è possibile aggiungere una legenda (come ad esempio in matplotlib), non ho trovato nulla nei documenti.

Grazie,

Patrick

risposta

5

Il modo in cui si sta facendo sopra renderà la scena ogni volta che si stampa un punto o un testo. Questo è lento. È possibile disattivare il rendering della scena, fare il tracciato e quindi rendere la scena 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 

Io uso questo trucco e altri in classe Figura in morphic Viewer https://github.com/duanemalcolm/morphic/blob/master/morphic/viewer.py

Un altro buon trucco nel codice è riutilizzare gli oggetti esistenti, cioè, se hai già tracciato il testo, non sostituirli, basta aggiornare la loro posizione e gli attributi del testo. Questo significa salvare l'oggetto mlab. Puoi vedere come lo faccio in morphic.Viewer.