Подтвердить что ты не робот

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

Ответ 1

Вы можете использовать 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

Ответ 2

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

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