Matplotlib में कई सबप्लॉट्स के साथ सबप्लोट आकार / रिक्ति में सुधार करें


313

इस सवाल के समान ही लेकिन इस अंतर के साथ कि मेरा आंकड़ा उतना बड़ा हो सकता है जितना इसे होना चाहिए।

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

कोई फर्क नहीं पड़ता कि मैं कितना बड़ा होने देता हूं, सबप्लॉट हमेशा ओवरलैप लगते हैं।

मेरा कोड वर्तमान में जैसा दिखता है

import matplotlib.pyplot as plt
import my_other_module

titles, x_lists, y_lists = my_other_module.get_data()

fig = plt.figure(figsize=(10,60))
for i, y_list in enumerate(y_lists):
    plt.subplot(len(titles), 1, i)
    plt.xlabel("Some X label")
    plt.ylabel("Some Y label")
    plt.title(titles[i])
    plt.plot(x_lists[i],y_list)
fig.savefig('out.png', dpi=100)

जवाबों:


413

प्रयोग करके देखें plt.tight_layout

एक त्वरित उदाहरण के रूप में:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=4, ncols=4)
fig.tight_layout() # Or equivalently,  "plt.tight_layout()"

plt.show()

टाइट लेआउट के बिना

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


तंग लेआउट के साथ यहां छवि विवरण दर्ज करें


21
यह थोड़ा स्पष्ट होगा यदि आप दिखाते हैं कि आपको इसे अपने प्लॉट कोड के बाद निष्पादित करना चाहिए, लेकिन शो से ठीक पहले ()
pyj

5
tight_layout()हिट है और याद आती है। मैं यह समझने की कोशिश कर रहा हूं कि क्या अलग है जब इसका कोई प्रभाव नहीं होता है (बड़े अंतर-प्लॉट मार्जिन बने रहते हैं) - जो अक्सर होता है
javadba

3
यह मेरे लिए बहुत अच्छी तरह से काम करता है, सिवाय इसके कि यह मेरे आंकड़े शीर्षक ( suptitle) को मेरे सबप्लॉट शीर्षक के साथ छोड़ देता है। अगर किसी को भी इसी तरह की समस्या का सामना करना पड़ता है, तो यहां मेरे मामले में क्या मदद मिली है stackoverflow.com/a/45161551/11740420 । अर्थात्, rectके पैरामीटरtight_layout()
Siyana पावलोवा

284

आप plt.subplots_adjustसबप्लॉट्स के बीच रिक्ति को बदलने के लिए उपयोग कर सकते हैं (स्रोत)

कॉल हस्ताक्षर:

subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)

पैरामीटर अर्थ (और सुझाए गए चूक) हैं:

left  = 0.125  # the left side of the subplots of the figure
right = 0.9    # the right side of the subplots of the figure
bottom = 0.1   # the bottom of the subplots of the figure
top = 0.9      # the top of the subplots of the figure
wspace = 0.2   # the amount of width reserved for blank space between subplots
hspace = 0.2   # the amount of height reserved for white space between subplots

वास्तविक चूक को rc फ़ाइल द्वारा नियंत्रित किया जाता है


3
मैंने हस्पेस के साथ खिलवाड़ करने की कोशिश की है, लेकिन यह केवल ओवरलैप की समस्या को हल किए बिना सभी ग्राफ़ को छोटा बनाता है। मैंने अन्य मापदंडों के साथ खेलने की कोशिश की है, लेकिन मुझे नहीं पता कि बाएं, दाएं, नीचे और ऊपर वास्तव में क्या निर्दिष्ट कर रहे हैं।
mcstrother

52
@mcstrother आप उन मापदंडों में से सभी 6 को अंतःक्रियात्मक रूप से बदल सकते हैं यदि आप प्लॉट दिखाने के बाद 'समायोजन' बटन पर क्लिक करते हैं, तो एक बार जब आप काम करते हैं, तो उन्हें कोड में कॉपी कर लें।
निक टी

1
मुझे एडजस्टमेंट बटन नहीं दिख रहा है। हालांकि मैं एक ज्यूपिटर नोटबुक में हूं। मैंने% matplotlib इनलाइन और% matplotlib नोटबुक की कोशिश की।
मैट क्लिंसमिथ

1
@MattKleinsmith: एडजस्टमेंट बटन में हॉवर टेक्स्ट "सबप्लॉट कॉन्फ़िगर करें" है और मैटलपोटलिब के नियमित गैर-नोटबुक उपयोगों में दिखाई देता है। यह "फ़्लॉपी डिस्क" सहेजें बटन के बाईं ओर का बटन है: pythonspot-9329.kxcdn.com/wp-content/uploads/2016/07/… - ध्यान दें कि बटन अलग-अलग दिखते हैं, जो इस बात पर निर्भर करता है कि आप क्या कर रहे हैं का उपयोग कर, लेकिन यह हमेशा बचा बटन के बाईं ओर है।
2:20 बजे जॉन Zwinck

@JohnZwinck, आपकी टिप्पणी का लिंक अब मृत है।
user4015990

56

मैंने पाया कि सबप्लॉट्स_डॉल्स (hspace = 0.001) जो मेरे लिए काम कर रहा है। जब मैं अंतरिक्ष का उपयोग करता हूं = कोई नहीं, प्रत्येक भूखंड के बीच अभी भी सफेद स्थान है। यह शून्य के बहुत करीब कुछ करने के लिए सेटिंग हालांकि उन्हें लाइन अप करने के लिए मजबूर करने के लिए लगता है। मैंने यहां जो अपलोड किया है वह कोड का सबसे सुंदर टुकड़ा नहीं है, लेकिन आप देख सकते हैं कि हस्पेस कैसे काम करता है।

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as tic

fig = plt.figure()

x = np.arange(100)
y = 3.*np.sin(x*2.*np.pi/100.)

for i in range(5):
    temp = 510 + i
    ax = plt.subplot(temp)
    plt.plot(x,y)
    plt.subplots_adjust(hspace = .001)
    temp = tic.MaxNLocator(3)
    ax.yaxis.set_major_locator(temp)
    ax.set_xticklabels(())
    ax.title.set_visible(False)

plt.show()

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


31
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10,60))
plt.subplots_adjust( ... )

Plt.subplots_adjust विधि:

def subplots_adjust(*args, **kwargs):
    """
    call signature::

      subplots_adjust(left=None, bottom=None, right=None, top=None,
                      wspace=None, hspace=None)

    Tune the subplot layout via the
    :class:`matplotlib.figure.SubplotParams` mechanism.  The parameter
    meanings (and suggested defaults) are::

      left  = 0.125  # the left side of the subplots of the figure
      right = 0.9    # the right side of the subplots of the figure
      bottom = 0.1   # the bottom of the subplots of the figure
      top = 0.9      # the top of the subplots of the figure
      wspace = 0.2   # the amount of width reserved for blank space between subplots
      hspace = 0.2   # the amount of height reserved for white space between subplots

    The actual defaults are controlled by the rc file
    """
    fig = gcf()
    fig.subplots_adjust(*args, **kwargs)
    draw_if_interactive()

या

fig = plt.figure(figsize=(10,60))
fig.subplots_adjust( ... )

चित्र का आकार मायने रखता है।

"मैंने हस्पेस के साथ खिलवाड़ करने की कोशिश की है, लेकिन यह केवल ओवरलैप की समस्या को हल किए बिना सभी ग्राफ़ को छोटा बनाता है।"

इस प्रकार अधिक सफेद स्थान बनाने के लिए और उप भूखंड के आकार को बनाए रखने के लिए कुल छवि को बड़ा होना चाहिए।


2
चित्र का आकार मायने रखता है, बड़ा चित्र आकार इस समस्या को हल कर सकता है! सेट plt.figure(figsize=(10, 7)), चित्र का आकार 2000 x 1400पिक्स होगा
बेल्टर

24

आप सबप्लॉट_टूल () आज़मा सकते हैं

plt.subplot_tool()

यह मुझे ठीक ट्यूनिंग के भार को बचाया, कभी नहीं पता था कि यह धन्यवाद से बाहर निकलता है!
२१:१६ में हाडी इलासर


20

tight_layoutअब matplotlib के समान (संस्करण 2.2 के अनुसार) प्रदान करता है constrained_layout। इसके विपरीत tight_layout, जिसे एकल अनुकूलित लेआउट के लिए कोड में किसी भी समय कहा जा सकता है, constrained_layoutएक संपत्ति है, जो सक्रिय हो सकती है और हर ड्राइंग कदम से पहले लेआउट को अनुकूलित करेगी।

इसलिए इसे उप-निर्माण से पहले या उसके दौरान सक्रिय किया जाना चाहिए, जैसे कि figure(constrained_layout=True)या subplots(constrained_layout=True)

उदाहरण:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(4,4, constrained_layout=True)

plt.show()

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

constrained_layout के माध्यम से भी सेट किया जा सकता है rcParams

plt.rcParams['figure.constrained_layout.use'] = True

देखें कि नई प्रविष्टि और विवश लेआउट गाइड क्या है


1
इसे आज़माने के लिए: इस विकल्प को नहीं देखा था - और tight_layoutअविश्वसनीय है
javadba

यह आशाजनक लग रहा था, लेकिन मुझे पर्याप्त रिक्ति (कुल्हाड़ियों लेबल और खिताब अभी भी अतिव्याप्त) नहीं दिया और प्रतिपादन में अधिक समय लगा। tight_layout()बेहतर काम किया
तृष्णा

2
@ क्रैक सही, सामान्य रूप contrained_layoutसे धीमा है, क्योंकि इस उत्तर में देखा गया है, यह हर ड्राइंग कदम से पहले लेआउट को अनुकूलित करता है
महत्व

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