杰瑞科技汇

matplotlib图例位置如何自定义?

下面我将从基础到高级,全面地介绍如何在 Matplotlib 中创建和自定义图例。

matplotlib图例位置如何自定义?-图1
(图片来源网络,侵删)

基础用法:自动创建图例

最简单的方式是直接在绘图函数(如 plot(), scatter(), bar() 等)中使用 label 参数,然后调用 plt.legend()

import matplotlib.pyplot as plt
import numpy as np
# 准备数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# 绘制两条线,并使用 label 参数
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
# 调用 legend() 函数自动生成图例
plt.legend()
和坐标轴标签"Sine and Cosine Waves")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
# 显示图形
plt.show()

代码解释:

  1. 我们为 plt.plot() 函数添加了 label='sin(x)'label='cos(x)' 参数。label 的值就是图例中显示的文本。
  2. plt.legend() 会自动查找所有带有 label 的图形元素,并将它们收集起来,显示在图表的某个位置(通常是右上角)。

手动创建图例

有时你可能只想让图表中的某些元素出现在图例中,或者元素本身没有 label,这时可以使用 plt.legend()handleslabels 参数手动控制。

handles 是一个包含图形对象的列表(如 Line2D 对象)。 labels 是一个包含对应标签文本的列表。

matplotlib图例位置如何自定义?-图2
(图片来源网络,侵删)
import matplotlib.pyplot as plt
import numpy as np
# 准备数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# 绘制两条线,但不设置 label
line1, = plt.plot(x, y1, color='blue')
line2, = plt.plot(x, y2, color='red')
# 手动创建图例
# handles=[line1, line2] 指定要显示哪些线条
# labels=['正弦函数', '余弦函数'] 指定对应的标签
plt.legend(handles=[line1, line2], labels=['正弦函数', '余弦函数'])
"手动创建图例")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
plt.grid(True)
plt.show()

代码解释:

  1. 绘制线条时没有使用 label 参数。
  2. plot() 函数返回的是一个包含一个元素的列表,所以我们用 line1, = ... 的方式来获取这个 Line2D 对象。
  3. plt.legend() 接收了我们手动传入的 handleslabels,从而精确地控制了图例的内容。

自定义图例外观

plt.legend() 函数提供了大量的参数来定制图例的外观。

1 位置

使用 loc 参数可以设置图例的位置。

plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
# loc='upper right' 是默认值
# 其他常用选项: 'upper left', 'lower left', 'lower right', 'center', 'center left' 等
plt.legend(loc='lower right') "图例位置在右下角")
plt.show()

loc 参数也可以使用数字代码(不推荐,因为可读性差):

matplotlib图例位置如何自定义?-图3
(图片来源网络,侵删)
  • 0: 'best' (自动选择最佳位置)
  • 1: 'upper right'
  • 2: 'upper left'
  • 3: 'lower left'
  • 4: 'lower right'

2 边框和背景

  • frameon: 是否显示图例的边框,默认为 True
  • fancybox: 是否使用圆角边框,默认为 True
  • shadow: 是否为图例添加阴影,默认为 False
  • facecolor: 图例区域的背景颜色。
  • edgecolor: 图例边框的颜色。
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
plt.legend(
    loc='center',
    frameon=True,       # 显示边框
    fancybox=True,      # 圆角边框
    shadow=True,        # 添加阴影
    facecolor='lightgray', # 背景色
    edgecolor='black'   # 边框颜色
)"自定义图例边框和背景")
plt.show()

3 文本样式

  • fontsize: 图例中文字的大小。: 图例的标题,fontsize`: 图例标题的字体大小。
  • labelcolor: 图例中标签和线条的颜色('gray')。
  • fontweight: 字体粗细('bold')。
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
plt.legend("函数类型",fontsize=14,
    fontsize=12,
    labelcolor='green', # 将图例中的文字和线条颜色设为绿色
    framealpha=0.8      # 透明度
)"自定义图例文本")
plt.show()

4 图例标记

  • numpoints: 图例中每个线条标记显示的原始数据点数量,默认为 1
  • scatterpoints: 对于散点图,图例中每个标记显示的点数,默认为 1
  • markerscale: 图例标记相对于原始标记的缩放比例,默认为 0
  • markerfirst: 标签是否显示在标记的左侧,默认为 True
# 使用不同的线型和标记
plt.plot(x, y1, label='sin(x)', linestyle='--', marker='o', markersize=5)
plt.plot(x, y2, label='cos(x)', linestyle=':', marker='s', markersize=5)
plt.legend(
    numpoints=3,        # 每个图例项显示3个原始数据点
    markerscale=1.5,    # 将图例中的标记放大1.5倍
    markerfirst=False   # 标签显示在标记的右侧
)"自定义图例标记")
plt.show()

高级用法

1 在子图上添加图例

在创建子图时,需要获取 Axes 对象,然后在该对象上调用 legend() 方法。

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4)) # 创建一个1行2列的子图
# 在第一个子图上绘图和添加图例
ax1.plot(x, y1, label='sin(x)')
ax1.plot(x, y2, label='cos(x)')
ax1.set_title('子图 1')
ax1.legend(loc='upper right')
# 在第二个子图上绘图
ax2.plot(x, y1, 'r--', label='sin(x)')
ax2.set_title('子图 2')
ax2.legend() # 使用默认位置
plt.tight_layout() # 自动调整子图间距,防止重叠
plt.show()

2 多图例

一个 Axes 对象通常只支持一个图例,如果你需要多个独立的图例,一个常见的技巧是创建一个“伪”或“空”的线条,并将其用于第二个图例。

fig, ax = plt.subplots(figsize=(8, 6))
# 绘制数据
p1, = ax.plot(x, y1, 'b-', label='正弦波')
p2, = ax.plot(x, y2, 'r-', label='余弦波')
p3, = ax.plot(x, y1 * y2, 'g-', label='乘积')
# 第一个图例
first_legend = ax.legend(handles=[p1, p2], loc='upper left', title="函数")
# 将第一个图例添加到Axes对象中
ax.add_artist(first_legend)
# 创建第二个图例,使用一个空线条
from matplotlib.lines import Line2D
r = Line2D([0], [0], marker='o', color='w', label='重要点',
              markerfacecolor='y', markersize=10)
ax.legend(handles=[p3, r], loc='lower right', title="其他信息")
"一个图表中的多个图例")
plt.show()

3 图例大小和列数

分享:
扫描分享到社交APP
上一篇
下一篇