¿Cómo agregar una cadena como el artista en la leyenda de matplotlib?

Estoy tratando de crear una leyenda en una figura de python donde el artista es una cadena (una sola letra) que luego se etiqueta. Por ejemplo, me gustaría una leyenda para la siguiente figura:

import numpy as np import matplotlib.pyplot as plt import string N = 7 x = np.random.rand(N) y = np.random.rand(N) colors = np.random.rand(N) area = np.pi * (15 * np.random.rand(N))**2 plt.scatter(x, y, s=area, c=colors, alpha=0.5) for i,j in enumerate(zip(x,y)): plt.annotate(list(string.ascii_uppercase)[i],xy=j) plt.show() 

Donde la leyenda es algo como:

A – Nombre del modelo A

B – Nombre del modelo B

C – Nombre del modelo C

D – Nombre del modelo D

etcétera etcétera.

Lo que no puedo averiguar cómo hacer es colocar ‘A’, ‘B’, …. como el artista para el texto de la leyenda. Puedo ver cómo usaría una línea o un parche, o algo similar. Pero en general, ¿hay una manera de usar una cadena como artista en lugar de, digamos, una línea?

No creo que haya un controlador de leyenda para el texto (vea la lista de los disponibles aquí ). Pero puedes implementar tu propio controlador de leyenda personalizado . Aquí solo modificaré el ejemplo en el enlace de arriba:

 import matplotlib.pyplot as plt import matplotlib.text as mpl_text class AnyObject(object): def __init__(self, text, color): self.my_text = text self.my_color = color class AnyObjectHandler(object): def legend_artist(self, legend, orig_handle, fontsize, handlebox): print orig_handle x0, y0 = handlebox.xdescent, handlebox.ydescent width, height = handlebox.width, handlebox.height patch = mpl_text.Text(x=0, y=0, text=orig_handle.my_text, color=orig_handle.my_color, verticalalignment=u'baseline', horizontalalignment=u'left', multialignment=None, fontproperties=None, rotation=45, linespacing=None, rotation_mode=None) handlebox.add_artist(patch) return patch obj_0 = AnyObject("A", "purple") obj_1 = AnyObject("B", "green") plt.legend([obj_0, obj_1], ['Model Name A', 'Model Name B'], handler_map={obj_0:AnyObjectHandler(), obj_1:AnyObjectHandler()}) plt.show() 

introduzca la descripción de la imagen aquí