จะลบช่องว่างระหว่างพล็อตย่อยใน matplotlib ได้อย่างไร?


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ไม่ได้ทำอย่างที่คุณคิดหมายความว่า 'ใช้ค่าเริ่มต้น'
tacaswell

ฉันพยายามเพิ่มตัวเลขแทน 'ไม่มี' แต่สิ่งนี้ไม่สามารถแก้ปัญหาของ prolem ได้
user3006135

4
plt.subplots_adjust(wspace=0, hspace=0)จะแก้ปัญหาของคุณได้ไม่ใช่เพราะคุณใช้'equal'แง่มุม ดูคำตอบของฉันสำหรับรายละเอียด
apdnu

คำตอบ:


100

คุณสามารถใช้gridspecเพื่อควบคุมระยะห่างระหว่างแกน มีข้อมูลเพิ่มเติมที่นี่

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()

แกนใกล้กันมาก


36
ไม่ จำกัด เฉพาะGridSpecหากคุณจับร่างที่สร้างคุณสามารถกำหนดระยะทางได้ด้วย:fig.subplots_adjust(hspace=, wspace=)
Rutger Kassies

3
บรรทัดสุดท้ายในforลูปหมายถึงอะไร?
Ciprian Tomoiagă

นี่คือเคล็ดลับที่ดีมาก subplotsแต่ก็ไม่ได้ใช้ คำตอบนี้subplotsได้รับงานทำโดยไม่ต้องเสียสละ
wizclown

มีวิธีลบระยะห่างในแนวนอนเฉพาะระหว่างแกนแถวแรกและแถวที่สองหรือไม่?
Stefano

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 มีจำนวนหน่วย / พิกเซลเท่ากัน เนื่องจากแกนจะเปลี่ยนจาก 0 เป็น 1 โดยค่าเริ่มต้น (กล่าวคือก่อนที่คุณจะลงจุดใด ๆ ) โดยใช้aspect='equal'บังคับให้แต่ละแกนเป็นสี่เหลี่ยมจัตุรัส เนื่องจากรูปไม่ได้เป็นรูปสี่เหลี่ยมจัตุรัส pyplot จึงเพิ่มระยะห่างระหว่างแกนในแนวนอน

เพื่อแก้ไขปัญหานี้คุณสามารถตั้งค่าให้รูปของคุณมีอัตราส่วนภาพที่ถูกต้อง เราจะใช้อินเทอร์เฟซ 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)
MohamedEzz

36

หากไม่ใช้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) ใส่คำอธิบายภาพที่นี่


ฉันลองเลย์เอาท์ที่แน่นหนา แต่มันไม่ได้กำจัดช่องว่างซึ่งเป็นสิ่งที่ฉันต้องการ โซลูชัน gridspec ใช้งานได้ ขอบคุณสำหรับคำแนะนำ
user3006135

สิ่งนี้ใช้ได้ดีร่วมกับคำแนะนำอื่น ๆ tight_layout () ช่วยลบช่องว่างด้านบนและด้านข้างของพล็อตที่ไม่มีจุดประสงค์
DChaps

0

กับรุ่น matplotlib ล่าสุดที่คุณอาจต้องการที่จะพยายามจำกัด การเค้าโครง อย่างไรก็ตามสิ่งนี้ใช้ไม่ได้plt.subplot()ดังนั้นคุณต้องใช้plt.subplots()แทน:

fig, axs = plt.subplots(4, 4, constrained_layout=True)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.