2012-05-08 14 views
10

मैं 4 अक्षों पर भूखंड बनाना चाहता हूं, प्रत्येक अक्ष पर पहले तीन व्यक्तिगत साजिश, और अंतिम अक्षों पर अंतिम 3 प्लॉट बनाना चाहता हूं।मैं 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() 

जिसके परिणामस्वरूप तस्वीर है:
enter image description here
वहाँ पहले भूखंडों को परिभाषित करने और फिर उन्हें कुल्हाड़ियों में जोड़ने के लिए, और फिर उन्हें साजिश एक रास्ता है यहाँ कोड है?

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

AX1 पर अब भूखंड पंक्ति 1, AX2 पर पंक्ति 2, AX3 और ax4 पर line4 पर पंक्ति 3: यहाँ तर्क मैं मन में था है।

+0

लेकिन प्लॉट को फिर से कॉल करने में क्या गड़बड़ है? क्या यह कुछ समस्या पैदा कर रहा है? – wim

+0

@ विम इस मामले में कोई समस्या नहीं पैदा कर रहा है। लेकिन अगर मुझे कॉपी पेस्ट का उपयोग करने की ज़रूरत है तो मैं हमेशा कोड के बारे में संदेह करता हूं। या अगर मैं कुछ समारोहों के लिए लाइनों के भूखंड भेजने के लिए उदाहरण चाहता था जो विभिन्न अक्षों पर किसी भी तरह से भूखंडों की व्यवस्था करता है। – enedene

+0

आकृति बनाने के बजाय, और फिर सबप्लॉट जोड़ने के बजाय आप इसे एक पंक्ति में कर सकते हैं: 'fix, ax = plt.subplots (2, 2) '। फिर 'ax' axes की एक numpy सरणी है ताकि आप' कुल्हाड़ी [0, 1]। प्लॉट (डेटा, डेटा ** 2/10, ls = '-', color = 'g') ' – mmagnuski

उत्तर

5

यहां एक संभावित समाधान है। मुझे यकीन नहीं है कि यह बहुत सुंदर है, लेकिन कम से कम इसे कोड डुप्लिकेशन की आवश्यकता नहीं है।

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

मुझे लगता है कि अपने उपयोग ठीक है, लेकिन आप इस तरह plot को x,y डेटा जोड़े के सभी पारित कर सकते हैं (हालांकि यह बनाता है यह बहुत भयानक पढ़ने के लिए!):

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

एक मनोरंजक अलग तरीके से करना यह इस तरह है:

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

कर सकते हैं चीजें गलत तरीके से, मुझे बेहतर होना चाहिए। :) मैंने दोनों समाधानों को उखाड़ फेंक दिया, स्वीकृत उत्तर के लिए चयन मनमाने ढंग से था। – enedene

0

मैं jupyter पुस्तिकाओं में एक सरल उपयोग के मामले था। यह देखते हुए कि आपने कहीं एक आकृति वस्तु संग्रहित की है, आप इसे कैसे दोहरा सकते हैं। जैसे:

सेल 1:

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

सेल 2:

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

यह है कि। इसका लाभ यह है कि आप वस्तुओं में आंकड़ों को स्टोर कर सकते हैं और बाद में आवश्यक होने पर उनका उपयोग कर सकते हैं।

संबंधित मुद्दे