pin_drop当前位置:知识文库 ❯ 图文

matplotlib图例legend()函数详解 - Python图表图例设置教程

概述

图例(legend)是图表中用于标识不同数据系列的说明框,将图形元素(线条、标记等)与其标签对应起来。plt.legend()函数用于添加和自定义图例,支持位置、样式、多列布局等丰富配置。合理使用图例可以让图表更加清晰易读。

当图表中包含多条曲线、多个数据系列时,图例是帮助读者理解图表内容的关键元素。没有图例的图表就像没有图例的地图,读者无法正确解读图表中每个元素所代表的含义。


语法与参数说明

基本语法

代码示例

plt.legend(loc='best', **kwargs)
ax.legend(**kwargs)

核心参数

参数 类型 默认值 说明
loc str/int 'best' 图例位置
ncol int 1 图例列数
fontsize int/str None 字体大小
title str None 图例标题
frameon bool True 是否显示边框
shadow bool False 是否显示阴影
fancybox bool True 圆角边框
framealpha float 0.8 边框透明度
bbox_to_anchor tuple None 图例锚点位置

loc位置选项

位置 位置
'best' 自动选择 0 自动选择
'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 居中

返回值

返回Legend对象,可用于后续样式修改,如legend.get_frame().set_edgecolor('red')


代码示例

示例1:基本图例

为多条曲线添加基本图例,使用默认的loc='best'自动选择最佳位置。

代码示例

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2 * np.pi, 100)

plt.figure(figsize=(8, 5))
plt.plot(x, np.sin(x), 'b-', label='sin(x)')
plt.plot(x, np.cos(x), 'r--', label='cos(x)')
plt.plot(x, np.sin(x) * 0.5, 'g:', label='0.5*sin(x)')

plt.legend()
plt.title('Basic Legend')
plt.grid(True, alpha=0.3)
plt.savefig('basic_legend.png', dpi=100, bbox_inches='tight')
print("基本图例已保存")

输出:

代码示例

基本图例已保存

示例2:图例位置与样式自定义

演示将图例放在图外,以及自定义图例的多列布局、标题、边框等样式。

代码示例

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 50)

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))

# 左图:图例放在图外
ax1.plot(x, np.sin(x), 'b-', label='sin(x)', linewidth=2)
ax1.plot(x, np.cos(x), 'r--', label='cos(x)', linewidth=2)
ax1.legend(loc='upper left', bbox_to_anchor=(1.02, 1),
           borderaxespad=0, frameon=True, shadow=True)
ax1.set_title('Legend Outside')

# 右图:自定义样式
ax2.plot(x, np.sin(x), 'b-', label='sin(x)', linewidth=2)
ax2.plot(x, np.cos(x), 'r--', label='cos(x)', linewidth=2)
ax2.plot(x, np.sin(x) + np.cos(x), 'g-.', label='sin+cos', linewidth=2)
ax2.legend(loc='lower left', ncol=3, fontsize=10,
           title='Functions', title_fontsize=11,
           framealpha=0.9, edgecolor='gray',
           fancybox=True, shadow=True)
ax2.set_title('Styled Legend')

plt.tight_layout()
plt.savefig('styled_legend.png', dpi=100, bbox_inches='tight')
print("样式图例已保存")

输出:

代码示例

样式图例已保存

示例3:多图例与自定义图例项

在同一个图表中添加多个图例,并使用自定义的Line2D对象创建图例项。

代码示例

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.lines import Line2D

x = np.linspace(0, 10, 50)

fig, ax = plt.subplots(figsize=(10, 6))

# 绘制数据
line1, = ax.plot(x, np.sin(x), 'b-', linewidth=2)
line2, = ax.plot(x, np.cos(x), 'r--', linewidth=2)
scatter = ax.scatter(x[::5], np.sin(x[::5]) + 0.1, c='green', s=50, zorder=5)

# 第一个图例:数据系列
legend1 = ax.legend([line1, line2], ['sin(x)', 'cos(x)'],
                    loc='upper right', title='Lines')

# 添加第二个图例(需手动添加到Axes)
custom_elements = [
    Line2D([0], [0], marker='o', color='w', markerfacecolor='green',
           markersize=8, label='Sample Points'),
    Line2D([0], [0], color='gray', linestyle=':', label='Reference')
]
ax.legend(handles=custom_elements, loc='lower right', title='Markers')

# 重新添加第一个图例(被覆盖了)
ax.add_artist(legend1)

ax.set_title('Multiple Legends')
ax.grid(True, alpha=0.3)
plt.savefig('multi_legend.png', dpi=100, bbox_inches='tight')
print("多图例已保存")

输出:

代码示例

多图例已保存

实际应用场景

  • 多线对比图:使用图例区分不同数据系列,如不同年份的销售趋势

  • 数据密集图表:将图例放在图外(bbox_to_anchor),避免遮挡数据

  • 复杂图表:使用多个图例分组说明不同类型的图形元素


注意事项

注意:图例只显示设置了label参数的图形元素,未设置label的不会出现在图例中

注意:图例放在图外时,需调整figsize或使用tight_layout()确保图例不被裁剪

注意:添加多个图例时,第二个legend()会覆盖第一个,需用add_artist()保留


图例位置方式对比

方式 参数 适用场景
loc字符串 loc='upper right' 图内标准位置
loc数字 loc=1 图内标准位置
bbox_to_anchor bbox_to_anchor=(1.02, 1) 图外或精确位置
配合tight_layout rect参数 自动调整布局

小结

  • legend()自动收集带label的图形元素生成图例

  • loc参数控制图例位置,bbox_to_anchor实现图外放置

  • ncol设置多列布局,title添加图例标题

  • 多图例需使用add_artist()保留被覆盖的图例


练习题

练习1

绘制3条不同线型的曲线,添加图例,分别测试loc='best'和loc='upper left'

练习2

绘制图表并将图例放在图外右侧,使用bbox_to_anchor参数

练习3

创建包含两个图例的图表:一个说明线条,一个说明标记点

常见问题

loc='best'是如何自动选择位置的?

loc='best'会尝试所有可用的位置,选择与现有图形元素重叠最少的那个位置。虽然方便,但在数据密集时可能计算较慢,建议在最终确定图表后指定具体位置。

如何将图例精确放在图表外部?

使用bbox_to_anchor配合loc参数。bbox_to_anchor=(1.02, 1)表示图例左上角锚定在Axes右边界的1.02倍位置(即图外),loc='upper left'指定使用图例的左上角进行锚定。需要配合tight_layout或调整figsize确保不被裁剪。

如何自定义图例中的标记样式?

使用matplotlib.lines.Line2D创建自定义图例项,可以指定任意颜色、线型、标记样式。然后通过legend(handles=[自定义元素列表])添加到图表中,适合为未在图表中直接绘制的元素添加说明。

图例中如何显示数学公式?

在label参数中使用LaTeX语法,如label=r'$y = \sin(x)$'。注意使用原始字符串r''避免转义问题。matplotlib会自动渲染数学公式,使图例更加专业和美观。

如何设置图例的透明度和阴影效果?

使用framealpha参数设置背景透明度(0-1之间),shadow=True添加阴影效果,fancybox=True使用圆角边框。组合使用可以让图例更加美观且不完全遮挡背景数据。

标签: matplotlib 图例 legend Python教程 数据可视化 图表美化

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: matplotlib子图subplot()函数详解 - Python多图布局绘制 下一篇: matplotlib标题与标签设置详解 - Python图表文本自定义

poll相关推荐