2011-08-18 6 views
15

Quindi in un figure dove sono state aggiunte tre sottotrame verticali con add_subplot, come posso selezionare diciamo quello centrale?Come posso selezionare una sottotrama specifica in Matplotlib?

In questo momento mi fanno questa lista di comprensione:

[r[0] for r in sorted([[ax, ax.get_geometry()[2]] for ax in self.figure.get_axes()], key=itemgetter(1))]

dove posso semplicemente selezionare l'indice che voglio, con il corrispondente axes. C'è un modo più semplice per farlo?

risposta

14

Dal matplotlib documentation:

Se la cifra ha già una sottotrama con chiave (args, kwargs) allora sarà semplicemente rendere corrente che sottotrama e restituirlo.

Ecco un esempio:

import matplotlib.pyplot as plt 

fig = plt.figure() 
for vplot in [1,2,3]: 
    ax = fig.add_subplot(3,1,vplot) 
    ax.plot(range(10),range(10)) 

ax_again = fig.add_subplot(3,1,2) 
ax_again.annotate("The middle one",xy=(7,5),xytext=(7,5)) 

plt.show() 

La trama centrale è di nuovo chiamato in modo che possa essere annotato.

Cosa succede se si imposta lo sfondo con la mia chiamata originale, devo impostarlo nuovamente quando ottengo la sottotrama la seconda volta?

Sì. Gli argomenti e le parole chiave per la chiamata originale vengono utilizzati per creare un identificativo univoco. Quindi, affinché la figura possa generare nuovamente questo identificatore univoco, è necessario passare di nuovo gli stessi argomenti (definizione della griglia, posizione) e parole chiave. Per esempio:

import matplotlib.pyplot as plt 

fig = plt.figure() 
ax = fig.add_subplot(2,1,1,axisbg='red') 
ax.plot(range(10),range(10)) 
ax = fig.add_subplot(2,1,2) 
ax.plot(range(10),range(10)) 

ax_again = fig.add_subplot(2,1,1,axisbg='red') 
ax_again.annotate("The top one",xy=(7,5),xytext=(7,5)) 

plt.show() 

Che cosa succede se io usoax_again.change_geometry()?

Si potrebbe pensare a change_geometry, ad es. da un 312 a un 422, cambierebbe il modo in cui si utilizza add_subplot, ma non lo fa. Sembra che ci sia un bug o un comportamento indefinito quando chiami change_geometry. La chiave univoca generata originariamente utilizzando gli argomenti e le parole chiave, alla prima chiamata add_subplot, non viene aggiornata. Pertanto, se si desidera ripristinare un asse con una chiamata add_subplot, è necessario chiamare add_subplot con gli argomenti e le parole chiave originali. Per maggiori informazioni, seguire questo rapporto problema: https://github.com/matplotlib/matplotlib/issues/429

mia ipotesi per ora è che se si modifica qualsiasi proprietà della sottotrama dopo aver generato con chiamata add_subplot, l'unica non verrà regolata. Quindi, basta usare gli argomenti e le parole chiave originali, e speriamo che funzionerà.

+3

Uomo Ho passato ore a passare quei documenti, ma sono comunque riuscito a trascurare quella parte vitale. Grazie – c00kiemonster

+1

Vorrei aver capito matplotlib dentro e fuori. Farà sicuramente del mio lavoro più facile. Mi ci è voluto un po 'di tempo, e non è affatto facile scoprire questi dettagli dai documenti. Sto provando a vedere se si passano i kwarg nella chiamata iniziale, bisogna passarli esattamente allo stesso modo la seconda volta, come suggeriscono i documenti. Aggiornerò le cose se mi viene in mente qualcosa. – Yann

+1

Quindi risulta che la classe figure ha una funzione membro privata _make_key che '(crea) una chiave hastable con args e kwargs'; questo è usato per identificare la sottotrama (e suppongo che tutti gli assi appartengano a una figura). Quindi sì, è necessario utilizzare esattamente gli stessi argomenti e parole chiave. – Yann