pin_drop当前位置:知识文库 ❯ 图文
matplotlib图例legend()函数详解 - Python图表图例设置教程
概述
图例(legend)是图表中用于标识不同数据系列的说明框,将图形元素(线条、标记等)与其标签对应起来。plt.legend()函数用于添加和自定义图例,支持位置、样式、多列布局等丰富配置。合理使用图例可以让图表更加清晰易读。
当图表中包含多条曲线、多个数据系列时,图例是帮助读者理解图表内容的关键元素。没有图例的图表就像没有图例的地图,读者无法正确解读图表中每个元素所代表的含义。
语法与参数说明
基本语法
代码示例
plt.legend(loc='best', **kwargs)
ax.legend(**kwargs)核心参数
loc位置选项
返回值
返回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()保留
图例位置方式对比
小结
-
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使用圆角边框。组合使用可以让图例更加美观且不完全遮挡背景数据。
本文涉及AI创作
内容由AI创作,请仔细甄别