Мне грозит проблема с изображением двух легенд за пределами сюжета. Показаны несколько легенд внутри участок прост - его описание описано в документе 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)
...
И результат:
Как вы можете видеть, вторая легенда обрезано. Мой вывод заключается в том, что Matplotlib игнорирует размер и положение объектов, дополненное
plt.gca().add_artist(obj)
Как я могу это исправить?
До сих пор я нашел решение, но его очень неприятный:
Создать три легенды, два из них, как additiontal (добавленный add_artist) и один в качестве нормальной легенды. Что касается Matplotlib уважать позицию и размер нормальных легенд, переместите его в правом нижнем углу и скрыть его с кодом:
leg.get_frame().set_alpha(0)
Вот результаты (без установки альфа для примера цели):
Он ведет себя именно так, как я хочу этого, но поскольку вы знаете его противный. Вот окончательный код:
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')
Это сделало трюк почти идеально. Я просто должен был внести некоторые корректировки в положение легенд и график сюжета, но он полностью соответствовал моим потребностям. Благодаря! –