Leyenda giratoria o agregar parche a la etiqueta del eje en matplotlib

Tengo un caso de uso inusual en matplotlib que estoy tratando de resolver. Tengo un par de ejes creados usandotwinx(). Cada uno contiene exactamente un objeto de línea, con diferentes estilos. En lugar de tener una leyenda convencional, debo agregar un parche que represente cada línea a la etiqueta y de cada eje. Esto es lo que estoy tratando de lograr:

Idealmente, el parche estaría por encima del texto, pero ese es un detalle muy pequeño en comparación con el logro del resultado deseado.

He intentado dos enfoques para este problema, los cuales terminaron en fracaso. Quizás un gurú matplotlib pueda ayudar:

# 1: uso de leyendas desplazadas

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)

Como se esperaba, esto coloca las leyendas correctamente, pero no las rota. No puedo llevar a cabo la rotación porque aparentemente las leyendas no pueden rotarse, a pesar de serArtist extensiones P.ej.,leg1.set_transform(leg1.get_transform() + Affine2D().rotate_deg(-90)) no hace nada para cambiar el ángulo de la leyenda:

# 2 Usando un AnchoredOffsetBox personalizado

En este enfoque, intenté construir un cuadro personalizado que contenga un texto y un parche. Desafortunadamente, el parche no se muestra correctamente.

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))

Nuevamente, la rotación no funciona en absoluto. Además, el parche no está escalado razonablemente como lo estaría en una entrada de leyenda (observe el pequeño punto verde al final de la etiqueta):

¿Es posible lograr algo como el resultado que deseo en MatPlotLib? Estoy dispuesto a profundizar en el código fuente y posiblemente enviar un RP si me ayuda, pero no tengo una idea clara de por dónde empezar.

ACTUALIZAR

Mirando el código fuente, elset_transform métodos dematplotlib.offsetbox.TextArea ymatplotlib.offsetbox.DrawingArea son completamente ignorados Esto significa que mi segundo intento sería inútil incluso si tuviera que dibujar el parche correctamente.

Respuestas a la pregunta(1)

Su respuesta a la pregunta