2012-05-08 20 views
10

Mi piacerebbe realizzare grafici su 4 assi, i primi tre grafici individuali su ciascun asse e gli ultimi 3 grafici sugli ultimi assi. ecco il codice:Come riutilizzare i grafici in matplotlib?

from numpy import * 
from matplotlib.pyplot import * 
fig=figure() 
data=arange(0,10,0.01) 
ax1=fig.add_subplot(2,2,1) 
ax2=fig.add_subplot(2,2,2) 
ax3=fig.add_subplot(2,2,3) 
ax4=fig.add_subplot(2,2,4) 

line1=ax1.plot(data,data) 
line2=ax2.plot(data, data**2/10, ls='--', color='green') 
line3=ax3.plot(data, np.sin(data), color='red') 
#could I somehow use previous plots, instead recreating them all? 
line4=ax4.plot(data,data) 
line4=ax4.plot(data, data**2/10, ls='--', color='green') 
line4=ax4.plot(data, np.sin(data), color='red') 
show() 

L'immagine risultante è:
enter image description here
C'è un modo per definire trame e poi aggiungerli agli assi, e poi li trama? Ecco la logica che avevo in mente:

#this is just an example, implementation can be different 
line1=plot(data, data) 
line2=plot(data, data**2/10, ls='--', color='green') 
line3=plot(data, np.sin(data), color='red') 
line4=[line1, line2, line3] 

Ora trama Linea1 sulla ax1, line2 su AX2, line3 su ax3 e line4 su AX4.

+0

Ma cosa c'è di sbagliato nel chiamare di nuovo la trama? Ciò sta causando qualche problema? – wim

+0

@wim non sta causando alcun problema in questo caso. Ma sono sempre scettico riguardo al codice se ho bisogno di usare copia incolla. O se volevo ad esempio inviare un plot di linee ad una funzione che organizza i grafici in qualche modo su diversi assi. – enedene

+0

Invece di creare figure, e quindi aggiungere sottotrame, è possibile farlo in una riga: 'fix, ax = plt.subplots (2, 2)'. Quindi 'ax' è una matrice numerica di assi in modo da poter' ax [0, 1] .plot (dati, dati ** 2/10, ls = '-', color = 'g') ' – mmagnuski

risposta

5

Ecco una possibile soluzione. Non sono sicuro che sia molto carina, ma almeno non richiede la duplicazione del codice.

import numpy as np, copy 
import matplotlib.pyplot as plt, matplotlib.lines as ml 

fig=plt.figure(1) 
data=np.arange(0,10,0.01) 
ax1=fig.add_subplot(2,2,1) 
ax2=fig.add_subplot(2,2,2) 
ax3=fig.add_subplot(2,2,3) 
ax4=fig.add_subplot(2,2,4) 

#create the lines 
line1=ml.Line2D(data,data) 
line2=ml.Line2D(data,data**2/10,ls='--',color='green') 
line3=ml.Line2D(data,np.sin(data),color='red') 
#add the copies of the lines to the first 3 panels 
ax1.add_line(copy.copy(line1)) 
ax2.add_line(copy.copy(line2)) 
ax3.add_line(copy.copy(line3)) 

[ax4.add_line(_l) for _l in [line1,line2,line3]] # add 3 lines to the 4th panel 

[_a.autoscale() for _a in [ax1,ax2,ax3,ax4]] # autoscale if needed 
plt.draw() 
1

Penso che l'uso è bene, ma si può passare tutte le coppie di dati x,y a plot come questo (anche se rende molto orribile a leggere!):

ax4.plot(data, data, data, data**2/10, data, np.sin(data)) 

Un modo diverso divertente da fare è così:

graph_data = [(data, data), (data, data**2/10), (data, np.sin(data))] 
[ax4.plot(i,j) for i,j in graph_data] 
+0

Io di solito faccio le cose nel modo sbagliato, devo stare meglio. :) Ho svalutato entrambe le soluzioni, la selezione per la risposta accettata era arbitraria. – enedene

0

Ho avuto un caso di utilizzo più semplice nei notebook jupyter. Dato che hai memorizzato un oggetto figura da qualche parte, come puoi rimpiazzarlo. es:

cellulare 1:

f = plt.figure(figsize=(18, 6)) 
f.suptitle("Hierarchical Clustring", fontsize=20) 
dendrogram(Z, color_threshold=cut_off, 
      truncate_mode='lastp', 
      p=20) 

cellulare 2:

#plot f again, the answer is really simple 
f 
plt.show() 

Questo è tutto. Il vantaggio di questo è che è possibile memorizzare le figure negli oggetti e poi utilizzarli quando necessario.

Problemi correlati