Tengo un problema en el que algunos formatos de texto matemático hacen que algunas etiquetas ocupen más espacio vertical que otras, lo que hace que no se alineen cuando se colocan en dos columnas en la leyenda. Esto es particularmente importante porque las filas también se usan para indicar datos relacionados.
Aquí hay un ejemplo:
import matplotlib as mpl import matplotlib.pyplot as plt import matplotlib.mathtext as mathtext mpl.rc("font", family="Times New Roman",weight='normal') plt.rcParams.update({'mathtext.default': 'regular' }) plt.plot(1,1, label='A') plt.plot(2,2, label='B') plt.plot(3,3, label='C') plt.plot(4,4,label='$A_{x}^{y}$') plt.plot(5,5,label='$B_{x}^{y}$') plt.plot(6,6,label='$C_{x}^{y}$') plt.legend(fontsize='xx-large', ncol=2) plt.show() Esto genera una figura como esta: 
Por un tiempo, pude "fingir" un poco agregando algunos subíndices y superíndices vacíos, sin embargo, esto solo funciona cuando la trama se exporta a pdf. No parece funcionar al exportar a png. ¿Cómo puedo extender la primera columna de etiquetas para que se alineen con la segunda columna?
Puede establecer el argumento de la palabra clave handleheight en un número que sea lo suficientemente grande como para que la altura del controlador sea mayor que el espacio que ocupa la fuente. Esto hace que el texto aparezca alineado. Hacerlo puede requerir establecer el espacio entre labelspacing en un número pequeño, para que la leyenda no parezca demasiado grande.
plt.legend(fontsize='xx-large', ncol=2,handleheight=2.4, labelspacing=0.05)El inconveniente de este método, como se puede ver en la imagen, es que las líneas se desplazan hacia arriba en comparación con la línea base del texto. Probablemente dependerá del caso de uso si esto es aceptable o no.
En caso de que no lo sea, hay que profundizar un poco más. Las siguientes subclases HandlerLine2D (que es el controlador de líneas) para establecer una posición ligeramente diferente para las líneas. Según el tamaño total de la leyenda, el tamaño de la fuente, etc., sería necesario adaptar el número xx en la clase SymHandler .
from matplotlib.legend_handler import HandlerLine2D import matplotlib.lines class SymHandler(HandlerLine2D): def create_artists(self, legend, orig_handle,xdescent, ydescent, width, height, fontsize, trans): xx= 0.6*height return super(SymHandler, self).create_artists(legend, orig_handle,xdescent, xx, width, height, fontsize, trans) leg = plt.legend(handler_map={matplotlib.lines.Line2D: SymHandler()}, fontsize='xx-large', ncol=2,handleheight=2.4, labelspacing=0.05)