手动添加图例项Python matplotlib


72

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

我的想法是:

    ax2.legend(self.labels,colorList[:len(self.labels)])
    plt.legend()

self.labels是我想要的图例标签所占的项目数量,它占了大颜色列表的一部分。但是,当我运行它时,它什么也不会产生。

我有什么想念的吗?

谢谢


Answers:


88

您是否查看过图例指南

为了实用,我引用了指南中的示例。

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

假设我们要创建一个图例,该图例具有一些用红色表示的数据的条目:

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

在此处输入图片说明

编辑

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

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

在此处输入图片说明


1
加多个会如何工作?我可以列出补丁列表,然后执行plt.legend(handles = patchList)
Brady forcier

1
完全是@Bradyforcier。
gabra 2016年

我试图添加这样的自定义补丁,并且在图例中看到两个黑点和Patch'>。我尝试在上面添加red_pa​​tch,我得到了同样的东西。补丁已添加为plt.legend(mpatches.Patch(color ='red',label ='The red data')))。原来我所使用的版本是0.99。不确定如何找出这个较旧的API是如何工作的
Brady forcier

@Bradyforcier我添加了一个带有两个补丁的示例。我不确定它是否可以在v0.99上运行。
gabra

是否还可以手动将一种颜色分配给一个特定值?
Varlor

42

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

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

上面代码的输出

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


34

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

# 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')

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


6
对于使用标准matplotlib.pyplot作为plt的任何人,我都必须这样做: plt.legend() handles, labels = plt.gca().get_legend_handles_labels()
the775

3
更好的答案,因为它显示了附加到生成的标签,而不是手动添加所有内容。
abhishah901年

22

我添加一些代码来构建从答案https://stackoverflow.com/users/2029132/gabra和评论https://stackoverflow.com/users/5946578/brady-forcier。在这里,我通过“ for”循环将元素手动添加到图例。

首先,我用我的图例名称和所需的颜色创建字典。我实际上是在加载数据时执行此操作的,但是在这里我只是明确定义:

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

legend_dict = { 'data1' : 'green', 'data2' : 'red', 'data3' : 'blue' }

然后,我遍历字典,为每个条目定义一个补丁,并追加到列表“ 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')

这是我的输出: 图例

我不担心图例条目按特定顺序排列,但是您可以通过以下方式实现此目的

plt.legend(handles=sorted(patchList))

这是我的第一个答案,因此对任何错误/虚假行为表示歉意。


我可以用圆形贴片代替矩形片吗?
seralouk

1

我最终将其写出来:

def plot_bargraph_with_groupings(df, groupby, colourby, title, xlabel, ylabel):
    """
    Plots a dataframe showing the frequency of datapoints grouped by one column and coloured by another.
    df : dataframe
    groupby: the column to groupby
    colourby: the column to color by
    title: the graph title
    xlabel: the x label,
    ylabel: the y label
    """

    import matplotlib.patches as mpatches

    # Makes a mapping from the unique colourby column items to a random color.
    ind_col_map = {x:y for x, y in zip(df[colourby].unique(),
                               [plt.cm.Paired(np.arange(len(df[colourby].unique())))][0])}


    # Find when the indicies of the soon to be bar graphs colors.
    unique_comb = df[[groupby, colourby]].drop_duplicates()
    name_ind_map = {x:y for x, y in zip(unique_comb[groupby], unique_comb[colourby])}
    c = df[groupby].value_counts().index.map(lambda x: ind_col_map[name_ind_map[x]])

    # Makes the bargraph.
    ax = df[groupby].value_counts().plot(kind='bar',
                                         figsize=FIG_SIZE,
                                         title=title,
                                         color=[c.values])
    # Makes a legend using the ind_col_map
    legend_list = []
    for key in ind_col_map.keys():
        legend_list.append(mpatches.Patch(color=ind_col_map[key], label=key))

    # display the graph.
    plt.legend(handles=legend_list)
    ax.set_xlabel(xlabel)
    ax.set_ylabel(ylabel)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.