2012-05-08 24 views
10

Chciałbym utworzyć działki na 4 osiach, najpierw trzy indywidualne wykresy na każdej osi, a ostatnie wszystkie 3 działki na ostatnich osiach. Oto kod:Jak ponownie wykorzystać działki w 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() 

Uzyskany obraz jest:
enter image description here
Czy istnieje sposób, aby określić działki, a następnie dodać je do osi, a następnie wykreślić je? Oto logika miałem na myśli:

#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] 

Teraz działka line1 na AX1, line2 na ax2, line3 na AX3 i Line4 na AX4.

+0

Ale co jest nie tak z ponownym wywoływaniem fabuły? Czy to powoduje pewien problem? – wim

+0

@wim nie powoduje żadnych problemów w tym przypadku. Ale zawsze jestem sceptycznie nastawiony do kodu, jeśli potrzebuję użyć wklejania. Albo gdybym chciał na przykład wysłać wykresy linii do jakiejś funkcji, która rozmieszcza wątki w jakiś sposób na różnych osiach. – enedene

+0

Zamiast tworzyć rysunek, a następnie dodawać podpunkty, możesz to zrobić w jednym wierszu: 'fix, ax = plt.subplots (2, 2)'. Wtedy "topór" to niezliczona tablica osi, więc możesz 'ax [0, 1] .plot (dane, dane ** 2/10, ls =' - ', kolor =' g ') ' – mmagnuski

Odpowiedz

5

Oto jedno możliwe rozwiązanie. Nie jestem pewien, czy to jest bardzo ładne, ale przynajmniej nie wymaga powielania kodu.

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

Myślę, że wykorzystywany jest w porządku, ale można przekazać wszystkich par danych x,y do plot tak (chociaż to sprawia, że ​​bardzo straszne, aby przeczytać!):

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

Zabawny inny sposób to zrobić to jest tak:

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

Zwykle robię w zły sposób, muszę być coraz lepszy. :) Ja przegłosowałem oba rozwiązania, wybór dla zaakceptowanej odpowiedzi był arbitralny. – enedene

0

miałem prostszy przypadek zastosowania w notebookach jupyter. Biorąc pod uwagę, że gdzieś przechowujesz obiekt liczbowy, w jaki sposób możesz go zastąpić. np

komórkowy 1:

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

komórkowy 2:

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

To wszystko. Zaletą tego jest to, że możesz przechowywać figury w obiektach, a później używać ich w razie potrzeby.

Powiązane problemy