如何手动创建图例

我正在使用 matlibplot,我想手动添加项目的图例是一个颜色和标签。我添加数据到情节,以指定那里将导致大量的重复。

我的想法是:

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

其中 self. label 是我想要的图例标签的数量,它采用大颜色列表的一个子集。然而,当我运行它时,它不会产生任何结果。

我错过什么了吗?

谢谢

161946 次浏览

你检查过 传奇指南了吗?

为了实用起见,我引用了 向导的例子。

并非所有句柄都可以自动转换为图例条目,因此 通常是必要的,以创造一个艺术家,可以。传说句柄没有 必须存在于图形或轴上才能使用。

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

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

enter image description here

剪辑

要添加两个补丁,您可以这样做:

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

enter image description here

我最后写下了这些:

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)

我正在添加一些代码来构建来自 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')

下面是我的输出: legend example

我不介意图例条目按照特定的顺序排列,但是您可以使用

plt.legend(handles=sorted(patchList))

这是我的第一个回答,所以提前为任何错误或失礼道歉。

这里有一个解决方案,让您控制您的图例线的宽度和样式(在 还有很多其他的事情)。

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

output of the code above

更多的选择,看看这个 Matplotlib 库样本

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

#Imports
import matplotlib.patches as mpatches


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

手动和自动生成项的常见图例:
example of common legend with manual and auto-generated items

增加2021-05-23

完整的例子与手动线和补丁

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


plt.plot([1,2,3,4], [10,20,30,40], label='My Data', color='red')


handles, labels = plt.gca().get_legend_handles_labels()


patch = mpatches.Patch(color='grey', label='manual patch')
line = Line2D([0], [0], label='manual line', color='k')


handles.extend([patch,line])


plt.legend(handles=handles)
plt.show()

enter image description here