क्यों कई उदाहरण Matplotlib / pyplot / अजगर में `अंजीर, कुल्हाड़ी = plt.subplots () का उपयोग करते हैं


265

मैं matplotlibउदाहरणों का अध्ययन करके उपयोग करना सीख रहा हूं , और बहुत सारे उदाहरणों में एकल प्लॉट बनाने से पहले एक पंक्ति को शामिल करना प्रतीत होता है ...

fig, ax = plt.subplots()

यहाँ कुछ उदाहरण हैं...

मैं देख रहा हूं कि इस फ़ंक्शन का बहुत उपयोग किया गया है, भले ही उदाहरण केवल एक चार्ट बनाने का प्रयास कर रहा हो। क्या कोई और फायदा है? एकल चार्ट बनाते समय आधिकारिक डेमो का subplots()भी उपयोग f, ax = subplotsहोता है, और यह केवल उसके बाद कुल्हाड़ी का संदर्भ देता है। यह वह कोड है जो वे उपयोग करते हैं।

# Just a figure and one subplot
f, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('Simple plot')

11
ठीक है, यह संक्षिप्त है, संक्षिप्त है और आपको एक ही चरण में एक संदर्भ दो आंकड़ा और अक्ष दोनों मिलते हैं। यह pythonic है, क्योंकि यह सुंदर है :)
cel

जवाबों:


322

plt.subplots()एक ऐसा कार्य है जो एक आंकड़ा और कुल्हाड़ी वस्तु (ओं) से युक्त एक नल देता है। इस प्रकार जब fig, ax = plt.subplots()आप इस टुपल को चर में अनपैक करते हैं figऔर ax। बीत रहा है figयदि आप परिवर्तन आंकड़ा-स्तरीय गुणों को या बाद में (साथ जैसे एक छवि फ़ाइल के रूप में आंकड़ा बचाने चाहते उपयोगी है fig.savefig('yourfilename.png'))। आपको निश्चित रूप से रिटर्न की गई वस्तु का उपयोग करने की आवश्यकता नहीं है, लेकिन बहुत से लोग इसे बाद में उपयोग करते हैं इसलिए यह देखने के लिए सामान्य है। इसके अलावा, सभी एक्सिस ऑब्जेक्ट्स (ऑब्जेक्ट्स जिसमें प्लॉटिंग मेथड्स हैं), वैसे भी पेरेंट फिगर ऑब्जेक्ट है, इस प्रकार:

fig, ax = plt.subplots()

इस से अधिक संक्षिप्त है:

fig = plt.figure()
ax = fig.add_subplot(111)

7
बहुत अच्छी व्याख्या। यहाँ इस पर doc है - matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.subplots
bretcj7

2
हम हमेशा सबप्लॉट में एक पैरामीटर के रूप में 111 का उपयोग क्यों करते हैं?
प्रियांश

@Priyansh क्योंकि यह Matlab सिंटैक्स से विरासत में मिला है
pcko1

@Priyansh हमेशा नहीं। यदि आप 4 ग्राफ चाहते हैं, तो आप क्रमशः (या 222, 223, 224) ax11, ax12, ax21, ax22का उपयोग करके कर सकते हैं fig.add_subplot(221)
Guimoute

49

बस एक पूरक यहाँ।

निम्नलिखित प्रश्न यह है कि क्या होगा अगर मुझे आंकड़े में अधिक सबप्लॉट चाहिए?

जैसा कि डॉक में उल्लेख किया गया है, हम fig = plt.subplots(nrows=2, ncols=2)ग्रिड (2,2) के साथ सबप्लॉट के एक समूह को एक आंकड़ा ऑब्जेक्ट में सेट करने के लिए उपयोग कर सकते हैं ।

फिर जैसा कि हम जानते हैं, एक fig, ax = plt.subplots()वापसी देता है, चलो fig, ax1, ax2, ax3, ax4 = plt.subplots(nrows=2, ncols=2)पहले प्रयास करें ।

ValueError: not enough values to unpack (expected 4, got 2)

यह एक त्रुटि उठाता है, लेकिन कोई चिंता नहीं, क्योंकि अब हम देखते हैं कि plt.subplots()वास्तव में दो तत्वों के साथ एक ट्यूपल लौटाता है। पहले वाले को एक आकृति ऑब्जेक्ट होना चाहिए, और दूसरे को सबप्लॉट ऑब्जेक्ट्स का एक समूह होना चाहिए।

तो चलिए फिर से कोशिश करते हैं:

fig, [[ax1, ax2], [ax3, ax4]] = plt.subplots(nrows=2, ncols=2)

और प्रकार की जाँच करें:

type(fig) #<class 'matplotlib.figure.Figure'>
type(ax1) #<class 'matplotlib.axes._subplots.AxesSubplot'>

बेशक, यदि आप मापदंडों का उपयोग करते हैं (nrows = 1, ncols = 4), तो प्रारूप होना चाहिए:

fig, [ax1, ax2, ax3, ax4] = plt.subplots(nrows=1, ncols=4)

इसलिए सूची के निर्माण को उसी तरह रखना याद रखें जैसा कि हम आंकड़े में सेट किए गए सबप्लॉट्स ग्रिड के रूप में करते हैं।

आशा है कि यह आपके लिए उपयोगी होगा।


2
plt.tight_layout जोड़ने के लिए भूल नहीं है () अगर आपके subplots शीर्षक हैं
gota

12
यदि आपके पास बहुत सारे सबप्लॉट हैं तो क्या होगा? यह इस तरह से करना आसान है: fig, axes = plt.subplots(nrows=10, ncols=3)और axes = axes.flatten()। अब आप अपने सूचकांक द्वारा प्रत्येक subplot का उल्लेख कर सकते हैं: axes[0], axes[1], ...
Guillaume

क्या होगा अगर मैं उन सबप्लॉट्स में से एक को कई कॉल या पंक्तियों में फैलाना चाहता हूं? क्या यह सबप्लॉट्स कमांड के साथ उल्लेखनीय है?
gota

1
@ बॉलपॉइंट पर मुझे यकीन नहीं है कि अगर काम करता है nrows=1, तो तब axesतक फ्लैट के बराबर लौटा जाता हैncols
बेन

1
@ बॉलपॉइंटबैन को एहसास हुआ कि आप इसे ठीक कर सकते हैं:fig, axes = plt.subplots(nrows=1, ncols=3, squeeze=False)
बेन

14

प्रश्न के पूरक के रूप में और ऊपर दिए गए उत्तर के बीच भी एक महत्वपूर्ण अंतर है plt.subplots()और plt.subplot(), लापता 's'को अंत में देखें।

एक ही plt.subplots()बार में अपने सभी सबप्लॉट्स बनाने के लिए उपयोग कर सकते हैं और यह एक टपल के रूप में सबप्लॉट्स की आकृति और अक्षों (बहुवचन का अक्ष) को लौटाता है। एक आकृति को एक कैनवास के रूप में समझा जा सकता है जहां आप अपने स्केच को पेंट करते हैं।

# create a subplot with 2 rows and 1 columns
fig, ax = plt.subplots(2,1)

plt.subplot()यदि आप सबप्लॉट्स को अलग से जोड़ना चाहते हैं , तो आप इसका उपयोग कर सकते हैं । यह केवल एक सबप्लॉट की धुरी देता है।

fig = plt.figure() # create the canvas for plotting
ax1 = plt.subplot(2,1,1) 
# (2,1,1) indicates total number of rows, columns, and figure number respectively
ax2 = plt.subplot(2,1,2)

हालांकि, plt.subplots()पसंद किया जाता है क्योंकि यह आपको अपने पूरे आंकड़े को सीधे अनुकूलित करने के लिए आसान विकल्प देता है

# for example, sharing x-axis, y-axis for all subplots can be specified at once
fig, ax = plt.subplots(2,2, sharex=True, sharey=True)

साझा कुल्हाड़ियों जबकि, plt.subplot()एक के साथ , प्रत्येक अक्ष के लिए व्यक्तिगत रूप से निर्दिष्ट करना होगा जो बोझिल हो सकता है।


1
आपकी कोड लाइन ax3 = plt.subplot(2,1,3) काम नहीं करेगी क्योंकि यह 2 बाय 1 है, जिसमें केवल 2 ग्राफ हैं।
मेघ चो

1
धन्यवाद, इसे ठीक किया। अंतिम कोड ब्लॉक में एक और बदलाव की जरूरत थी।
लाइट_B

2

ऊपर दिए गए उत्तरों के अलावा, आप ऑब्जेक्ट के प्रकार की जांच कर सकते हैं, type(plt.subplots())जिसका उपयोग करके एक टपल लौटाता है, दूसरी ओर, type(plt.subplot())वह रिटर्न , matplotlib.axes._subplots.AxesSubplotजिसे आप पैक नहीं कर सकते।


4
ढेर अतिप्रवाह में आपका स्वागत है! यह वास्तव में एक टिप्पणी है, एक जवाब नहीं है। थोड़ा और प्रतिनिधि के साथ, आप टिप्पणी पोस्ट करने में सक्षम होंगे । धन्यवाद!
मिरोस्लाव ग्लैमुज़िना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.