Как удалить пробелы между подзаголовками в 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()
пользователь3006135
источник
2
разместите ссылку, и ее можно будет отредактировать. NoneЭто не то, что вы думаете, это означает «использовать значение по умолчанию».
tacaswell
Я попытался добавить числа вместо «Нет», но это не решило проблему.
user3006135
4
plt.subplots_adjust(wspace=0, hspace=0)решила бы вашу проблему, если бы не то, что вы используете 'equal'аспект. Подробности смотрите в моем ответе.
apdnu

Ответы:

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

топоры очень близко друг к другу

Молли
источник
36
Это не ограничивается тем 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 добавляет дополнительный интервал между осями по горизонтали.

Чтобы обойти эту проблему, вы можете настроить фигуру на правильное соотношение сторон. Мы собираемся использовать здесь объектно-ориентированный интерфейс 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)

Вот результат:

apdnu
источник
3
Спасибо! ваш ответ прост и работает отлично. plt.subplots_adjust(wspace=0, hspace=0)
MohamedEzz
37

Не прибегая полностью к 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) введите описание изображения здесь

CT Zhu
источник
Я попробовал плотную разметку, но не избавился от зазоров, чего я и хотел. Решение gridspec сработало. Спасибо за предложения.
user3006135
Это отлично сработало в сочетании с другими предложениями. tight_layout () помогла удалить пустое пространство сверху и по бокам графика, которое не служило никакой цели.
D, возможно,
0

В последних версиях matplotlib вы можете попробовать ограниченный макет . Однако это не работает plt.subplot(), поэтому вам нужно plt.subplots()вместо этого использовать :

fig, axs = plt.subplots(4, 4, constrained_layout=True)
Мишель де Руйтер
источник