Use texto pero no marcador en la leyenda de matplotlib

Estoy usando FontAwesome en mi gráfico, y cada punto de datos es un símbolo en la fuente FontAwesome, que se muestra como un icono. Por lo tanto, en la leyenda, me gustaría usar texto (símbolos en FontAwesome) para describir los elementos.

El código que estoy usando es como:

from matplotlib.patches import Patch import matplotlib.pyplot as plt import matplotlib.font_manager as fm ax = plt.gca() ax.axis([0, 3, 0, 3]) prop = fm.FontProperties(fname='FontAwesome.otf', size=18) ax.text(x=0, y=0, s='\uf1c7', color='r', fontproperties=prop) ax.text(x=2, y=0, s='\uf050', color='g', fontproperties=prop) plt.legend(handles=[Patch(color='r', label='label1'), Patch(color='g', label='label2')]) 

Y la ttwig es como: introduzca la descripción de la imagen aquí

Entonces, lo que quiero hacer es reemplazar la barra de color en la leyenda por los mismos icons que en la ttwig.

El identificador que estoy usando es una lista de parches. Pero encontré que es difícil agregar texto a Patch. Encontré que hay una gran solución para agregar una imagen a la leyenda aquí: Insertar imagen en la leyenda de matplotlib

He intentado usar TextArea reemplazando BboxImage en esa respuesta, pero no funciona, y TextArea no admite propiedades de fuente como axis.text.

Entonces, ¿hay alguna manera de usar texto en lugar de marcadores en la leyenda?

Para una solución usando TextArea vea esta respuesta . A continuación, deberá volver a crear las propiedades de fuente para el texto dentro de TextArea .

Ya que aquí desea mostrar exactamente el símbolo que tiene como texto también en la leyenda, una forma más sencilla de crear un controlador de leyenda para algún objeto de texto sería la siguiente, que asigna el texto a un TextHandler . Las subclases de matplotlib.legend_handler.HandlerBase y sus create_artists producen una copia del texto para mostrar en la leyenda. Algunas de las propiedades del texto deben ajustarse para la leyenda.

 import matplotlib.pyplot as plt from matplotlib.legend_handler import HandlerBase import copy ax = plt.gca() ax.axis([-1, 3,-1, 2]) tx1 = ax.text(x=0, y=0, s=ur'$\u2660$', color='r',size=30, ha="right") tx2 = ax.text(x=2, y=0, s=ur'$\u2665$', color='g',size=30) class TextHandler(HandlerBase): def create_artists(self, legend, orig_handle,xdescent, ydescent, width, height, fontsize,trans): h = copy.copy(orig_handle) h.set_position((width/2.,height/2.)) h.set_transform(trans) h.set_ha("center");h.set_va("center") fp = orig_handle.get_font_properties().copy() fp.set_size(fontsize) # uncomment the following line, # if legend symbol should have the same size as in the plot h.set_font_properties(fp) return [h] labels = ["label 1", "label 2"] handles = [tx1,tx2] handlermap = {type(tx1) : TextHandler()} ax.legend(handles, labels, handler_map=handlermap,) plt.show() 

introduzca la descripción de la imagen aquí

Gracias por la respuesta de ImportanceOfBeingErnest, actualizo un poco su solución para generar texto en el controlador de leyenda:

 import matplotlib.pyplot as plt from matplotlib.legend_handler import HandlerBase import matplotlib.font_manager as fm from matplotlib.text import Text class TextLegend(object): def __init__(self, icon, color, **kwargs): self.icon = icon self.color = color self.kwargs = kwargs class TextLegendHandler(HandlerBase): def create_artists(self, legend, orig_handle, xdescent, ydescent, width, height, fontsize, trans): x = xdescent + width / 2.0 y = ydescent + height / 2.0 kwargs = { 'horizontalalignment': 'center', 'verticalalignment': 'center', 'color': orig_handle.color, 'fontproperties': fm.FontProperties(fname='FontAwesome.otf', size=fontsize) } kwargs.update(orig_handle.kwargs) annotation = Text(x, y, orig_handle.icon, **kwargs) return [annotation] ax = plt.gca() ax.axis([0, 3, 0, 3]) prop = fm.FontProperties(fname='FontAwesome.otf', size=18) ax.text(x=0, y=0, s='\uf1c7', color='r', fontproperties=prop) ax.text(x=2, y=0, s='\uf050', color='g', fontproperties=prop) plt.legend( handles=[TextLegend(color='r', icon='\uf1c7'), TextLegend(color='g', icon='\uf050')], labels=['cat1', 'cat2'], handler_map={TextLegend: TextLegendHandler()} ) plt.show() 

introduzca la descripción de la imagen aquí