2012-05-08 16 views
10

Me gustaría hacer gráficos en 4 ejes, los primeros tres trazados individuales en cada eje, y los últimos 3 trazados en los últimos ejes. Aquí está el código:¿Cómo reutilizo las parcelas en 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() 

La imagen resultante es:
enter image description here
¿Hay una manera de definir parcelas primero y luego añadirlos a los ejes, y luego trazar ellos? Esta es la lógica que tenía en 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] 

Ahora línea 1 parcela sobre la AX1, línea 2 en ax2, línea 3 en ax3 y line4 en AX4.

+0

¿Pero qué pasa con llamar a la trama de nuevo? ¿Eso está causando algún problema? – wim

+0

@wim no está causando ningún problema en este caso. Pero siempre soy escéptico sobre el código si necesito usar copy paste. O si quisiera, por ejemplo, enviar un trazo de líneas a alguna función que arregle las tramas de alguna manera en diferentes ejes. – enedene

+0

En lugar de crear una figura y luego agregar subtramas, puede hacer esto en una línea: 'fix, ax = plt.subplots (2, 2)'. Entonces 'ax' es una matriz numpy de ejes para que pueda' ax [0, 1] .plot (datos, datos ** 2/10, ls = '-', color = 'g') ' – mmagnuski

Respuesta

5

Aquí hay una posible solución. No estoy seguro de que sea muy bonito, pero al menos no requiere duplicación de código.

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

Creo que su uso está muy bien, pero se puede pasar todas las parejas de datos x,y a plot como esto (aunque lo hace muy horrible para leer!):

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

Una manera divertida diferente para hacer es así:

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

Normalmente lo hago cosas de la manera incorrecta, debo estar mejorando. :) Subí ambas soluciones, la selección para la respuesta aceptada fue arbitraria. – enedene

0

Tenía un caso de uso más simple en los portátiles jupyter. Dado que ha almacenado un objeto figura en alguna parte, ¿cómo puede volver a copiarlo? por ejemplo:

Cell 1:

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

Cell 2:

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

Eso es todo. El beneficio de esto es que puedes almacenar figuras en objetos y luego usarlos cuando sea necesario.

Cuestiones relacionadas