概述
matplotlib 中的图例(Legend)可以帮助我们展示每个数据对应的名称,让图像阅读者更好的认识到图像的数据结构以及绘图者想表达的意思。matplotlib 可以为每一个可见绘图对象(Artist)添加图例,官方建议调用 pyplot.legend()
方法便捷地创建图例,而不是使用面向对象的方法,即显式创建 matplotlib.legend.Legend
对象构造图例。
一般情况下一个图例包含多个图例条目,每个图例条目包含:
- 图例键:每个图例标签左侧的彩色/带图案标记;
- 图例标签:描述由图例键表示的句柄的文本;
每一个图例条目会和一个图例句柄绑定,每一个图例句柄用于在图例中生成适当条目的原始对象。
我们在实际绘图中常调用 pyplot.legend()
方法完成绘图,该方法的签名为 :
legend()
legend(handles, labels)
legend(handles=handles)
legend(labels)
方式 1:不传递任何参数
第一种方式调用方法时不传递任何额外参数, matplotlib 会自动确定要添加到图例中的元素,这种情况下,所有的图例标签来自 Artist 对象,这就需要显式的指明每一个Artist 对象的图例标签,如果没有显式指定,那么 matplotlib 不会绘制任何图例,并会给出提示 No artists with labels found to put in legend.
。正确形式为:
plt.plot([1, 2, 3], label='Inline label')
plt.legend()
方式 2:传递图例句柄和图例标签
第二种方式可以完全控制每一个 Artist 对象以及其显示的图例信息,该方式需要传递一个可迭代 Artist 对象容器和一个可迭代图例标签对象容器,例如 plt.legend([line1, line2, line3], ['label1', 'label2', 'label3'])
。
方式 3:仅传递图例句柄
第三种方式和第二种方式类似,但是更加便捷,同时可以控制哪些 Artist 对象需要显示图例,此时图例标签来自 Artist 对象本身,例如:
line1, = plt.plot([1, 2, 3], label='label1')
line2, = plt.plot([1, 2, 3], label='label2')
plt.legend(handles=[line1, line2])
方式 4:仅传递图例标签
第四种方式仅传递图例标签,这种方式官方是不推荐的,因为这可能导致图例句柄和图例标签之间的不匹配,所以在此不再赘述,如果想要了解具体信息,可以访问官网。
关键参数
除了上述必要参数之外,还可以传递如下参数:
- loc:指定图例显示的位置,默认使用最佳位置显示图例;
- ncol:指定图例显示的列数,默认 1;
- prop:指定图例字体属性;
- fontsize:指定图例字体大小;
- labelcolor:指定图例标签颜色;
- frameon:指定图例区域是否有边框;
- fancybox:指定图例区域矩形是否为圆角;
- title:指定图例标题;
- title_fontsize:指定图例标题字体大小;
- shadow:指定图例区域是否有阴影;
- facecolor:指定图例区域背景颜色;
- edgecolor:指定图例区域边缘颜色;
- labelspacing:指定图例条目之间的垂直间距;
- markerscale:指定图例标签中标记点的缩放比例;
案例
接下来,我们将绘制一个余弦函数作为案例。子图 1使用方式 1 绘制图例,子图 2 使用方式 2 绘制图例,二者都设置图例标题。案例完整代码如下:
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
x = np.linspace(0, 2 * np.pi, 1000)
y = np.cos(x)
fig, ax = plt.subplots(1, 2)
# 方式1
ax[0].plot(x, y, label='余弦函数', color='cornflowerblue')
ax[0].legend(title='方式1', title_fontsize=15)
# 方式2
line_obj = ax[1].plot(x, y, color='goldenrod')
ax[1].legend(handles=line_obj, labels=['余弦函数'], title='方式2', title_fontsize=15)
plt.show()
画图结果如下:
文中难免会出现一些描述不当之处(尽管我已反复检查多次),欢迎在留言区指正,相关的知识点也可进行分享,希望大家都能有所收获!!如果觉得我的文章写得还行,不妨支持一下。