pyplot: изменить ncols в легенде

Я рисую большой набор данных и некоторые регрессии в pyplot. Данные окрашены в соответствии с дополнительным значением. Я решил установить количество столбцов в легенде равным 2.

Это выглядит хорошо для точек данных, но для регрессии я хотел бы вернуться к ncols=1. Можно ли это сделать в рамках одной легенды?

(Знаю, я мог бы объявить две легенды, но я хотел бы избежать этого...)


person Tyrax    schedule 28.07.2013    source источник
comment
Не уверен, что понимаю, о чем вы спрашиваете. Вам нужна легенда, состоящая из двух столбцов и первого столбца?   -  person tacaswell    schedule 28.07.2013
comment
В яблочко. Некоторые метки очень короткие, то есть всего одна цифра, некоторые намного длиннее.   -  person Tyrax    schedule 29.07.2013
comment
На 90% уверен, что это невозможно сделать с помощью одной легенды.   -  person tacaswell    schedule 29.07.2013
comment
Хорошо, я попробую создать две легенды, похожие на одну. Надо еще понять как...   -  person Tyrax    schedule 29.07.2013
comment
Возможно, стоит отправить по электронной почте списки рассылки mpl, основные разработчики (которые точно смогут ответить на этот вопрос) не смотрят SO.   -  person tacaswell    schedule 29.07.2013


Ответы (1)


Легенда в matplotlib представляет собой набор OffsetBox. В принципе, вы можете изменить «ncol» в легенде, вручную переставив эти поля смещения. Конечно, это требует некоторого знания внутреннего устройства matplotlib и будет сложно для обычных пользователей. Не знаю, как лучше это показать. Вот простой код, который создает две легенды и объединяет их в одну.

import matplotlib.pyplot as plt
import matplotlib.legend as mlegend

ax = plt.subplot(111)
l1, = ax.plot([1,2,3])

leg1 = ax.legend([l1], ["long lable"], ncol=1)

leg2 = mlegend.Legend(ax, [l1, l1, l1, l1], tuple("1234"), ncol=2)

leg1._legend_box._children.append(leg2._legend_box._children[1])
leg1._legend_box.align="left" # the default layout is 'center'

plt.show()
person Jae-Joon Lee    schedule 06.08.2013
comment
Отлично, это довольно близко к тому, что я имел в виду. Большое спасибо. - person Tyrax; 07.08.2013