Matplotlib 注释文本

在 Matplotlib 中,我们可以为一些关键节点添加注释文本,主要分为以下 2 种情况。

  • 有指向的注释文本。
  • 无指向的注释文本。

Matplotlib 注释文本(有指向)

在 Matplotlib 中,我们可以使用 annotate() 函数为一些关键节点添加一个有指向的注释文本。

语法:

plt.annotate(
    text, 
    xy, 
    xytext=None, 
    arrowprops=None,
    annotation_clip=None,
    **kwargs
)

说明:

annotate() 函数接收以下参数。

  • text(必选):表示注释文本的内容。
  • xy(必选):表示注释节点的坐标(元组),这是箭头指向的点。
  • xytext(可选):表示注释文本的坐标(元组)。如果省略,则文本将放置在 xy 的位置。
  • arrowprops(可选):表示箭头的样式,是一个字典。如果为 None,则不绘制箭头。
  • annotation_clip(可选):一个布尔值,指示注释是否应被裁剪到轴区域。
  • **kwargs(可选):其他文本属性,例如 fontsize、color、ha(horizontalalignment)、va(verticalalignment)等。

其中 arrowsprops 的值是一个字典,它常用的 key 包括:color、width、headwidth、headlength、shrink、arrowstyle 等。

示例 1:Matplotlib 设置带指向的注释文本

import matplotlib.pyplot as plt

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

# 绘图
x = range(1, 16)
y = [36.0, 36.1, 36.6, 36.2, 36.4, 36.5, 36.0, 36.2, 36.4, 36.8, 36.7, 36.1, 36.6, 36.5, 36.7]
plt.plot(x, y, marker='o', markerfacecolor='white')

# 定义标题
plt.title('15日体温变化')
plt.xlabel('日期')
plt.ylabel('体温')

# 添加注释
plt.annotate(
    text='最高体温', 
    xy=(10, 36.8), 
    xytext=(6, 36.6),
    arrowprops={'arrowstyle': '->'}
)

# 显示
plt.show()

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

Matplotlib 设置带指向的注释文本

分析:

需要注意的是,xy 是被注释节点的坐标,而 xytext 是注释文本的坐标。xytext 一般要设置得与 xy 有一定距离才行,不然就可能会重叠。

默认情况下,注释文本和线条箭头都是黑色,我们可以对它们分别定义颜色。修改后的代码如下,此时效果如下图所示。

plt.annotate(
    text='最高体温', 
    xy=(10, 36.8), 
    xytext=(6, 36.6),
    color='red',
    arrowprops={'arrowstyle': '->', 'color': 'red'}
)

Matplotlib改变注释文本和线条箭头的颜色

Matplotlib 注释文本(无指向)

在 Matplotlib 中,我们可以使用 text() 函数来给一个节点注释文本。这种方式可以让图表数据展示得更加直观。

语法:

plt.text(
    x, 
    y, 
    s, 
    fontsize=None, 
    color=None, 
    ha='left', 
    va='bottom', 
    rotation=None, 
    **kwargs
)

说明:

text() 函数接收以下参数。

  • x(必选):注释文本的 x 轴坐标。
  • y(必选):注释文本的 y 轴坐标。
  • s(必选):注释文本的内容。
  • fontsize(可选):文本的字体大小。
  • color(可选):文本颜色。
  • ha(可选):水平对齐方式,取值可以是:'left', 'right', 'center'。
  • va(可选):垂直对齐方式,取值可以是:'top', 'bottom', 'center', 'baseline', 'center_baseline'。
  • rotation(可选):文本旋转角度,单位是度。
  • **kwargs:其他文本属性。

示例 2:Matplotlib 设置无指向的注释文本

import matplotlib.pyplot as plt

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

# 绘图
x = range(1, 16)
y = [36.0, 36.1, 36.6, 36.2, 36.4, 36.5, 36.0, 36.2, 36.4, 36.8, 36.7, 36.1, 36.6, 36.5, 36.7]
plt.plot(x, y, marker='o', markerfacecolor='white')

# 定义标题
plt.title('15日体温变化')
plt.xlabel('日期')
plt.ylabel('体温')

# 注释文本
plt.text(10, 36.8, '最高')
plt.text(1, 36.0, '最低')

# 显示
plt.show()

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

Matplotlib注释文本(无指向)

分析:

annotate() 函数添加的是一个 “有指向” 的注释文本,也就是有箭头之类的。而 text() 函数添加的是一个无指向的注释文本,也就是没有箭头之类的。

text() 函数只能为一个节点添加注释文本,如果想要添加多个注释文本,我们只需要调用多次 text() 函数就可以了。那么如果想要为所有节点都添加注释文本,此时应该怎么做呢?小伙伴们可以看一下下面例子。

示例 3:Matplotlib 为所有节点添加注释文本

import matplotlib.pyplot as plt

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

# 绘图
x = range(1, 16)
y = [36.0, 36.1, 36.6, 36.2, 36.4, 36.5, 36.0, 36.2, 36.4, 36.8, 36.7, 36.1, 36.6, 36.5, 36.7]
plt.plot(x, y, marker='o', markerfacecolor='white')

# 定义标题
plt.title('15日体温变化')
plt.xlabel('日期')
plt.ylabel('体温')

# 注释文本
for a, b in zip(x, y):
    plt.text(a, b, b)

# 显示
plt.show()

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

Matplotlib为所有节点添加注释文本

分析:

for a, b in zip(x, y):
    plt.text(a, b, b)

上面这一段代码表示为每一个节点添加一个注释文本,关键点在于 zip() 函数的巧妙应用。此外在默认情况下,注释文本的样式并不是非常美观,我们还可以使用 color、fontsize 等参数来自定义样式。

for a, b in zip(x, y):
    plt.text(a, b, b, color='red', fontsize=9, ha='center', va='bottom')

修改后的代码如上所示,其中 ha='center' 表示水平居中,va='bottom' 表示处于底部。再次运行之后,效果如下图所示。

Matplotlib修改节点注释文本的样式

最后要说明一点,这一节介绍的这些设置,不仅仅可以用于折线图,也可以用于其他大多数图表,这一点小伙伴们一定要记住。

给站长反馈

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

邮箱:lvyenet@vip.qq.com

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