Matplotlib 图例

Matplotlib 图例函数

在 Matplotlib 中,我们可以使用 legend() 函数来为图表定义一个图例,用于标识图表中不同线条、标记或其他元素的含义。

语法:

plt.legend(
    loc='best',
    title=None,
    fontsize=None, 
    ncol=1, 
    shadow=False, 
    frameon=True, 
    facecolor=None, 
    edgecolor=None, 
    bbox_to_anchor=None, 
    mode=None,
    ...
)

说明:

参数 loc 用于定义图例的位置,loc 是 “location” 的缩写,它常用的取值如下表以及如下图所示。默认值为 'best',此时 Matplotlib 会自动选择一个最佳的位置来放置图例,以避免遮挡数据。

参数 loc 的取值
取值 说明
best 自动选择最佳位置
upper left 左上
upper center 靠上居中
upper right 右上
center left 居中靠左
center 正中
center right 居中靠右
lower left 左下
lower center 靠下居中
lower right 右下

Matplotlib 图例函数参数 loc 的取值

legend() 函数其他参数说明如下。

  • title(可选):用于设置图例的标题文本。默认为 None(无标题)。
  • fontsize(可选):设置图例中文本的字体大小。可以是一个数值或者 'small'、'medium'、'large' 等字符串。默认为白色。
  • ncol(可选):用于设置图例的列数。默认为 1 列。
  • shadow(可选):是一个布尔值,指示是否在图例后面绘制阴影。默认为 False。
  • frameon(可选):是一个布尔值,指示是否绘制图例的边框。默认为 True。
  • facecolor(可选):用于设置图例的背景颜色。默认为白色。
  • edgecolor(可选):用于设置图例的边框颜色。默认为白色。
  • bbox_to_anchor(可选):用于更精细地控制图例的位置。可以是一个元组 (x, y, width, height) 或者一个 matplotlib.transforms.Bbox 实例。
  • mode(可选):当图例项过多时,可以使用 'expand' 让图例水平填充整个轴域。

Matplotlib 图例示例

接下来,我们通过几个简单的例子来讲解一下 Matplotlib 是如何设置图例及其样式的。

示例 1:Matplotlib 定义图例

import matplotlib.pyplot as plt

# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC'] 
plt.rcParams['axes.unicode_minus'] = False

# 绘图
x1 = [1, 2, 3, 4]
y1 = [16, 15, 18, 17]
x2 = [1, 2, 3, 4]
y2 = [15, 19, 17, 16]
plt.plot(x1, y1, label='折线A')    # 通过 label 参数为第一条折线命名
plt.plot(x2, y2, label='折线B')    # 通过 label 参数为第二条折线命名

# 定义图例
plt.legend() 

# 显示
plt.show()

运行之后,效果如下图所示。

Matplotlib定义图例

分析:

由于 legend() 函数需要结合绘图函数的 label 参数来一起使用,所以在使用 legend() 函数之前,必须先在 plt.plot()(或其他绘图函数)中通过 label 参数为每个需要显示在图例中的元素命名。然后,调用 plt.legend() 函数就会自动将这些带有 label 的元素显示在图例中。因此,legend() 函数通常在绘图函数的后面调用。

示例 2:Matplotlib 设置图例位置

import matplotlib.pyplot as plt

# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC'] 
plt.rcParams['axes.unicode_minus'] = False

# 绘图
x1 = [1, 2, 3, 4]
y1 = [16, 15, 18, 17]
x2 = [1, 2, 3, 4]
y2 = [15, 19, 17, 16]
plt.plot(x1, y1, label='折线A')
plt.plot(x2, y2, label='折线B')

# 定义图例
plt.legend(loc='upper left') 

# 显示
plt.show()

运行之后,效果如下图所示。

Matplotlib改变图例位置

分析:

plt.legend(loc='upper left') 表示将图例定义在图表的 “左上角” 处。小伙伴们可以尝试修改 loc 参数的值,观察图例位置的变化。

示例 3:Matplotlib 图例放到 “框外”

import matplotlib.pyplot as plt

# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC'] 
plt.rcParams['axes.unicode_minus'] = False

# 绘图
x1 = [1, 2, 3, 4]
y1 = [16, 15, 18, 17]
x2 = [1, 2, 3, 4]
y2 = [15, 19, 17, 16]
plt.plot(x1, y1, label='折线A')
plt.plot(x2, y2, label='折线B')

# 定义图例
plt.legend(loc='upper left', bbox_to_anchor=(1.02, 1))

# 自动调整布局,防止遮挡 
plt.tight_layout()

# 显示
plt.show()

运行之后,效果如下图所示。

Matplotlib 图例放到 “框外”

分析:

plt.legend(loc='upper left', bbox_to_anchor=(1.02, 1))

上面这句代码表示把图例的左上角,放到坐标系 (1.02, 1) 的位置上,这样图例就放到 “框外” 了。

示例 4:Matplotlib 设置图例列数与取消边框

import matplotlib.pyplot as plt

# 设置
plt.rcParams['font.family'] = ['SimHei', 'PingFang SC']
plt.rcParams['axes.unicode_minus'] = False

# 绘图
x = [1, 2, 3, 4]
plt.plot(x, [16, 15, 18, 17], label='折线A')
plt.plot(x, [15, 19, 17, 16], label='折线B')
plt.plot(x, [14, 16, 15, 18], label='折线C')
plt.plot(x, [17, 14, 16, 15], label='折线D')

# 设置为 4 列,放在顶部中央,并取消边框
plt.legend(loc='upper center', ncol=4, frameon=False, bbox_to_anchor=(0.5, 1.1))

# 显示
plt.show()

运行之后,效果如下图所示。

Matplotlib 设置图例列数与取消边框

分析:

在实际开发中,如果图表中的线条非常多,垂直排列的图例可能会显得很长。此时我们可以使用 ncol 参数将图例设置为多列。同时,可以使用 frameon=False 来去掉图例的边框,使其看起来更加清爽。

在这个例子中,ncol=4 表示将图例分为 4 列显示。frameon=False 表示不绘制图例的外边框。结合 bbox_to_anchor=(0.5, 1.1),我们将图例水平放置在了图表的正上方。

上一篇: Matplotlib 标题

下一篇: Matplotlib 刻度标签

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号