Как удалить пробелы между подзаголовками в 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 ответа:
можно использовать 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()
проблема заключается в использовании
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()
без него:или: что-то вроде этого (использовать
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)