下面我将从基础到高级,全面地介绍如何在 Matplotlib 中创建和自定义图例。

基础用法:自动创建图例
最简单的方式是直接在绘图函数(如 plot(), scatter(), bar() 等)中使用 label 参数,然后调用 plt.legend()。
import matplotlib.pyplot as plt
import numpy as np
# 准备数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# 绘制两条线,并使用 label 参数
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
# 调用 legend() 函数自动生成图例
plt.legend()
和坐标轴标签"Sine and Cosine Waves")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
# 显示图形
plt.show()
代码解释:
- 我们为
plt.plot()函数添加了label='sin(x)'和label='cos(x)'参数。label的值就是图例中显示的文本。 plt.legend()会自动查找所有带有label的图形元素,并将它们收集起来,显示在图表的某个位置(通常是右上角)。
手动创建图例
有时你可能只想让图表中的某些元素出现在图例中,或者元素本身没有 label,这时可以使用 plt.legend() 的 handles 和 labels 参数手动控制。
handles 是一个包含图形对象的列表(如 Line2D 对象)。
labels 是一个包含对应标签文本的列表。

import matplotlib.pyplot as plt
import numpy as np
# 准备数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# 绘制两条线,但不设置 label
line1, = plt.plot(x, y1, color='blue')
line2, = plt.plot(x, y2, color='red')
# 手动创建图例
# handles=[line1, line2] 指定要显示哪些线条
# labels=['正弦函数', '余弦函数'] 指定对应的标签
plt.legend(handles=[line1, line2], labels=['正弦函数', '余弦函数'])
"手动创建图例")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
plt.grid(True)
plt.show()
代码解释:
- 绘制线条时没有使用
label参数。 plot()函数返回的是一个包含一个元素的列表,所以我们用line1, = ...的方式来获取这个Line2D对象。plt.legend()接收了我们手动传入的handles和labels,从而精确地控制了图例的内容。
自定义图例外观
plt.legend() 函数提供了大量的参数来定制图例的外观。
1 位置
使用 loc 参数可以设置图例的位置。
plt.plot(x, y1, label='sin(x)') plt.plot(x, y2, label='cos(x)') # loc='upper right' 是默认值 # 其他常用选项: 'upper left', 'lower left', 'lower right', 'center', 'center left' 等 plt.legend(loc='lower right') "图例位置在右下角") plt.show()
loc 参数也可以使用数字代码(不推荐,因为可读性差):

0: 'best' (自动选择最佳位置)1: 'upper right'2: 'upper left'3: 'lower left'4: 'lower right'
2 边框和背景
frameon: 是否显示图例的边框,默认为True。fancybox: 是否使用圆角边框,默认为True。shadow: 是否为图例添加阴影,默认为False。facecolor: 图例区域的背景颜色。edgecolor: 图例边框的颜色。
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
plt.legend(
loc='center',
frameon=True, # 显示边框
fancybox=True, # 圆角边框
shadow=True, # 添加阴影
facecolor='lightgray', # 背景色
edgecolor='black' # 边框颜色
)"自定义图例边框和背景")
plt.show()
3 文本样式
fontsize: 图例中文字的大小。: 图例的标题,fontsize`: 图例标题的字体大小。labelcolor: 图例中标签和线条的颜色('gray')。fontweight: 字体粗细('bold')。
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
plt.legend("函数类型",fontsize=14,
fontsize=12,
labelcolor='green', # 将图例中的文字和线条颜色设为绿色
framealpha=0.8 # 透明度
)"自定义图例文本")
plt.show()
4 图例标记
numpoints: 图例中每个线条标记显示的原始数据点数量,默认为1。scatterpoints: 对于散点图,图例中每个标记显示的点数,默认为1。markerscale: 图例标记相对于原始标记的缩放比例,默认为0。markerfirst: 标签是否显示在标记的左侧,默认为True。
# 使用不同的线型和标记
plt.plot(x, y1, label='sin(x)', linestyle='--', marker='o', markersize=5)
plt.plot(x, y2, label='cos(x)', linestyle=':', marker='s', markersize=5)
plt.legend(
numpoints=3, # 每个图例项显示3个原始数据点
markerscale=1.5, # 将图例中的标记放大1.5倍
markerfirst=False # 标签显示在标记的右侧
)"自定义图例标记")
plt.show()
高级用法
1 在子图上添加图例
在创建子图时,需要获取 Axes 对象,然后在该对象上调用 legend() 方法。
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4)) # 创建一个1行2列的子图
# 在第一个子图上绘图和添加图例
ax1.plot(x, y1, label='sin(x)')
ax1.plot(x, y2, label='cos(x)')
ax1.set_title('子图 1')
ax1.legend(loc='upper right')
# 在第二个子图上绘图
ax2.plot(x, y1, 'r--', label='sin(x)')
ax2.set_title('子图 2')
ax2.legend() # 使用默认位置
plt.tight_layout() # 自动调整子图间距,防止重叠
plt.show()
2 多图例
一个 Axes 对象通常只支持一个图例,如果你需要多个独立的图例,一个常见的技巧是创建一个“伪”或“空”的线条,并将其用于第二个图例。
fig, ax = plt.subplots(figsize=(8, 6))
# 绘制数据
p1, = ax.plot(x, y1, 'b-', label='正弦波')
p2, = ax.plot(x, y2, 'r-', label='余弦波')
p3, = ax.plot(x, y1 * y2, 'g-', label='乘积')
# 第一个图例
first_legend = ax.legend(handles=[p1, p2], loc='upper left', title="函数")
# 将第一个图例添加到Axes对象中
ax.add_artist(first_legend)
# 创建第二个图例,使用一个空线条
from matplotlib.lines import Line2D
r = Line2D([0], [0], marker='o', color='w', label='重要点',
markerfacecolor='y', markersize=10)
ax.legend(handles=[p3, r], loc='lower right', title="其他信息")
"一个图表中的多个图例")
plt.show()
