Matplotlib में भूखंड, कुल्हाड़ियों या आकृति का उपयोग करने वाले भूखंडों के बीच अंतर क्या है?


99

जब मैं matplotlib, tbh में भूखंडों को आकर्षित करता हूं, तो बैकएंड में क्या हो रहा है, मैं उलझन में हूं, मैं साजिश, कुल्हाड़ियों और आकृति के पदानुक्रम के साथ स्पष्ट नहीं हूं। मैंने प्रलेखन पढ़ा और यह मददगार था लेकिन मैं अभी भी भ्रमित हूँ ...

नीचे दिया गया कोड तीन अलग-अलग तरीकों से एक ही प्लॉट बनाता है -

#creating the arrays for testing
x = np.arange(1, 100)
y = np.sqrt(x)
#1st way
plt.plot(x, y)
#2nd way
ax = plt.subplot()
ax.plot(x, y)
#3rd way
figure = plt.figure()
new_plot = figure.add_subplot(111)
new_plot.plot(x, y)

अब मेरा सवाल है -

  1. तीनों में क्या अंतर है, मेरा मतलब है कि जब 3 तरीकों में से किसी को बुलाया जाता है, तो क्या हुड के नीचे है?

  2. कौन सी विधि का उपयोग किया जाना चाहिए और उन पर किसी का उपयोग करने के पेशेवरों और विपक्ष क्या हैं?


8
मैंने पहले ही पढ़ लिया था लेकिन मुझे इसका जवाब बिल्कुल भी संतोषजनक नहीं लगा। यह पदानुक्रम की व्याख्या करता है, लेकिन यह भी भ्रम पैदा करता है कि पारंपरिक तरीका क्यों नहीं है, क्यों आकृति वस्तु भी उजागर हुई?
हैशकोड55

मुझे यकीन नहीं है कि आपने इस सटीक दस्तावेज matplotlib.org/users/artists.html का उल्लेख किया है । यह आपके सवाल का जवाब देता है कि आंकड़ा क्यों सामने आया है। व्यक्तिगत रूप से यह मैंने पाया है matplotlib का सबसे अच्छा विवरण है। चित्र वस्तु आपको अपने स्वयं के कलाकारों को सीधे कुल्हाड़ियों के बिना जोड़ने की अनुमति देती है हालांकि यह शायद ही कभी उपयोग किया जाता है जब तक कि आप स्वयं आकृति के "पैच" को मोड़ना नहीं चाहते हैं आदि ध्यान दें कि आंकड़ा मूल कंटेनर और मेजबान कुल्हाड़ियों और कलाकार हैं।
संदीप

जवाबों:


54

विधि 1

plt.plot(x, y)

यह आपको (x, y) निर्देशांक के साथ सिर्फ एक आंकड़ा देने की अनुमति देता है। यदि आप केवल एक ग्राफिक प्राप्त करना चाहते हैं, तो आप इस तरह से उपयोग कर सकते हैं।

विधि 2

ax = plt.subplot()
ax.plot(x, y)

यह आपको एक ही विंडो में एक या कई आकृति (ओं) को प्लॉट करने देता है। जैसा कि आप इसे लिखते हैं, आप सिर्फ एक आकृति की साजिश करेंगे, लेकिन आप कुछ इस तरह से बना सकते हैं:

fig1, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)

आप 4 आंकड़े प्लॉट करेंगे, जिनका नाम ax1, ax2, ax3 और ax4 हर एक पर एक ही विंडो पर होगा। यह विंडो मेरे उदाहरण के साथ सिर्फ 4 भागों में विभाजित होगी।

विधि 3

fig = plt.figure()
new_plot = fig.add_subplot(111)
new_plot.plot(x, y)

मैंने इसका उपयोग नहीं किया, लेकिन आप प्रलेखन पा सकते हैं।

उदाहरण:

import numpy as np
import matplotlib.pyplot as plt

# Method 1 #

x = np.random.rand(10)
y = np.random.rand(10)

figure1 = plt.plot(x,y)

# Method 2 #

x1 = np.random.rand(10)
x2 = np.random.rand(10)
x3 = np.random.rand(10)
x4 = np.random.rand(10)
y1 = np.random.rand(10)
y2 = np.random.rand(10)
y3 = np.random.rand(10)
y4 = np.random.rand(10)

figure2, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
ax1.plot(x1,y1)
ax2.plot(x2,y2)
ax3.plot(x3,y3)
ax4.plot(x4,y4)

plt.show()

यहाँ छवि विवरण दर्ज करें यहाँ छवि विवरण दर्ज करें

अन्य उदाहरण:

यहाँ छवि विवरण दर्ज करें


@ hashcode55 प्रत्येक आंकड़ा स्वतंत्र है। मैं आपको एक उदाहरण दिखाऊंगा
एसेक्स

1
@ hashcode55 मैं एक उदाहरण के साथ संपादित करूंगा (एस्ट्रोफिजिक्स में मेरे शोध से सिर्फ आंकड़ा, स्क्रिप्ट बहुत लंबी है (1300 लाइनें);) प्रत्येक आंकड़ा स्वतंत्र है;)
एसेक्स

3
मुझे पता है कि यह नाइटपिकी है, लेकिन मैं ऐसा कर रहा हूं क्योंकि matplotlibभाषा मेरे लिए भ्रामक थी, और यह सवाल "मेटप्लोटलिब में एक्सिस बनाम फिगर" के बारे में खोज करने पर पता चलता है। अन्य नॉब के लिए, इस प्रश्न ने उत्तर देने में मदद की। मुझे लगता है कि यहां शब्दांकन अधिक स्पष्ट हो सकता है जो वस्तुओं को एक ही पर subplots()लौटाएगा । Axesfigure
हेंडी

34

वस्तुओं के नाम

Matplotlib दृढ़ता से ऑब्जेक्ट ओरिएंटेड है और इसकी प्रमुख वस्तुएं आकृति और अक्ष हैं (मुझे नाम axesथोड़ा भ्रामक लगता है, लेकिन शायद यह सिर्फ मेरे लिए है)।

आप सोच सकते हैं आंकड़ा एक के रूप में कैनवास , जिनमें से आप आमतौर पर आयाम और संभवतः निर्दिष्ट जैसे, पृष्ठभूमि रंग आदि आदि आप कैनवास, का उपयोग आंकड़ा , अनिवार्य रूप से दो तरह से, उस पर (ज्यादातर अन्य वस्तुओं रखने अक्ष , लेकिन यह भी पाठ आदि) और के साथ अपनी सामग्री को बचाने savefig

आप एक के बारे में सोच सकते हैं कुल्हाड़ियों स्विस सेना चाकू का एक तरह, एक आसान उद्देश्य यह है कि प्रदान करता है एक उपकरण है (उदाहरण के रूप में .plot, .scatter, .histआदि) सब कुछ के लिए, ज्यादातर। आप एक, दो, ... कई अलग-अलग तरीकों में से एक का उपयोग करके एक आकृति के अंदर कई कुल्हाड़ियों को रख सकते हैं ।

pltइंटरफ़ेस

Plt प्रक्रियात्मक इंटरफ़ेस मूल रूप से नकल MATLAB ™ इंटरफ़ेस करने के लिए विकसित किया गया था, लेकिन वास्तव में वस्तु उन्मुख इंटरफ़ेस से अलग नहीं है, भले ही आप मुख्य उद्देश्य के लिए एक सीधा संदर्भ नहीं बनाते हैं (यानी, एक आंकड़ा और एक कुल्हाड़ियों ) इन वस्तुओं रहे हैं स्वचालित रूप से त्वरित और प्रत्येक पीएलटी विधि है, अनिवार्य रूप से, अंतर्निहित मूलभूत वस्तुओं में से एक के एक कॉल के लिए अनुवादित: उदाहरण के लिए, plt.plot()एक hidden_axes.plotऔर एक plt.savefigएक है hidden_figure.savefig

हर पल में आप का उपयोग कर इन छिपे हुए वस्तुओं पर एक संभाल कर सकते हैं plt.gcfऔर plt.gcaहै, और जब वस्तु तरीकों में से एक में एक विधि पर वापस पोर्ट नहीं किया गया है यह कभी कभी आवश्यक है plt नाम स्थान।

मैं जोड़ना चाहूंगा कि पीटीटी नेमस्पेस में विभिन्न तरीकों, फिगर और कुल्हाड़ियों को त्वरित करने के लिए कई सुविधा विधियां शामिल हैं ।

आपके उदाहरण

पहला तरीका

plt.plot(x, y)

यहाँ आप केवल पीटीटी इंटरफ़ेस का उपयोग करते हैं , आप केवल प्रत्येक आकृति में एक अक्ष का उपयोग कर सकते हैं , लेकिन यही वह है जब आप अपने डेटा की खोज कर रहे हैं, एक त्वरित नुस्खा जो काम करता है ...

दूसरा तरीका

ax = plt.subplot()
ax.plot(x, y)

यहां आप अपनी एक्सिस ऑब्जेक्ट को एक नाम (और एक हैंडल) देने के लिए पीटीटी नेमस्पेस में एक सुविधा पद्धति का उपयोग करते हैं , लेकिन एक छिपी हुई आकृति भी है । आप बाद में कुल्हाड़ी वस्तु का उपयोग साजिश, हिस्टोग्राम आदि बनाने के लिए कर सकते हैं, सभी चीजें जो आप पीटीटी इंटरफेस के साथ कर सकते हैं , लेकिन आप इसकी सभी विशेषताओं का उपयोग भी कर सकते हैं और उन्हें अधिक स्वतंत्रता के साथ संशोधित कर सकते हैं।

तीसरा तरीका

figure = plt.figure()
new_plot = figure.add_subplot(111)
new_plot.plot(x, y)

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

यह पीटी सुविधा विधि ( matplotlib.figure.Figure) को बायपास करना संभव है, लेकिन आपको फिर एक बेहतर इंटरैक्टिव अनुभव के लिए आकृति को ट्विस्ट करना होगा (आखिरकार, यह एक सुविधा विधि है)।

व्यक्तिगत सिफारिशें

मैं नंगे होने का सुझाव देता हूं plt.plot,plt.scatter एक इंटरैक्टिव सत्र के संदर्भ में, संभवतः का उपयोग कर IPython इसके साथ %matplotlibजादू आदेश, और यह भी एक खोजपूर्ण Jupyter नोटबुक के संदर्भ में।

दूसरी ओर वस्तु उन्मुख दृष्टिकोण, और कुछ plt सुविधा विधियों, जाने का रास्ता है

  • यदि आपके पास एक स्थायी समस्या है तो एक बार हल करने के लिए सभी को बारीक ट्यून किए गए सबप्लॉट की अनुकूलित व्यवस्था के साथ,
  • अगर आप अपने द्वारा लिखे गए प्रोग्राम के UI में Matplotlib एम्बेड करना चाहते हैं।

इन चरम सीमाओं के बीच एक बड़ा ग्रे क्षेत्र है और अगर आप मुझसे पूछें कि मैं क्या करूं तो मैं कहूंगा "यह निर्भर करता है" ...


2
"मुझे नाम कुल्हाड़ी थोड़ी भ्रामक लगती है, लेकिन शायद यह सिर्फ मेरे लिए है" - नहीं, यह मुझे भी है। हालांकि बदला नहीं जा सकता।
लैरीक्स डेसीडुआ

1
एक और बात मैं सिर्फ यह नहीं समझ सकता कि fig, ax = plt.subplot()जब लोग सबप्लॉट नहीं चाहते हैं तो लोग मुहावरे का उपयोग क्यों करते हैं। ऐसे मामलों में मुझे "प्रक्रियात्मक" शैली आसान लगी। "लेकिन शायद यह सिर्फ मुझे है ..." :-)
लेरिक्स डेसीडुआ

@LaryxDecidua मैं तुरंत दो अच्छे कारण देख सकता हूं icit "स्पष्ट है निहित से बेहतर है" ② क्या आप चित्रा या एक्सिस के तरीकों का उपयोग करना चाहते हैं जो प्रक्रियात्मक एपीआई में उपलब्ध नहीं हैं - लेकिन संभवतः अन्य हैं ...
Gboffi

हां, मैं पूरी तरह से 1) की सदस्यता लेता हूं। री 2): ज्यादातर समय प्रक्रियात्मक एपीआई पर्याप्त होता है। दिन के अंत में मुझे लगता है कि यह व्यक्तिगत प्राथमिकताओं के लिए उबलता है - किसी को इस बारे में बहस नहीं करनी चाहिए :-)
Laryx Decidua
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.