2013-11-18 4 views
46

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

enter image description here

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

пост ссылку и может быть отредактирована в 'None' не делать то, что вы думаете, это означает«использовать по умолчанию».. – tacaswell

+0

Я попытался добавить числа вместо «Нет», но это не решило пролема. – user3006135

+0

'plt.subplots_adjust (wspace = 0, hspace = 0)' решит вашу проблему, если бы не тот факт, что вы используете «равный» аспект. См. Мой ответ для деталей. – Thucydides411

ответ

49

Вы можете использовать gridspec для управления расстоянием между осями. Здесь больше information.

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

+10

Его не ограничивает «GridSpec», если вы захватите фигуру при создании, вы также можете установить расстояния с помощью: 'fig.subplots_adjust (hspace =, wspace =)' –

+0

, что означает последняя строка в цикле 'for' для быть? –

2

Вы пробовали 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

+0

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

42

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

Этот это то, что мы получаем:

Разница во втором случае является то, что вы вынуждены х- и у-оси, чтобы иметь одинаковое количество единиц/пиксел. Так как оси по умолчанию идут от 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) 

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

+1

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

5

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

Результирующее в:

.