我试图在python图中创建一个图例,其中艺术家是一个字符串(单个字母),然后标记.例如,我想要一个下图的图例:
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()
传说的地方如下:
A - 型号名称A.
B - 型号名称B.
C - 型号名称C.
D - 型号名称D.
etc.etc.
我无法解决的问题是将'A','B',......作为传奇文本的艺术家.我可以看到你将如何使用线或补丁,或类似的东西.但总的来说有一种方法可以使用字符串作为艺术家而不是一条线?
我认为没有文本的图例处理程序(请参阅此处的可用列表).但是您可以实现自己的自定义图例处理程序.在这里,我将在上面的链接中修改示例:
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()