手动添加图例项目Python matplotlib

Bra*_*ier 38 python matplotlib

我正在使用matlibplot,我想手动向图例中添加颜色和标签的项目.我将数据添加到图中以指定会导致大量重复.

我的想法是:

    ax2.legend(self.labels,colorList[:len(self.labels)])
    plt.legend()
Run Code Online (Sandbox Code Playgroud)

其中self.labels是我希望传奇标签的项目数量,它采用大颜色列表的子集.但是,当我运行它时,这没有任何结果.

我错过了什么吗?

谢谢

gab*_*bra 55

你查过传奇指南了吗?

为了实用,我引用了指南中的例子.

并非所有句柄都可以自动转换为图例条目,因此通常需要创建一个可以的艺术家.图或轴上不必存在图例句柄以便使用.

假设我们想要创建一个图例,其中包含一些由红色表示的数据条目:

import matplotlib.patches as mpatches
import matplotlib.pyplot as plt

red_patch = mpatches.Patch(color='red', label='The red data')
plt.legend(handles=[red_patch])

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑

要添加两个补丁,您可以执行以下操作:

import matplotlib.patches as mpatches
import matplotlib.pyplot as plt

red_patch = mpatches.Patch(color='red', label='The red data')
blue_patch = mpatches.Patch(color='blue', label='The blue data')

plt.legend(handles=[red_patch, blue_patch])
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • @Bradyforcier 完全正确。 (2认同)

R2-*_*-D2 18

这是一个解决方案,让您可以控制图例行的宽度和样式(还有许多其他功能)。

import matplotlib.pyplot as plt
from matplotlib.lines import Line2D

colors = ['black', 'red', 'green']
lines = [Line2D([0], [0], color=c, linewidth=3, linestyle='--') for c in colors]
labels = ['black data', 'red data', 'green data']
plt.legend(lines, labels)
plt.show()
Run Code Online (Sandbox Code Playgroud)

上面代码的输出

有关更多选项,请查看此matplotlib Gallery示例


bir*_*rac 14

我添加一些代码的基础上,从答案/sf/users/142039271/和评论/sf/users/416260491/.在这里,我通过 'for'循环手动向元组添加元素.

首先,我创建一个包含我的图例名称和所需颜色的字典.我实际上在加载数据时这样做,但在这里我只是明确定义:

import matplotlib.patches as mpatches
import matplotlib.pyplot as plt    

legend_dict = { 'data1' : 'green', 'data2' : 'red', 'data3' : 'blue' }
Run Code Online (Sandbox Code Playgroud)

然后我循环遍历字典,并为每个条目定义一个补丁并附加到列表'patchList'.然后我使用此列表创建我的传奇.

patchList = []
for key in legend_dict:
        data_key = mpatches.Patch(color=legend_dict[key], label=key)
        patchList.append(data_key)

plt.legend(handles=patchList)
plt.savefig('legend.png', bbox_inches='tight')
Run Code Online (Sandbox Code Playgroud)

这是我的输出: 传说的例子

我并不担心特定顺序的图例条目,但你可能会实现这一点

plt.legend(handles=sorted(patchList))
Run Code Online (Sandbox Code Playgroud)

这是我的第一个答案,所以提前为任何错误/失礼道歉.


Cre*_*eek 5

对于那些希望将手动图例项添加到具有自动生成的项的单个/通用图例中的人:

# where some data has already been plotted to ax
handles, labels = ax.get_legend_handles_labels()

# manually define a new patch 
patch = mpatches.Patch(color='grey', label='Manual Label')

# handles is a list, so append manual patch
handles.append(patch) 

# plot the legend
plt.legend(handles=handles, loc='upper center')
Run Code Online (Sandbox Code Playgroud)

带有手动和自动生成的项目的常见图例示例:
带有手动和自动生成项目的常见图例示例

  • 一个更好的答案,因为它显示附加到生成的标签,而不是手动添加所有内容。 (9认同)
  • 对于任何使用标准 matplotlib.pyplot 作为 plt 的人,我必须这样做: `plt.legend()` `handles, labels = plt.gca().get_legend_handles_labels()` (6认同)