Как удалить пробелы между подзаголовками в matplotlib?


приведенный ниже код создает промежутки между подзаголовками. Как удалить пробелы между подзаголовками и сделать изображение плотной сеткой?

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

4 ответа:

можно использовать 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.subp

plt.show()

axes very close together

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

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

не прибегая 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()

в результате:

.

ты пробовал plt.tight_layout()?

С plt.tight_layout() enter image description here без него: enter image description here

или: что-то вроде этого (использовать 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) enter image description here