在 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()运行之后,效果如下图所示。

分析:
需要注意的是,xy 是被注释节点的坐标,而 xytext 是注释文本的坐标。xytext 一般要设置得与 xy 有一定距离才行,不然就可能会重叠。
默认情况下,注释文本和线条箭头都是黑色,我们可以对它们分别定义颜色。修改后的代码如下,此时效果如下图所示。
plt.annotate(
text='最高体温',
xy=(10, 36.8),
xytext=(6, 36.6),
color='red',
arrowprops={'arrowstyle': '->', 'color': 'red'}
)
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()运行之后,效果如下图所示。

分析:
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()运行之后,效果如下图所示。

分析:
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' 表示处于底部。再次运行之后,效果如下图所示。

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