मेटप्लोटलिब में सबप्लॉट्स के बीच अंतराल कैसे निकालें?


116

नीचे दिया गया कोड सबप्लॉट्स के बीच अंतराल पैदा करता है। मैं सबप्लॉट्स के बीच अंतराल को कैसे हटाऊं और छवि को एक तंग ग्रिड बनाऊं?

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

import matplotlib.pyplot as plt

for i in range(16):
    i = i + 1
    ax1 = plt.subplot(4, 4, i)
    plt.axis('on')
    ax1.set_xticklabels([])
    ax1.set_yticklabels([])
    ax1.set_aspect('equal')
    plt.subplots_adjust(wspace=None, hspace=None)
plt.show()

2
एक लिंक पोस्ट करें और इसे संपादित किया जा सकता Noneहै, जो आप सोचते हैं वह नहीं कर रहे हैं, इसका मतलब है कि 'डिफ़ॉल्ट का उपयोग करें'।
ताकसेलवेल

मैंने 'कोई नहीं' के बजाय संख्याओं को जोड़ने की कोशिश की, लेकिन इससे प्रोलेम हल नहीं हुआ।
user3006135

4
plt.subplots_adjust(wspace=0, hspace=0)आपकी समस्या का समाधान करेगा, क्या यह इस तथ्य के लिए नहीं था कि आप 'equal'पहलू का उपयोग करते हैं । विवरण के लिए मेरा उत्तर देखें।
अप्पनू

जवाबों:


100

कुल्हाड़ियों के बीच अंतर को नियंत्रित करने के लिए आप ग्रिडस्पीक का उपयोग कर सकते हैं । यहाँ अधिक जानकारी है।

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

plt.figure(figsize = (4,4))
gs1 = gridspec.GridSpec(4, 4)
gs1.update(wspace=0.025, hspace=0.05) # set the spacing between axes. 

for i in range(16):
   # i = i + 1 # grid spec indexes from 0
    ax1 = plt.subplot(gs1[i])
    plt.axis('on')
    ax1.set_xticklabels([])
    ax1.set_yticklabels([])
    ax1.set_aspect('equal')

plt.show()

कुल्हाड़ियों बहुत करीब एक साथ


35
इसके लिए सीमित नहीं है GridSpec, यदि आप निर्माण पर आंकड़ा हड़पने के साथ आप भी दूरी तय कर सकते हैं:fig.subplots_adjust(hspace=, wspace=)
Rutger Kassies

3
forलूप में अंतिम पंक्ति का क्या मतलब है?
सिप्रियन टोमोयाग

यह एक बहुत अच्छा टिप है, लेकिन यह उपयोग नहीं करता है subplotsइस जवाब को त्याग के बिना काम मिलता है subplots
विज्क्लकाउन

वहाँ क्षैतिज रिक्ति निकालें एक रास्ता है केवल कुल्हाड़ियों की पहली और दूसरी पंक्तियों के बीच?
स्टेफानो

136

समस्या का उपयोग है aspect='equal', जो सबप्लॉट्स को एक मनमाना पहलू अनुपात तक खींचने और सभी खाली जगह को भरने से रोकता है।

आम तौर पर, यह काम करेगा:

import matplotlib.pyplot as plt

ax = [plt.subplot(2,2,i+1) for i in range(4)]

for a in ax:
    a.set_xticklabels([])
    a.set_yticklabels([])

plt.subplots_adjust(wspace=0, hspace=0)

परिणाम यह है:

हालाँकि, aspect='equal'निम्न कोड में , के साथ :

import matplotlib.pyplot as plt

ax = [plt.subplot(2,2,i+1) for i in range(4)]

for a in ax:
    a.set_xticklabels([])
    a.set_yticklabels([])
    a.set_aspect('equal')

plt.subplots_adjust(wspace=0, hspace=0)

यह वही है जो हमें मिलता है:

इस दूसरे मामले में अंतर यह है कि आपने x- और y-axes को समान संख्या में इकाइयों / पिक्सेल के लिए मजबूर किया है। चूंकि अक्षों को डिफ़ॉल्ट रूप से 0 से 1 तक जाता है (यानी, इससे पहले कि आप कुछ भी प्लॉट करें), aspect='equal'प्रत्येक अक्ष को एक वर्ग होने के लिए मजबूर करता है। चूंकि आंकड़ा एक वर्ग नहीं है, इसलिए पाइलप क्षैतिज रूप से कुल्हाड़ियों के बीच अतिरिक्त रिक्ति में जोड़ता है।

इस समस्या को हल करने के लिए, आप सही पहलू अनुपात के लिए अपना आंकड़ा निर्धारित कर सकते हैं। हम यहां ऑब्जेक्ट-ओरिएंटेड pyplot इंटरफ़ेस का उपयोग करने जा रहे हैं, जिसे मैं सामान्य रूप से बेहतर मानता हूं:

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(8,8)) # Notice the equal aspect ratio
ax = [fig.add_subplot(2,2,i+1) for i in range(4)]

for a in ax:
    a.set_xticklabels([])
    a.set_yticklabels([])
    a.set_aspect('equal')

fig.subplots_adjust(wspace=0, hspace=0)

यहाँ परिणाम है:


3
धन्यवाद! आपका उत्तर सरल है और पूरी तरह से काम करता है। plt.subplots_adjust(wspace=0, hspace=0)
मोहम्मदीज

35

सहारा के बिना gridspec पूरी तरह से, निम्नलिखित भी निर्धारित करके अंतराल को दूर करने के लिए इस्तेमाल किया जा सकता है wspace और hspace शून्य करने के लिए:

import matplotlib.pyplot as plt

plt.clf()
f, axarr = plt.subplots(4, 4, gridspec_kw = {'wspace':0, 'hspace':0})

for i, ax in enumerate(f.axes):
    ax.grid('on', linestyle='--')
    ax.set_xticklabels([])
    ax.set_yticklabels([])

plt.show()
plt.close()

जिसके परिणामस्वरूप:

।


4

क्या आपने कोशिश की है plt.tight_layout()?

इसके plt.tight_layout() यहां छवि विवरण दर्ज करें बिना: यहां छवि विवरण दर्ज करें

या: कुछ इस तरह (उपयोग add_axes)

left=[0.1,0.3,0.5,0.7]
width=[0.2,0.2, 0.2, 0.2]
rectLS=[]
for x in left:
   for y in left:
       rectLS.append([x, y, 0.2, 0.2])
axLS=[]
fig=plt.figure()
axLS.append(fig.add_axes(rectLS[0]))
for i in [1,2,3]:
     axLS.append(fig.add_axes(rectLS[i],sharey=axLS[-1]))    
axLS.append(fig.add_axes(rectLS[4]))
for i in [1,2,3]:
     axLS.append(fig.add_axes(rectLS[i+4],sharex=axLS[i],sharey=axLS[-1]))
axLS.append(fig.add_axes(rectLS[8]))
for i in [5,6,7]:
     axLS.append(fig.add_axes(rectLS[i+4],sharex=axLS[i],sharey=axLS[-1]))     
axLS.append(fig.add_axes(rectLS[12]))
for i in [9,10,11]:
     axLS.append(fig.add_axes(rectLS[i+4],sharex=axLS[i],sharey=axLS[-1]))

यदि आपको कुल्हाड़ियों को साझा करने की आवश्यकता नहीं है, तो बस axLS=map(fig.add_axes, rectLS) यहां छवि विवरण दर्ज करें


मैंने तंग लेआउट की कोशिश की, लेकिन यह अंतराल से छुटकारा नहीं मिला, जो मुझे चाहिए। ग्रिडस्पेक समाधान ने काम किया। सुझाव के लिए धन्यवाद।
user3006135

इसने अन्य सुझावों के साथ मिलकर काम किया। tight_layout () ने सफेद स्थान को ऊपर और उस भूखंड के किनारों को हटाने में मदद की जो बिना किसी उद्देश्य के काम करता था।
डीसीपी

0

हाल के matplotlib संस्करणों के साथ आप विवश लेआउट को आज़माना चाहते हैं । plt.subplot()हालांकि यह काम नहीं करता है , इसलिए आपको plt.subplots()इसके बजाय उपयोग करने की आवश्यकता है :

fig, axs = plt.subplots(4, 4, constrained_layout=True)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.