कैसे matplotlib का उपयोग कर एक ही पृष्ठ पर कई भूखंड बनाने के लिए?


91

मैंने कोड लिखा है जो एक बार में 16 आंकड़े खोलता है। वर्तमान में वे सभी अलग रेखांकन के रूप में खुलते हैं। मैं उन्हें एक ही पेज पर खोलना चाहता हूं। एक ही ग्राफ नहीं। मुझे सिंगल पेज / विंडो पर 16 अलग-अलग ग्राफ चाहिए। इसके अलावा किसी कारण से सुन्न और डिफॉल्ट्रिमिट का प्रारूप अतीत का आंकड़ा नहीं रखता है। क्या मुझे सबप्लॉट कमांड का उपयोग करने की आवश्यकता है? मुझे समझ नहीं आ रहा है कि मुझे क्यों करना पड़ेगा लेकिन मैं यह नहीं पता लगा सकता कि मैं और क्या करूंगा?

import csv
import scipy.stats
import numpy
import matplotlib.pyplot as plt

for i in range(16):
    plt.figure(i)
    filename= easygui.fileopenbox(msg='Pdf distance 90m contour', title='select file', filetypes=['*.csv'], default='X:\\herring_schools\\')
    alt_file=open(filename)    
    a=[]
    for row in csv.DictReader(alt_file):
        a.append(row['Dist_90m(nmi)'])
    y= numpy.array(a, float)    
    relpdf=scipy.stats.relfreq(y, numbins=7, defaultreallimits=(-10,60))
    bins = numpy.arange(-10,60,10)
    print numpy.sum(relpdf[0])
    print bins
    patches=plt.bar(bins,relpdf[0], width=10, facecolor='black')
    titlename= easygui.enterbox(msg='write graph title', title='', default='', strip=True, image=None, root=None)
    plt.title(titlename)
    plt.ylabel('Probability Density Function')
    plt.xlabel('Distance from 90m Contour Line(nm)')
    plt.ylim([0,1])

plt.show()

जवाबों:


17

अपने मुख्य प्रश्न का उत्तर देने के लिए, आप उपप्लॉट कमांड का उपयोग करना चाहते हैं । मुझे लगता है कि काम plt.figure(i)करने के लिए बदलना plt.subplot(4,4,i+1)चाहिए।


201

Las3rjock का उत्तर , जो किसी भी तरह ओपी द्वारा स्वीकार किया गया उत्तर है, गलत है - कोड नहीं चलता है, न ही यह वैध matplotlib सिंटैक्स है; यह उत्तर कोई भी चलाने योग्य कोड प्रदान नहीं करता है और किसी भी जानकारी या सुझाव का अभाव है जो ओपी को समस्या को हल करने के लिए अपना कोड लिखने में उपयोगी हो सकता है।

यह देखते हुए कि यह स्वीकृत उत्तर है और पहले ही कई अप-वोट प्राप्त कर चुका है, मुझे लगता है कि थोड़ा सा विघटन क्रम में है।

सबसे पहले, बुला subplot करता नहीं आप एक से अधिक भूखंडों देते हैं; सबप्लॉट को सिंगल प्लॉट बनाने के लिए कहा जाता है, साथ ही कई प्लॉट्स बनाने के लिए। इसके अलावा, "बदलते plt.figure (i)" सही नहीं है।

plt.figure () (जिसमें पीएलटी या पीएलटी आमतौर पर matplotlib की pyplot लाइब्रेरी होती है जिसे वैश्विक चर, plt या कभी-कभी PLT के रूप में आयात किया जाता है और पुनर्जन्म होता है , जैसे:

from matplotlib import pyplot as PLT

fig = PLT.figure()

बस ऊपर की रेखा एक matplotlib आंकड़ा उदाहरण बनाता है; इस ऑब्जेक्ट की add_subplot विधि को फिर हर प्लॉटिंग विंडो के लिए बुलाया जाता है (अनौपचारिक रूप से एक x और y अक्ष को एक एकल सबप्लॉट से युक्त लगता है)। आप बनाते हैं (चाहे पृष्ठ पर सिर्फ एक या कई के लिए), जैसे

fig.add_subplot(111)

यह वाक्यविन्यास के बराबर है

fig.add_subplot(1,1,1)

वह चुनें जो आपके लिए मायने रखता है।

नीचे मैंने एक पृष्ठ पर दो प्लॉट्स को प्लॉट करने के लिए कोड सूचीबद्ध किया है, एक के ऊपर एक। फॉर्मेटिंग add_subplot को दिए गए तर्क के माध्यम से किया जाता है । ध्यान दें कि तर्क पहले प्लॉट के लिए ( 211 ) और दूसरे के लिए ( 212 ) है।

from matplotlib import pyplot as PLT

fig = PLT.figure()

ax1 = fig.add_subplot(211)
ax1.plot([(1, 2), (3, 4)], [(4, 3), (2, 3)])

ax2 = fig.add_subplot(212)
ax2.plot([(7, 2), (5, 3)], [(1, 6), (9, 5)])

PLT.show()

इन दो तर्कों में से प्रत्येक पृष्ठ पर संबंधित भूखंड खिड़कियों को सही ढंग से रखने के लिए एक पूर्ण विनिर्देश है।

211 (जो फिर से, 3-ट्यूपल रूप में भी लिखा जा सकता है (2,1,1) का अर्थ है दो पंक्तियों औरप्लॉट विंडो का एक कॉलम ; तीसरा अंक उस विशेष सबप्लॉट विंडो के ऑर्डर को अन्य सबप्लॉट विंडो के सापेक्ष निर्दिष्ट करता है- -इस मामले में, यह पहला प्लॉट है (जो इसे पंक्ति 1 पर रखता है) इसलिए प्लॉट नंबर 1, पंक्ति 1 कॉल 1।

Add_subplot के लिए दूसरी कॉल के लिए दिया गया तर्क , पहले से केवल अनुगामी अंक (1 के बजाय एक 2) से भिन्न होता है, क्योंकि यह प्लॉट दूसरा प्लॉट (पंक्ति 2, कॉल 1) है।

अधिक भूखंडों के साथ एक उदाहरण: यदि आप एक पृष्ठ पर चार प्लॉट चाहते थे , तो 2x2 मैट्रिक्स कॉन्फ़िगरेशन में, आप इन चार तर्कों (221), (222), (223), और (चार) में जोड़ते हुए, add_subplot विधि को चार बार कॉल करेंगे। 224), एक पृष्ठ पर 10, 2, 8, और 4 बजे, क्रमशः और इस क्रम में चार भूखंड बनाने के लिए।

ध्यान दें कि चार तर्कों में से प्रत्येक में दो अग्रणी 2 होते हैं - जो 2 x 2 कॉन्फ़िगरेशन, अर्थात, दो पंक्तियों और दो स्तंभों को एन्कोड करता है।

चार तर्कों में से प्रत्येक में तीसरा (दायाँ-सबसे) अंक 2 x 2 मैट्रिक्स में उस विशेष भूखंड खिड़की के क्रम को कूटबद्ध करता है - यानी, पंक्ति 1 कॉल 1 (1), पंक्ति 1 कॉल 2 (2), पंक्ति 2 col 1 (3), पंक्ति 2 col 2 (4)।


1
add_subplot छोटी संख्या के सबप्लॉट के लिए एक पूर्णांक तर्क ले सकता है, लेकिन एक बार जब आपको 9 से अधिक सबप्लॉट की आवश्यकता होती है, तो आपको अन्य उत्तरों से संस्करण का उपयोग करना चाहिए जो 3 अलग पूर्णांक तर्क लेता है।
user1244215

1
क्या मैं fig.add_axes(rect)इसके बजाय उपयोग कर सकता हूं add_subplot?
ऑक्टॉट

15
PLT? कभी नहीं देखा कि पहले इस्तेमाल किया जा रहा है
दर्शन चौधरी

3
यहां आपका पहला पैराग्राफ मुख्यतः असत्य है, क्योंकि आप रनिंग द्वारा सत्यापित कर सकते हैं for i in range(16): plt.subplot(4, 4, i+1)और कोई सिंटैक्स त्रुटि नहीं देख सकते हैं । उत्तर स्वीकार किया जाता है क्योंकि यह शायद वही करता था जो ओपी चाहता था।
चेटोनिकॉनॉम

3
यह एक अच्छा उपाय है। लेकिन अगर मैं एक चर को लूप में उपयोग करना चाहता हूं, तो कैसे करें?
पेंगू झाओ

83

चूँकि यह प्रश्न 4 साल पहले से नई चीजों को लागू किया गया है और उनके बीच एक नया कार्य है plt.subplotsजो बहुत सुविधाजनक है :

fig, axes = plot.subplots(nrows=2, ncols=3, sharex=True, sharey=True)

जहाँ AxesSubplot वस्तुओं axesका एक numpy.ndarrayसमूह है, यह सिर्फ सरणी सूचकांकों का उपयोग करके विभिन्न उपपट्टों के माध्यम से जाने के लिए बहुत सुविधाजनक बनाता है [i,j]


क्या यह कार्य उन मामलों के लिए भी है जहाँ मुझे केवल matplotlib API का उपयोग करने की आवश्यकता है (प्रदर्शन उपलब्ध नहीं होने के कारण और अन्य मज़ेदार चीज़ें)?
यूडोक्सोस

2
@ यूडॉक्सोस हां, यह चाहिए, आप एक पेज में कई ग्राफिक्स प्रिंट करने के लिए इस तरह से सबप्लॉट बना सकते हैं, उदाहरण के लिए, क्या किया जा रहा है यह दिखाने की आवश्यकता के बिना
Saullo GP Castro

12

यह भी काम करता है:

for i in range(19):
    plt.subplot(5,4,i+1) 

यह एक पृष्ठ पर 19 कुल रेखांकन करता है। प्रारूप 5 नीचे है और 4 पार ..


4

@doug & FS. का जवाब बहुत अच्छे समाधान हैं। मैं pandas.dataframe पर पुनरावृत्ति के लिए समाधान साझा करना चाहता हूं।

import pandas as pd
df=pd.DataFrame([[1, 2], [3, 4], [4, 3], [2, 3]])
fig = plt.figure(figsize=(14,8))
for i in df.columns:
    ax=plt.subplot(2,1,i+1) 
    df[[i]].plot(ax=ax)
    print(i)
plt.show()

यदि आप डेटा फ्रेम को कॉलम नाम देते हैं, तो आपको कुछ उपयोग करने की आवश्यकता होगीfor i,col in enumerate(df.columns):
drevicko
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.