2015-04-09 3 views
2

Я хочу переместить легенду фигуры с несколькими подвидениями в верхний центр относительно всей фигуры. Я попытался передать объект легенды, созданный с fig.legend, до fig.savefig, используя bbox_extra_artist, как описано here. Однако в отличие от описанной легенда получает отсечение:легенда Matplotlib относительно фигуры в множителе

enter image description here

Это код, который я использовал:

import matplotlib.pyplot as plt 
import numpy as np 

x = np.arange(-2*np.pi, 2*np.pi, 0.1) 
fig, axes = plt.subplots(nrows=5, ncols=3, sharex=True, sharey=False) 
legendLines = [] 
for rI, rA in enumerate(axes): 
    for cI, ax in enumerate(rA): 
     line, = ax.plot(x, np.sin(x), label='Sine') 
     legendLines.append(line) 
     line, = ax.plot(x, np.cos(x), label='Cosine') 
     legendLines.append(line) 
     line, = ax.plot(x, np.arctan(x), label='Inverse tan') 
     legendLines.append(line) 
     if cI == 0: 
      ax.set_ylabel('foo') 
     if rI == len(axes) -1: 
      ax.set_xlabel('bar') 
     if rI == 0: 
      ax.set_title('baz') 

legend = fig.legend(legendLines[:3], ['Sine', 'Cosine', 'Inverse Tan'], 'upper center', frameon=False, ncol=3, borderaxespad=-0.7) 
outFile = 'test.pdf' 
fig.set_size_inches(8,7) 
fig.tight_layout() 
fig.savefig(outFile, bbox_extra_artists=[legend], bbox_inches='tight') 
plt.close() 

Я ищу метод, который позволил мне определить легенду расположение относительно вся фигура не просто подстрока.

Update:

Если я заменяю

legend = fig.legend(legendLines[:3], ['Sine', 'Cosine', 'Inverse Tan'], 'upper center', frameon=False, ncol=3, borderaxespad=-0.7) 

с

legend = fig.legend(legendLines[:3], ['Sine', 'Cosine', 'Inverse Tan'], loc='lower center', frameon=False, ncol=3, bbox_to_anchor=(.5, 0.965)) 

результат тот же: площадь участка не увеличивается и легенда сдвигается от сюжета.

(система: Matplotlib-1.2.0-py2.7-MacOSX-10,8-Intel)

ответ

0

Обновление до последней версии matplotlib версии 1.4.3 решило проблему.

+0

Вы говорите, что даже с 'borderaxespad = -0.7' и без' bbox_to_anchor' в параметрах 'fig.legend' вы могли иметь легенду полностью захвачен в pdf? Потому что это не сработало для меня. – Primer

+0

Я думаю, 'bbox_to_anchor' - это путь. Однако, 'loc = 'верхний центр', frameon = False, ncol = 3, borderaxespad = 0' без' bbox_to_anchor' дает также желаемый результат. Thx для ваших намеков! – Faber

2

Если вы замените строку, которая создает легенду с этим одним:

legend = fig.legend(legendLines[:3], ['Sine', 'Cosine', 'Inverse Tan'], loc='lower center', frameon=False, ncol=3, bbox_to_anchor=(.5, 1.)) 

все, кажется, работа хорошо.

Даже если bbox_to_anchor=(0.5, 1.5) легенды сохраняются в формате PDF штраф:

enter image description here

Что может означать, что обновление Matplotlib до последней версии, скорее всего, чтобы решить эту проблему.

+0

Thx для вашего совета. К сожалению, не помогло. См. Обновление. – Faber

+0

Можете ли вы вставить выходные данные из этого: 'plt.rcParams ['savefig.pad_inches']' – Primer

+0

Вывод 'plt.rcParams ['savefig.pad_inches']' is '0.1' (до и после построения графика) – Faber

Смежные вопросы