Вращение легенды или добавление патча к метке оси в matplotlib

У меня есть необычный сценарий использования matplotlib, который я пытаюсь решить. У меня есть пара осей, созданных с помощьюtwinx(), Каждый содержит ровно один линейный объект с разными стилями. Вместо того, чтобы иметь обычную легенду, я должен добавить патч, который представляет каждую линию к метке y каждой оси. Вот что я пытаюсь достичь:

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

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

# 1: Использование смещенных легенд

from matplotlib import pyplot as plt
fig = plt.figure()
ax = fig.subplots(111)
ax = fig.add_subplot(111)
ax2 = ax.twinx()
l1, = ax.plot((0, 1), (1, 0), linestyle='-', color='blue')
l2, = ax.plot((0, 1), (0, 1), linestyle='--', color='red')
leg1 = ax.legend([l1], ['Solid Blue Line'], bbox_to_anchor=(-0.102, 0., 0.102, 1.), frameon=False, mode='expand', loc=4)
leg2 = ax2.legend([l2], ['Dashed Red Line'], bbox_to_anchor=(1.102, 0., 0.102, 1.), frameon=False, mode='expand', loc=3)

Как и ожидалось, это правильно размещает легенды, но не вращает их. Я не могу выполнить вращение, потому что, по-видимому, легенды не могут вращаться, несмотря наArtist расширения. Например.,leg1.set_transform(leg1.get_transform() + Affine2D().rotate_deg(-90)) не делает ничего, чтобы изменить угол легенды:

# 2 Использование собственного AnchoredOffsetBox

При таком подходе я попытался создать собственное поле, содержащее текст и патч. К сожалению, патч не отображается должным образом.

from matplotlib import pyplot as plt
from matplotlib.lines import Line2D
from matplotlib.offsetbox import AnchoredOffsetbox, TextArea, DrawingArea, HPacker
from matplotlib.transform import Affine2D

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot([1, 2, 3], [0, 3, -1], color='g', linestyle='solid')
textArea = TextArea('This is an x-label')
drawArea = DrawingArea(1., 1.)
patch = Line2D((0, 1), (0, 1), color='g', linestyle='solid')
drawArea.add_artist(patch)
content = HPacker(children=[textArea, drawArea], align="center", pad=0, sep=5)
label = AnchoredOffsetbox(loc=10, child=content, pad=0, bbox_to_anchor=(0.5, -0.1), bbox_transform=ax.transAxes, frameon=False)
ax.add_artist(label)
label.set_transform(label.get_transform() + Affine2D().rotate_deg(-90))

Опять вращение вообще не работает. Кроме того, патч не масштабируется разумно, как это было бы в записи легенды (обратите внимание на крошечную зеленую точку в конце метки):

Можно ли добиться чего-то похожего на результат, которого я желаю в MatPlotLib? Я готов вникать в исходный код и, возможно, представить PR, если он поможет, но у меня нет четкого представления о том, с чего начать.

ОБНОВИТЬ

Глядя на исходный код,set_transform методыmatplotlib.offsetbox.TextArea а такжеmatplotlib.offsetbox.DrawingArea полностью игнорируются. Это означает, что моя вторая попытка была бы бессмысленной, даже если бы я заставил патч правильно рисовать.

Ответы на вопрос(1)

Ваш ответ на вопрос