Как удалить пробелы между подзаголовками в 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

Я попытался добавить числа вместо «Нет», но это не решило проблему.
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)

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


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


Я попробовал плотную разметку, но не избавился от зазоров, чего я и хотел. Решение gridspec сработало. Спасибо за предложения.
user3006135

Это отлично сработало в сочетании с другими предложениями. tight_layout () помогла удалить пустое пространство сверху и по бокам графика, которое не служило никакой цели.
D, возможно,

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.