趋近智
当您创建包含多条线、多种颜色、标记 (token)或样式以表示不同类别或数据集的图表时,图例变得必不可少。它作为指引,说明每个视觉元素的含义。当您为绘图数据提供标签时,Matplotlib 和 Seaborn 通常会自动生成图例,但您经常需要调整它们的位置、外观或内容,以获得最佳清晰度。
获取图例的最简单方法是为您的绘图命令添加 label 参数 (parameter)。Matplotlib 会记录这些标签,并在指示时显示它们。
考虑绘制两条线:
import matplotlib.pyplot as plt
import numpy as np
# 示例数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# 使用函数式 API 创建图表
plt.figure(figsize=(6, 4))
plt.plot(x, y1, label='Sine Wave')
plt.plot(x, y2, label='Cosine Wave', linestyle='--')
plt.title('Sine and Cosine Waves')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
# 指示 Matplotlib 显示图例
plt.legend()
plt.show()
在此脚本中,我们在每个 plt.plot() 调用中都提供了 label 参数。最后的 plt.legend() 命令告诉 Matplotlib 收集所有定义的标签并将它们显示在图例框中。如果您使用带有 Axes 对象的面向对象方法,则应调用 ax.legend() 而不是 plt.legend()。
Matplotlib 尝试自动为图例找到“最佳”位置 (loc='best'),以尽量减少与绘图数据的重叠。然而,这种自动放置可能并非总是理想的。您可以使用 legend() 函数中的 loc 参数 (parameter)明确控制图例的位置。
常用的 loc 值包括:
'best' (默认)'upper right''upper left''lower left''lower right''right''center left''center right''lower center''upper center''center'让我们修改之前的示例,将图例放置在左下角:
# ... (x, y1, y2 的先前设置代码)
plt.figure(figsize=(6, 4))
plt.plot(x, y1, label='Sine Wave')
plt.plot(x, y2, label='Cosine Wave', linestyle='--')
plt.title('Sine and Cosine Waves')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
# 将图例放置在左下角
plt.legend(loc='lower left')
plt.show()
尝试不同的 loc 值有助于找到最合适的位置,确保图例不会遮挡重要数据点或趋势。
为了更精确地控制这些字符串代码,您可以使用 bbox_to_anchor 参数,它允许指定相对于坐标轴或图形的坐标。这更高级,通常不适用于基本图表,但对于复杂布局很有用。
关于放置,您可以修改图例的外观:
title 参数 (parameter)为图例框添加标题。ncol 将图例项排列成多列。这对于包含许多项的图例很有用。frameon=False 删除图例框周围的边框。fontsize 调整文本大小。以下是应用其中一些自定义设置的示例:
# ... (x, y1, y2 的先前设置代码)
plt.figure(figsize=(7, 5)) # 稍微大一点的图
plt.plot(x, y1, label='Sine')
plt.plot(x, y2, label='Cosine', linestyle='--')
plt.plot(x, y1*0.5, label='Sine/2', linestyle=':')
plt.plot(x, y2*0.5, label='Cosine/2', linestyle='-.')
plt.title('Multiple Trigonometric Functions')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
# 自定义图例
plt.legend(loc='upper center', ncol=2, title='Functions', frameon=False, fontsize='small')
plt.show()
这会将图例放置在顶部中央,将四个项目排列成两列,添加标题“函数”,删除边框,并使用稍微小一点的字体。
Seaborn 与 Matplotlib 紧密集成,通常会自动处理图例,特别是在使用 hue、size 或 style 等参数 (parameter)区分数据时。如果 Seaborn 预测会发生重叠,它通常会将图例放置在绘图区域之外。
import seaborn as sns
import pandas as pd
# 创建适合 Seaborn 的 DataFrame
data = pd.DataFrame({
'x': np.tile(x, 2),
'y': np.concatenate([y1, y2]),
'type': ['Sine Wave'] * len(x) + ['Cosine Wave'] * len(x)
})
plt.figure(figsize=(6, 4))
# Seaborn 根据 'hue' 自动创建图例
sns.lineplot(data=data, x='x', y='y', hue='type')
plt.title('Seaborn Plot with Automatic Legend')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
# 我们仍然可以访问 Matplotlib Axes,以便在需要时修改图例
# ax = plt.gca() # 获取当前 Axes
# ax.legend(loc='lower left') # 示例:移动 Seaborn 生成的图例
plt.show()
即使 Seaborn 创建了图例,您通常仍然可以使用 Matplotlib 的 ax.legend()(例如,通过 ax = sns.lineplot(...) 或 ax = plt.gca() 获取 Axes 对象后)来修改其属性,如位置、标题或边框可见性,就像您对纯 Matplotlib 图表所做的那样。
有效管理图例是创建清晰易懂的可视化的重要组成部分。通过正确使用标签并了解如何调整图例的位置和基本外观,您可以确保您的受众可以轻松理解图中不同的元素。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•