Matplotlib添加图例详解(附带实例)
当在图表中绘制多个线条或形状时,为了易于识别它们所表示的数据,通常需要在图表中显示图例。
图例由线条或形状的外观和颜色,以及标签两个部分组成。在 Matplotlib 中可以自动显示所有图例,也可以指定要显示哪些图例并修改图例标签,还可以更改图例在图表中的位置。
下面的代码将创建带有一个坐标系的图表,在其中绘制两条直线,并将两条直线分别命名为“第1条”和“第2条”:

图 1 创建带有一个坐标系的图表
如需在前面创建的图表中显示所有图例,可以使用不指定任何参数的 legend() 函数或 legend() 方法。
下面的任意一行代码都将在图表中显示所有图例:

图 2 显示所有图例
下面的代码是使用 line1 和 line2 两个变量保存在图表中绘制的两条线,然后在 Axes 对象的 legend() 方法中以列表的形式只指定第一条线对应的变量 line1,这样在图表中将只显示与其对应的图例:

图 3 指定要显示的图例
下面的代码是在绘制图表时,通过指定 label 参数,为每一条线设置标签。在使用 legend() 方法显示图例时,在第二个参数中重新设置标签的内容,在图表中显示的图例将使用新标签代替旧标签:

图 4 修改图例标签
下面的代码与上面的示例类似,唯一区别是在创建图表时没有指定标签,而是在显示图例时指定标签。
如果指定所有标签,则可以在 legend() 函数或 legend() 方法中只给出表示图例标签的参数,而省略表示绘图对象的参数。所以,上面的 legend() 方法所在的代码行可以简化为以下形式:
下表列出了可以为图例设置的 9 种位置:
在代码中既可以使用第一列中的字符串,也可以使用第二列中的数字值。为了保持向后兼容性,可以使用 right 代替 center right。
下面的代码将创建 9 个图表,并在这些图表中显示了图例的 9 种位置:

图 5 图例的9种位置
如需简化上述代码,可以使用两个 for 语句代替重复执行多次的 plot() 方法和 legend() 方法,代码如下:
图例由线条或形状的外观和颜色,以及标签两个部分组成。在 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 种位置:
取值 | 位置编码 | 位置 |
---|---|---|
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()