2016-03-01 2 views
2

Мне грозит проблема с изображением двух легенд за пределами сюжета. Показаны несколько легенд внутри участок прост - его описание описано в документе matplotlib doc с примерами. Даже показ одной легенды за пределами участка довольно прост, как я нашел здесь в stackoverflow (например, here). Но я не могу найти рабочий пример, чтобы показать две легенды за пределами сюжета. Методы, которые работают с одной легендой, в этом случае не работают.matplotlib две легенды из сюжета

Вот пример. Прежде всего базового кода:

import matplotlib.pyplot as plt 
import matplotlib.patches as patches 
from matplotlib.lines import Line2D 
from matplotlib.font_manager import FontProperties 

fig1 = plt.figure(figsize=(17,5)) 
fontP = FontProperties() 
fontP.set_size('small') 
ax1 = fig1.add_subplot(111, aspect='equal') 
ax1.grid() 


# stuff for legend 
rec1 = patches.Rectangle(
    (0.9, 0.25), # (x,y) 
    0.1,   # width 
    0.1,   # height 
    label='rectangle', 
    **{ 
     'color': 'blue' 
    } 

) 
ax1.add_patch(rec1) 

leg = plt.legend(handles=[rec1], bbox_to_anchor=(0.7, -0.1)) 
fig1.savefig('sample1.png', dpi=90, bbox_inches='tight') 

Но теперь я хочу, чтобы нарисовать еще одну легенду на правой стороне участка. Вот код:

... 
ax1.add_patch(rec1) 

l1 = plt.legend(prop=fontP, handles=[rec1], loc='center left', 
       box to_anchor=(1.0, 0.5)) 
plt.gca().add_artist(l1) 

... 

И результат:

Second, truncated legend

Как вы можете видеть, вторая легенда обрезано. Мой вывод заключается в том, что Matplotlib игнорирует размер и положение объектов, дополненное

plt.gca().add_artist(obj) 

Как я могу это исправить?

До сих пор я нашел решение, но его очень неприятный:

Создать три легенды, два из них, как additiontal (добавленный add_artist) и один в качестве нормальной легенды. Что касается Matplotlib уважать позицию и размер нормальных легенд, переместите его в правом нижнем углу и скрыть его с кодом:

leg.get_frame().set_alpha(0) 

Вот результаты (без установки альфа для примера цели):

Three legends out of plot

Он ведет себя именно так, как я хочу этого, но поскольку вы знаете его противный. Вот окончательный код:

import matplotlib.pyplot as plt 
import matplotlib.patches as patches 
from matplotlib.lines import Line2D 
from matplotlib.font_manager import FontProperties 

fig1 = plt.figure(figsize=(17,5)) 
fontP = FontProperties() 
fontP.set_size('small') 
ax1 = fig1.add_subplot(111, aspect='equal') 
ax1.grid() 

# stuff for additional legends 
rec1 = patches.Rectangle(
    (0.9, 0.25), # (x,y) 
    0.1,   # width 
    0.1,   # height 
    label='rectangle', 
    **{ 
     'color': 'blue' 
    } 
) 
ax1.add_patch(rec1) 

# example additional legends 
l1 = plt.legend(prop=fontP, handles=[rec1], loc='center left', 
bbox_to_anchor=(1.0, 0.5)) 
l2 = plt.legend(prop=fontP, handles=[rec1], loc=3, bbox_to_anchor=(0.4, 
-0.2)) 

# add legends 
plt.gca().add_artist(l1) 
plt.gca().add_artist(l2) 

# add third legend 
leg = plt.legend(handles=[], bbox_to_anchor=(1.3, -0.3)) 
leg.get_frame().set_alpha(0) # hide legend 

fig1.savefig('sample3.png', dpi=90, bbox_inches='tight') 

ответ

3

я могу предложить следующее решение:

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.gridspec as gridspec 

fig = plt.figure() 
fig.set_size_inches((10,10)) 

gs1 = gridspec.GridSpec(1, 1) 
ax1 = fig.add_subplot(gs1[0]) 

x = np.arange(0.0, 3.0, 0.02) 
y1 = np.sin(2*np.pi*x) 
y2 = np.exp(-x) 
l1, l2 = ax1.plot(x, y1, 'rs-', x, y2, 'go') 

y3 = np.sin(4*np.pi*x) 
y4 = np.exp(-2*x) 
l3, l4 = ax1.plot(x, y3, 'yd-', x, y4, 'k^') 

fig.legend((l1, l2), ('Line 1', 'Line 2'), "right") 
fig.legend((l3, l4), ('Line 3', 'Line 4'), "lower center") 

gs1.tight_layout(fig, rect=[0, 0.1, 0.8, 0.5]) 

Я использовал пример с сайта Matplotlib и следовал документацию о плотной компоновки http://matplotlib.org/users/tight_layout_guide.html.

Результат

+0

Это сделало трюк почти идеально. Я просто должен был внести некоторые корректировки в положение легенд и график сюжета, но он полностью соответствовал моим потребностям. Благодаря! –

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