2013-02-13 11 views
5

Sto cercando di aggiornare alcune trame che ho all'interno di una GUI ogni volta che passo una volta attraverso una procedura di adattamento. Inoltre, questi grafici si trovano all'interno di un framw che può essere ridimensionato, quindi gli assi e le etichette ecc. Devono essere ridisegnati dopo il ridimensionamento. Quindi mi chiedevo se qualcuno sapeva come aggiornare i lati di una figura usando qualcosa come plot.figure.canvas.copy_from_bbox e blit. Questo sembra solo copiare e fondere lo sfondo dell'area grafica (dove vengono disegnate le linee) e non ai lati del grafico o della figura (dove sono le etichette e le zecche). Ho cercato di aggiornare i miei grafici per tentativi ed errori leggendo la documentazione di mpl, ma finora il mio codice è diventato terribilmente complesso con cose come self.this_plot.canvas_of_plot..etc.etc.. .plot.figure.canvas.copy_from_bbox ... che è probabilmente troppo complicato. So che il mio linguaggio potrebbe essere un po 'scadente, ma ho cercato di leggere la documentazione di matplotlb e le differenze tra Figura, tela, grafico, trama, figura.Figure, ecc. Stanno iniziando a sfuggirmi. Quindi la mia prima e principale domanda sarebbe:python matplotlib blit agli assi o ai lati della figura?

1 - Come si aggiornano le zecche e le etichette attorno a un grafico matplotlib.

e in secondo luogo, dal momento che mi piacerebbe avere una migliore comprensione di ciò che la risposta a questa domanda,

2 - Qual è la differenza tra una trama, figura, tela, ecc per quanto riguarda il area che coprono nella GUI.

Grazie mille per l'aiuto.

risposta

14

Tutto ciò può certamente essere piuttosto confuso in un primo momento!

Per cominciare, se stai incatenando le zecche, ecc., Non c'è molto senso nell'usare il blitting. Blitting è solo un modo per evitare di ridisegnare tutto se solo alcune cose stanno cambiando. Se tutto sta cambiando, non ha senso usare il blitting. Basta ri-disegnare la trama.

In sostanza, si vuole solo fig.canvas.draw() o plt.draw()

In ogni caso, per rispondere alla tua prima domanda, nella maggior parte dei casi non sarà necessario aggiornare manualmente. Se cambi i limiti degli assi, si aggiorneranno da soli. Si sta eseguendo in problemi perché si sta appena copiarlo sul video all'interno degli assi, invece di ridisegnare la trama.

Per quanto riguarda la seconda domanda, una buona panoramica dettagliata è il Artist Tutorial dello Matplotlib User's Guide.

In breve, ci sono due livelli separati. Uno si occupa di raggruppare le cose nelle parti che ti preoccupare quando la stampa (per esempio la figura, assi, asse, linee, ecc) e un altro che si occupa di rendering e disegno in generale (la tela e renderer).

Tutto ciò che si può vedere in una trama matplotlib è un Artist. (Il testo ad esempio una linea, gli assi, e anche la figura stessa.) Un artista a) sa come disegnare se stesso, e b) può contenere altri artisti.

Per un artista che disegna se stesso, utilizza il renderer (un modulo specifico del back-end che non si tocca quasi mai direttamente) per disegnare su un "canvas" FigureCanvas o un'astrazione attorno a una pagina vettoriale o un buffer di pixel). Per disegnare tutto in una figura, chiami canvas.draw().

Perché gli artisti possono essere gruppi di altri artisti, c'è una gerarchia alle cose.In sostanza, qualcosa di simile (ovviamente, questo varia):

Figure 
    Axes (0-many) (An axes is basically a plot) 
     Axis (usually two) (x-axis and y-axis) 
      ticks 
      ticklabels 
      axis label 
     background patch 
     title, if present 
     anything you've plotted, e.g. Line2D's 

Speriamo che rende le cose un tocco più chiaro, in ogni caso.

Se si desidera utilizzare il blitting per aggiornare le etichette dei segni di graduazione, ecc., È necessario acquisire e ripristinare l'intera area, compresi gli stessi. Questa regione è un po 'difficile da ottenere, perché non è esattamente conosciuta fino al dopo il tempo di disegno (il rendering del testo in matplotlib è più complicato rispetto al rendering di altre cose a causa del supporto in lattice, ecc.). Puoi farlo, e sarò lieto di fare un esempio se è davvero quello che vuoi, ma in genere non produrrà un vantaggio di velocità semplicemente disegnando tutto. (L'eccezione è se si sta aggiornando solo una sottotrama in una figura con molte sottotrame.)

+4

Grazie mille per questo meraviglioso riassunto degli elementi matplotlib. So che questo sarà utile per me e molti altri sul web come riferimento per comprendere la struttura generale del modulo. – chase

+0

Questo è eccellente. Ho cercato per 2 anni un buon riassunto di come dovrebbero comparire le classi Fig/Axes/Axis! – tbc

Problemi correlati