2014-12-19 10 views
7

मुझे लूप पुनरावृत्तियों के माध्यम से एक आकृति के सबप्लॉट आकर्षित करने की जरूरत है; प्रत्येक पुनरावृत्ति एक अन्य मॉड्यूल (= एक और पीई फ़ाइल) में परिभाषित एक फ़ंक्शन को कॉल करती है, जो सबप्लॉट्स की एक जोड़ी खींचती है। यहाँ मैं क्या करने की कोशिश की है - और अफसोस काम नहीं करता है:एक लूप के माध्यम से matplotlib सबप्लॉट populating और एक समारोह

1) पाश से पहले, पंक्तियों की पर्याप्त संख्या के साथ एक आंकड़ा बनाते हैं, और 2 कॉलम:

import matplotlib.pyplot as plt  
fig, axarr = plt.subplots(nber_rows,2) 

2) पाश के अंदर, यात्रा संख्या iter_nber पर, प्रत्येक subplot ड्राइंग समारोह पर कॉल:

fig, axarr = module.graph_function(fig,axarr,iter_nber,some_parameters, some_data) 

3) प्रश्न में समारोह मूल रूप से इस तरह है, प्रत्येक पुनरावृत्ति एक ही पंक्ति पर सबप्लॉट्स की एक जोड़ी बनाता है:

def graph_function(fig,axarr,iter_nber,some_parameters, some_data): 

    axarr[iter_nber,1].plot(--some plotting 1--) 
    axarr[iter_nber,2].plot(--some plotting 2--) 

    return fig,axarr 

यह काम नहीं करता है। मैं लूप के अंत में एक खाली आंकड़े के साथ समाप्त होता है। मैंने उपरोक्त के विभिन्न संयोजनों की कोशिश की है, जैसे कि फ़ंक्शन के रिटर्न तर्क में केवल अक्ष को छोड़ना, इसका कोई फायदा नहीं हुआ। जाहिर है, मैं इस आकृति और इसके सबप्लॉट के तर्क को समझ नहीं पा रहा हूं।

किसी भी सुझाव की बहुत सराहना की।

+0

आप एक काम उदाहरण प्रदान कर सकता है? – hitzg

+0

धन्यवाद hitzg। मैं उम्मीद कर रहा था कि सरलीकृत कोड आपको यह देखने में मदद करेगा कि मेरी समस्या क्या है। असली कोड बहुत लंबा है और विवरण से भरा है जो हाथ से सवाल से पूरी तरह से असंबंधित है। – Charles

+2

एक चीज जो अजीब दिखती है वह 'axarr [iter_nber, 2] 'में सूचकांक' 2' है। जो एक त्रुटि – hitzg

उत्तर

10

आपके द्वारा पोस्ट किया गया कोड काफी हद तक सही लगता है। इंडेक्सिंग के अलावा, जैसा कि @ हिट्ज ने उल्लेख किया है, आप जो कुछ भी कर रहे हैं वह सामान्य से बहुत कम दिखता है।

हालांकि, यह आपके साजिश समारोह से आकृति और अक्ष सरणी को वापस करने के लिए अधिक समझ में नहीं आता है। (यदि आपको आकृति वस्तु तक पहुंच की आवश्यकता है, तो आप इसे ax.figure के माध्यम से हमेशा प्राप्त कर सकते हैं।) यह उन्हें पास करने और उन्हें वापस करने के लिए कुछ भी नहीं बदलेगा।

यहां ऐसी चीज का एक त्वरित उदाहरण है जैसा आप ऐसा करने की कोशिश कर रहे हैं। शायद यह कुछ भ्रम को दूर करने में मदद करता है?

import numpy as np 
import matplotlib.pyplot as plt 

def main(): 
    nrows = 3 
    fig, axes = plt.subplots(nrows, 2) 

    for row in axes: 
     x = np.random.normal(0, 1, 100).cumsum() 
     y = np.random.normal(0, 0.5, 100).cumsum() 
     plot(row, x, y) 

    plt.show() 

def plot(axrow, x, y): 
    axrow[0].plot(x, color='red') 
    axrow[1].plot(y, color='green') 

main() 

enter image description here

+0

धन्यवाद जो हाँ यह उपयोगी है। मैं विशेष रूप से देखता हूं कि आपका फ़ंक्शन "प्लॉट" कुछ भी नहीं देता है। मैं इस तर्क का पालन करूंगा। साथ ही, मैं सोच रहा था कि क्या मेरे प्लॉटिंग फ़ंक्शन किसी अन्य फ़ाइल में है, इसका प्रभाव हो सकता है? मैं नहीं देखता क्यों लेकिन मैं गलत हो सकता है। धन्यवाद फिर से – Charles

+0

@ चार्ल्स - जब तक आपका प्लॉटिंग फ़ंक्शन अन्य फ़ाइल से ठीक से आयात किया जाता है, इससे कोई फर्क नहीं पड़ता। (उदा। अगर यह 'ब्लाह 'में' प्लॉट 'नामक एक फ़ंक्शन है।py', तो आपको केवल 'प्लॉट (...) 'के बजाय' आयात blah' और' blah.plot (...) 'करने की आवश्यकता होगी।) जहां तक ​​वापस जाना है (या वापस नहीं) , एक आम सम्मेलन कलाकारों (जैसे रेखाएं, आदि) को वापस करना है जो प्लॉट किए गए हैं। Exmaple के लिए, 'line = ax.plot (...); वापसी लाइन'। हालांकि, यह पूरी तरह से वैकल्पिक है। यह बाद में उपयोग की संभावित आसानी के लिए है। –

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