首页 > 编程笔记 > Python笔记 阅读:4

Matplotlib添加图例详解(附带实例)

当在图表中绘制多个线条或形状时,为了易于识别它们所表示的数据,通常需要在图表中显示图例。

图例由线条或形状的外观和颜色,以及标签两个部分组成。在 Matplotlib 中可以自动显示所有图例,也可以指定要显示哪些图例并修改图例标签,还可以更改图例在图表中的位置。

Matplotlib设置图例标签

如需在图表中正常显示图例,需要在绘制图表时设置图例标签。

下面的代码将创建带有一个坐标系的图表,在其中绘制两条直线,并将两条直线分别命名为“第1条”和“第2条”:
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams['font.sans-serif'] = 'SimSun'
fig, ax = plt.subplots()
ax.plot([1, 2, 3], label='第 1 条 ')
ax.plot([0.5, 1, 1.5], label='第 2 条 ')
plt.show()
效果如下图所示:


图 1 创建带有一个坐标系的图表

Matplotlib显示所有图例

使用 pyplot 模块中的 legend() 函数或 Axes 对象的 legend() 方法,可以在图表中显示图例。

如需在前面创建的图表中显示所有图例,可以使用不指定任何参数的 legend() 函数或 legend() 方法。

下面的任意一行代码都将在图表中显示所有图例:
plt.legend()
ax.legend()
效果如下图所示:


图 2 显示所有图例

Matplotlib指定要显示的图例

如果只想显示特定的图例而非所有图例,则可以在 legend() 函数或 legend() 方法中指定要显示图例的对象。为此,需要在绘制图表时,使用变量保存绘制的线条或形状。

下面的代码是使用 line1 和 line2 两个变量保存在图表中绘制的两条线,然后在 Axes 对象的 legend() 方法中以列表的形式只指定第一条线对应的变量 line1,这样在图表中将只显示与其对应的图例:
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams['font.sans-serif'] = 'SimSun'
fig, ax = plt.subplots()
line1, = ax.plot([1, 2, 3], label='第一条')
line2, = ax.plot([0.5, 1, 1.5], label='第二条')
ax.legend(handles=[line1])
plt.show()
注意,当在 legend() 函数或 legend() 方法中只指定作为图例的对象时,必须使用 handles 关键字参数。效果如下图所示:


图 3 指定要显示的图例

Matplotlib修改图例标签

除了在绘制图表时设置图例标签之外,还可以在显示图例时,使用 legend() 函数或 legend() 方法修改图例标签。

下面的代码是在绘制图表时,通过指定 label 参数,为每一条线设置标签。在使用 legend() 方法显示图例时,在第二个参数中重新设置标签的内容,在图表中显示的图例将使用新标签代替旧标签:
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams['font.sans-serif'] = 'SimSun'
fig, ax = plt.subplots()
line1, = ax.plot([1, 2, 3], label='第一条')
line2, = ax.plot([0.5, 1, 1.5], label='第二条')
ax.legend([line1, line2], ['第一条线', '第二条线'])
plt.show()
效果如下图所示:


图 4 修改图例标签

下面的代码与上面的示例类似,唯一区别是在创建图表时没有指定标签,而是在显示图例时指定标签。
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams['font.sans-serif'] = 'SimSun'
fig, ax = plt.subplots()
line1, = ax.plot([1, 2, 3])
line2, = ax.plot([0.5, 1, 1.5])
ax.legend((line1, line2), ('第一条线', '第二条线'))
plt.show()

如果指定所有标签,则可以在 legend() 函数或 legend() 方法中只给出表示图例标签的参数,而省略表示绘图对象的参数。所以,上面的 legend() 方法所在的代码行可以简化为以下形式:
ax.legend(('第一条线', '第二条线'))

Matplotlib更改图例的位置

通过在 legend() 函数或 legend() 方法中指定 loc 关键字参数,可以更改图例在图表中的位置。

下表列出了可以为图例设置的 9 种位置:

表:loc 参数的取值
取值 位置编码 位置
upper right 1 右上角
upper left 2 左上角
lower left 3 左下角
lower right 4 右下角
right 5 右侧
center left 6 左侧居中
center right 7 右侧居中
lower center 8 底部居中
upper center 9 顶部居中
center 10 正中间

在代码中既可以使用第一列中的字符串,也可以使用第二列中的数字值。为了保持向后兼容性,可以使用 right 代替 center right。

下面的代码将创建 9 个图表,并在这些图表中显示了图例的 9 种位置:
import matplotlib.pyplot as plt
fig, axs = plt.subplots(3, 3, layout='tight')
axs[0, 0].plot(0)
axs[0, 0].legend(labels=['upper left'], loc='upper left')
axs[0, 1].plot(0)
axs[0, 1].legend(labels=['upper center'], loc='upper center')
axs[0, 2].plot(0)
axs[0, 2].legend(labels=['upper right'], loc='upper right')
axs[1, 0].plot(0)
axs[1, 0].legend(labels=['center left'], loc='center left')
axs[1, 1].plot(0)
axs[1, 1].legend(labels=['center'], loc='center')
axs[1, 2].plot(0)
axs[1, 2].legend(labels=['center right'], loc='center right')
axs[2, 0].plot(0)
axs[2, 0].legend(labels=['lower left'], loc='lower left')
axs[2, 1].plot(0)
axs[2, 1].legend(labels=['lower center'], loc='lower center')
axs[2, 2].plot(0)
axs[2, 2].legend(labels=['lower right'], loc='lower right')
plt.show()
效果如下图所示:


图 5 图例的9种位置

如需简化上述代码,可以使用两个 for 语句代替重复执行多次的 plot() 方法和 legend() 方法,代码如下:
import matplotlib.pyplot as plt
fig, axs = plt.subplots(3, 3, layout='tight')
upper = ['upper left', 'upper center', 'upper right']
center = ['center left', 'center', 'center right']
lower = ['lower left', 'lower center', 'lower right']
loc_all = upper + center + lower
index = 0
for x in range(3):
    for y in range(3):
        axs[x, y].plot(0)
        axs[x, y].legend(labels=[loc_all[index]], loc=loc_all[index])
        index += 1
plt.show()

相关文章