2013-11-23 3 views
4

Я пытаюсь справиться с matplotlib. Мне трудно понять, как добавить подзаголовки, когда форма сетки уже существует.Добавить подзаголовок к существующему рисунку?

Так, например, если я создаю фигуру с сеткой 2 * 2 подзаголовков, как я могу добавить 5-й или 6-й. т. е. как я могу изменить геометрию для размещения другого подзаголовка. Если я делаю это:

x = np.linspace(0, 2 * np.pi, 400) 
y = np.sin(x ** 2) 
f, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, sharex=True, sharey=True, facecolor='red', \ 
dpi = 100, edgecolor = 'red', linewidth = 5.0, frameon = True) 
ax1.plot(x, y) 
ax1.set_title('Sharing x per column, y per row') 
ax2.scatter(x, y) 
ax3.scatter(x, 2 * y ** 2 - 1, color='r') 
ax4.plot(x, 2 * y ** 2 - 1, color='r') 

, а затем я хочу добавить еще один сюжетные ниже:

f.add_subplot(3, 2, 5) 

Тогда новый сюжетные перекрывается с четвертой, когда я хочу, расположенный ниже, очевидно. Нужно ли менять геометрию? Если да, то как? Или это просто позиция?

В целом, что происходит с ** kwargs с подзаголовком? Если кто-то может помочь мне разобраться, как начать использовать их, это тоже будет очень удобно.

ответ

1

Я думаю, что ваша интуиция в том, что вы должны изменить геометрию макета сюжета правильно. Вы начинаете с задания геометрии (2,2), которая представляет собой 2 строки и 2 столбца, поэтому естественное добавление 5-го графика обычными способами может вызвать некоторые проблемы. Существует несколько способов обойти это, но одно из простых решений - просто дать себе большую сетку подзаголовка, используя третий ряд графиков - используя геометрию (3,2), как в моем примере ниже:

%pylab inline 
import numpy as np 
x = np.linspace(0, 2 * np.pi, 400) 
y = np.sin(x ** 2) 
#probably easiest to add a third row of plots (3,2) at this stage: 
f, ((ax1, ax2), (ax3, ax4),(ax5,ax6)) = plt.subplots(3, 2, sharex=True, sharey=True, facecolor='red', \ 
dpi = 100, edgecolor = 'red', linewidth = 5.0, frameon = True) 
ax1.plot(x, y) 
ax1.set_title('Sharing x per column, y per row') 
ax2.scatter(x, y) 
ax3.scatter(x, 2 * y ** 2 - 1, color='r') 
ax4.plot(x, 2 * y ** 2 - 1, color='r') 
#now the fifth plot shouldn't clobber one of the others: 
ax5.plot(x,y**3,color='g') 

enter image description here

Если вы хотите, чтобы пятый участок, чтобы занять весь нижний ряд, а не имея пустой 6-й участок там вы можете использовать более продвинутые варианты, как matplotlib.gridspec описанных в gridspec documentation.

+0

Спасибо. Я предполагаю, что это просто означает, что вам нужно быть более организованным, создавая фигуры, то есть не делая вещи на лету! предположительно, я мог бы удалить подзаголовок 5 и 6, если впоследствии они казались ненужными .... –