Matplotlib 图例函数
在 Matplotlib 中,我们可以使用 legend() 函数来为图表定义一个图例,用于标识图表中不同线条、标记或其他元素的含义。
语法:
plt.legend(
loc='best',
title=None,
fontsize=None,
ncol=1,
shadow=False,
frameon=True,
facecolor=None,
edgecolor=None,
bbox_to_anchor=None,
mode=None,
...
)说明:
参数 loc 用于定义图例的位置,loc 是 “location” 的缩写,它常用的取值如下表以及如下图所示。默认值为 'best',此时 Matplotlib 会自动选择一个最佳的位置来放置图例,以避免遮挡数据。
| 取值 | 说明 |
|---|---|
| best | 自动选择最佳位置 |
| upper left | 左上 |
| upper center | 靠上居中 |
| upper right | 右上 |
| center left | 居中靠左 |
| center | 正中 |
| center right | 居中靠右 |
| lower left | 左下 |
| lower center | 靠下居中 |
| lower right | 右下 |

legend() 函数其他参数说明如下。
title(可选):用于设置图例的标题文本。默认为 None(无标题)。fontsize(可选):设置图例中文本的字体大小。可以是一个数值或者 'small'、'medium'、'large' 等字符串。默认为白色。ncol(可选):用于设置图例的列数。默认为 1 列。shadow(可选):是一个布尔值,指示是否在图例后面绘制阴影。默认为 False。frameon(可选):是一个布尔值,指示是否绘制图例的边框。默认为 True。facecolor(可选):用于设置图例的背景颜色。默认为白色。edgecolor(可选):用于设置图例的边框颜色。默认为白色。bbox_to_anchor(可选):用于更精细地控制图例的位置。可以是一个元组 (x, y, width, height) 或者一个 matplotlib.transforms.Bbox 实例。mode(可选):当图例项过多时,可以使用 'expand' 让图例水平填充整个轴域。
Matplotlib 图例示例
接下来,我们通过几个简单的例子来讲解一下 Matplotlib 是如何设置图例及其样式的。
示例 1:Matplotlib 定义图例
import matplotlib.pyplot as plt
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
# 绘图
x1 = [1, 2, 3, 4]
y1 = [16, 15, 18, 17]
x2 = [1, 2, 3, 4]
y2 = [15, 19, 17, 16]
plt.plot(x1, y1, label='折线A') # 通过 label 参数为第一条折线命名
plt.plot(x2, y2, label='折线B') # 通过 label 参数为第二条折线命名
# 定义图例
plt.legend()
# 显示
plt.show()运行之后,效果如下图所示。

分析:
由于 legend() 函数需要结合绘图函数的 label 参数来一起使用,所以在使用 legend() 函数之前,必须先在 plt.plot()(或其他绘图函数)中通过 label 参数为每个需要显示在图例中的元素命名。然后,调用 plt.legend() 函数就会自动将这些带有 label 的元素显示在图例中。因此,legend() 函数通常在绘图函数的后面调用。
示例 2:Matplotlib 设置图例位置
import matplotlib.pyplot as plt
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
# 绘图
x1 = [1, 2, 3, 4]
y1 = [16, 15, 18, 17]
x2 = [1, 2, 3, 4]
y2 = [15, 19, 17, 16]
plt.plot(x1, y1, label='折线A')
plt.plot(x2, y2, label='折线B')
# 定义图例
plt.legend(loc='upper left')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
plt.legend(loc='upper left') 表示将图例定义在图表的 “左上角” 处。小伙伴们可以尝试修改 loc 参数的值,观察图例位置的变化。
示例 3:Matplotlib 图例放到 “框外”
import matplotlib.pyplot as plt
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
# 绘图
x1 = [1, 2, 3, 4]
y1 = [16, 15, 18, 17]
x2 = [1, 2, 3, 4]
y2 = [15, 19, 17, 16]
plt.plot(x1, y1, label='折线A')
plt.plot(x2, y2, label='折线B')
# 定义图例
plt.legend(loc='upper left', bbox_to_anchor=(1.02, 1))
# 自动调整布局,防止遮挡
plt.tight_layout()
# 显示
plt.show()运行之后,效果如下图所示。

分析:
plt.legend(loc='upper left', bbox_to_anchor=(1.02, 1))上面这句代码表示把图例的左上角,放到坐标系 (1.02, 1) 的位置上,这样图例就放到 “框外” 了。
示例 4:Matplotlib 设置图例列数与取消边框
import matplotlib.pyplot as plt
# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False
# 绘图
x = [1, 2, 3, 4]
plt.plot(x, [16, 15, 18, 17], label='折线A')
plt.plot(x, [15, 19, 17, 16], label='折线B')
plt.plot(x, [14, 16, 15, 18], label='折线C')
plt.plot(x, [17, 14, 16, 15], label='折线D')
# 设置为 4 列,放在顶部中央,并取消边框
plt.legend(loc='upper center', ncol=4, frameon=False, bbox_to_anchor=(0.5, 1.1))
# 显示
plt.show()运行之后,效果如下图所示。

分析:
在实际开发中,如果图表中的线条非常多,垂直排列的图例可能会显得很长。此时我们可以使用 ncol 参数将图例设置为多列。同时,可以使用 frameon=False 来去掉图例的边框,使其看起来更加清爽。
在这个例子中,ncol=4 表示将图例分为 4 列显示。frameon=False 表示不绘制图例的外边框。结合 bbox_to_anchor=(0.5, 1.1),我们将图例水平放置在了图表的正上方。
