python - 如何在 matplotlib 图例中添加一个字符串作为艺术家?

标签 python matplotlib legend legend-properties

我正在尝试在 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

等等等等

我不知道该怎么做是将“A”、“B”……作为图例文本的艺术家。我可以看到您将如何使用线条或补丁或类似的东西。但一般来说,有没有一种方法可以使用字符串作为艺术家而不是线条?

最佳答案

我认为没有文本的图例处理程序(请参阅可用列表 here )。但是你可以实现自己的 custom legend handler .这里我只是修改上面链接的例子:

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()

enter image description here

关于python - 如何在 matplotlib 图例中添加一个字符串作为艺术家?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27174425/

相关文章:

python - 错误: Must specify a primary resource (JAR or Python file) - Spark submit Python app

python - PyInstaller 使用 pip 安装了 'successfully' 但找不到 pyinstaller.py

python - 为什么我的绘图代码没有显示带有标题、xlabel 和 ylabel 的输出?

matplotlib - 如何制作 MatPlotLib 补丁图案的图例或将它们添加到预先存在的图例中

python - python networkx中的图例

python - 选定文本的构建系统

python - 字典到全局环境python

python - 对于低于阈值的值使用相同颜色的散点图

pandas - 更改 seaborn 直方图(或 plt)中数据选择条的颜色

matlab - 在 Matlab 中为图例设置标题