### 普通文本型回答
为了使可视化图形更易于理解,添加注释是一种非常有效的手段。在 `matplotlib` 中,可以通过 `plt.text()` 或 `plt.annotate()` 函数为图表添加文字说明或箭头标注。
---
#### 使用 `plt.text()` 添加静态文本注释
```python
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体和负号显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 示例数据
plt.plot([5, 21, 12, 53, 7, 6, 43, 1, 69])
# 定义样式
style = dict(size=10, color='gray')
# 在每个点上方添加注释
for i, value in enumerate([5, 21, 12, 53, 7, 6, 43, 1, 69]):
plt.text(i, value + 2, f"第{i+1}个点", ha='center', **style)
plt.title("带文本注释的折线图")
plt.show()
```
> ✅ `plt.text(x, y, s, **kwargs)` 参数说明:
- `x`, `y`:文本放置的坐标;
- `s`:要显示的字符串;
- `ha`:水平对齐方式(`left`, `center`, `right`);
- `va`:垂直对齐方式(`top`, `center`, `bottom`, `baseline`);
- `fontsize`:字体大小;
- `rotation`:旋转角度(如 `45` 表示倾斜45度);
- `alpha`:透明度(0~1);
- `backgroundcolor`:背景色。
---
#### 使用 `plt.annotate()` 添加带箭头的注释
```python
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 6)
y = x * x
plt.plot(x, y, marker='o')
# 为每个点添加坐标注释(偏移显示)
for xy in zip(x, y):
plt.annotate(f"({xy[0]},{xy[1]})",
xy=xy,
xytext=(-20, 10),
textcoords='offset points',
fontsize=9,
arrowprops=dict(arrowstyle='->', color='blue', lw=0.5))
# 标注最大值点
plt.annotate('峰值',
xy=(5, 25),
xytext=(4.3, 15),
fontsize=12,
arrowprops=dict(facecolor='black', shrink=0.05, width=1.5))
plt.title("带箭头注释的二次函数图像")
plt.show()
```
> ✅ `plt.annotate()` 关键参数:
- `s`:注释文本;
- `xy`:被注释点的坐标;
- `xytext`:文本放置的位置;
- `textcoords`:文本坐标的参考系统(如 `'offset points'` 表示相对于 `xy` 的像素偏移);
- `arrowprops`:箭头属性字典,常用:
- `arrowstyle`:箭头样式(`'->'`, `'fancy'`, `'simple'` 等);
- `facecolor`:箭头颜色;
- `shrink`:箭头两端收缩比例;
- `lw`:线宽。
---
#### 坐标变换:使用 `transform` 控制文本位置系统
```python
fig, ax = plt.subplots(figsize=(8, 6))
ax.axis([0, 10, 0, 10])
# 数据坐标系(随数据变化而变化)
ax.text(1, 5, ". 数据坐标: (1, 5)", transform=ax.transData, fontsize=10, color='red')
# 轴坐标系(左下角为 (0,0),右上角为 (1,1))
ax.text(0.5, 0.1, ". 轴坐标系中的位置", transform=ax.transAxes, fontsize=10, color='green')
# 图形坐标系(整个figure范围)
ax.text(0.2, 0.2, ". Figure坐标系", transform=fig.transFigure, fontsize=10, color='blue')
plt.title("不同坐标系下的文本标注")
plt.show()
```
> ✅ 常见 `transform` 选项:
- `ax.transData`:以数据单位为基准;
- `ax.transAxes`:轴内相对位置((0,0) 左下 → (1,1) 右上);
- `fig.transFigure`:整个画布的相对位置。
---
#### 实际应用建议
| 场景 | 推荐方法 |
|------|----------|
| 简单标签标注 | `plt.text()` |
| 强调某个点并加箭头 | `plt.annotate()` |
| 自动适应缩放的文字 | 配合 `transform` 使用 |
| 中文支持 | 设置 `plt.rcParams['font.sans-serif'] = ['SimHei']` |
通过合理使用这些注释功能,可以显著提升图表的信息传达能力与可读性。