2014-04-05 3 views
10

Возможно ли установить размер/положение подзаголовка matplotlib после создания осей? Я знаю, что я могу сделать:Изменение размера или положения подзаголовка matplotlib после создания осей

import matplotlib.pyplot as plt 

ax = plt.subplot(111) 
ax.change_geometry(3,1,1) 

чтобы поставить оси в верхнем ряду из трех. Но я хочу, чтобы оси охватывали первые две строки. Я пробовал:

import matplotlib.gridspec as gridspec 

ax = plt.subplot(111) 
gs = gridspec.GridSpec(3,1) 
ax.set_subplotspec(gs[0:2]) 

но оси все еще заполняют все окно.

Обновление для ясности Я хочу изменить положение существующего экземпляра осей, а не устанавливать его при его создании. Это связано с тем, что размер осей будет изменяться каждый раз, когда я добавляю данные (вывод данных на карту с использованием картографии). Карта может оказаться высокой и узкой, или короткой и широкой (или что-то среднее). Таким образом, решение о расположении сетки произойдет после функции построения графика.

ответ

8

Благодаря Молли указал мне в правильном направлении, у меня есть решение:

import matplotlib.pyplot as plt 
import matplotlib.gridspec as gridspec 

fig = plt.figure() 

ax = fig.add_subplot(111) 

gs = gridspec.GridSpec(3,1) 
ax.set_position(gs[0:2].get_position(fig)) 
ax.set_subplotspec(gs[0:2])    # only necessary if using tight_layout() 

fig.add_subplot(gs[2]) 

fig.tight_layout()      # not strictly part of the question 

plt.show() 
3

Вы можете создать фигуру с одной сюжетные, которая охватывает две строки и один сюжетные, который охватывает одну строку, используя rowspan аргумент subplot2grid:

import matplotlib.pyplot as plt 

fig = plt.figure() 
ax1 = plt.subplot2grid((3,1), (0,0), rowspan=2) 
ax2 = plt.subplot2grid((3,1), (2,0)) 
plt.show() 

enter image description here

Если вы хотите изменить размер подзаговоре и после того, как он был создан, вы можете использовать метод set_position.

ax1.set_position([0.1,0.1, 0.5, 0.5]) 

Это не поможет вам создать фигуру, которую вы описали.

+0

Спасибо Молли. Это выглядит как ax.set_position (plt.subplot (gs [0: 2]). Get_position()) должен делать то, что я хочу. – RuthC

+0

ax.set_position() работает, но дополнительный вызов plt.subplot() в моем предыдущем комментарии полезен, если вам нужен пустой сюжет! – RuthC

1

Вы можете избежать ax.set_position() с помощью fig.tight_layout() вместо которой пересчитывает новый gridspec:

import matplotlib.pyplot as plt 
import matplotlib.gridspec as gridspec 

# create the first axes without knowing of further subplot creation 
fig, ax = plt.subplots() 
ax.plot(range(5), 'o-') 

# now update the existing gridspec ... 
gs = gridspec.GridSpec(3, 1) 
ax.set_subplotspec(gs[0:2]) 
# ... and recalculate the positions 
fig.tight_layout() 

# add a new subplot 
fig.add_subplot(gs[2]) 
fig.tight_layout() 
plt.show() 
Смежные вопросы