Subtítulos de categorías dentro de la leyenda personalizada matplotlib

Tengo una figura que se parece a esto:

introduzca la descripción de la imagen aquí

Me gustaría hacer una leyenda que se vea así:

introduzca la descripción de la imagen aquí

¿Cómo puedo hacer eso?


ACTUALIZAR:

Tenga en cuenta que esta leyenda tiene un marco con un edgecolor: una respuesta válida incluirá esto. La leyenda también debe estar incrustada en los ejes.

La leyenda que quiero podría no ser alcanzable usando ax.legend() . Una buena respuesta sería una que muestre cómo construir mi leyenda deseada (exactamente como se muestra) manualmente con parches y textos, o cualquier método de matplotlib que tenga sentido.

Encabezados separados para las líneas D y A:

 from matplotlib.pyplot import * ds = [1,2,3] dc = [1.1, 1.9, 3.2] asim = [1.5, 2.2, 3.1] ac = [1.6, 2.15, 3.1] categories = ['simulated', 'calculated'] p1, = plot(ds, 'ko', label='D simulated') p2, = plot(dc, 'k:', label='D calculated') p3, = plot(asim, 'b+', label='A simulated') p4, = plot(ac, 'b-', label='A calculated') p5, = plot([0], marker='None', linestyle='None', label='dummy-tophead') p7, = plot([0], marker='None', linestyle='None', label='dummy-empty') leg3 = legend([p5, p1, p2, p5, p3, p4], [r'$D_{etc}$'] + categories + [r'$A_{etc}$'] + categories, loc=2, ncol=2) # Two columns, vertical group labels leg4 = legend([p5, p7, p5, p7, p1, p2, p3, p4], [r'$D_{etc}$', '', r'$A_{etc}$', ''] + categories + categories, loc=4, ncol=2) # Two columns, horizontal group labels gca().add_artist(leg3) #If there isn't a big empty spot on the plot, two legends: #leg1 = legend([p1, p2], categories, title='D_etc', loc=0) #leg2 = legend([p3, p4], categories, title='A_etc', loc=4) #gca().add_artist(leg2) show() 

Dos opciones para una leyenda agrupada.