Як усунути прогалини між субплотами в 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

Я спробував додати цифри замість "None", але це не вирішило проблему.
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()

оси дуже близько один від одного


35
Це не обмежується GridSpec, якщо ви захопите фігуру при створенні, ви також можете встановити відстані за допомогою:fig.subplots_adjust(hspace=, wspace=)
Rutger Kassies

3
що означає останній рядок у forциклі?
Ciprian Tomoiagă

Це дуже приємна порада, але вона не використовується subplots. Ця відповідь виконує роботу, не жертвуючи subplots.
wizclown

Чи є спосіб усунути горизонтальний проміжок лише між першим та другим рядами осей?
Стефано

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, який, на мою думку, перевершую в цілому:

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

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) введіть тут опис зображення


Я спробував чітке розташування, але це не позбулося прогалин, чого я хочу. Рішення gridspec спрацювало. Дякую за пропозиції
user3006135

Це чудово працювало в поєднанні з іншими пропозиціями. щільно_лаут () допоміг видалити пробіл над і з боків ділянки, який не призначався.
DChaps

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.