Skip to content

Matplotlib - 处理文本

Matplotlib 提供了全面的文本支持,使您能够为绘图添加标签(labels)、标题(titles)、注释(annotations)和数学表达式。它支持各种字体、Unicode 字符和文本布局。

您可以精细控制文本属性(properties),如字体大小(font size)、粗细(weight)、颜色(color)、旋转(rotation)、对齐(alignment)和位置(position)。Matplotlib 还包含一个强大的引擎,用于使用 TeX 标记(markup)的子集渲染数学表达式。

在使用推荐的面向对象方法时,您通常会在 Axes 或 Figure 对象上调用与文本相关的方法:

方法 (Method)描述 (Description)
ax.set_title()设置 Axes 的标题。
ax.set_xlabel()设置 Axes 的 x 轴标签。
ax.set_ylabel()设置 Axes 的 y 轴标签。
ax.text()在 Axes 坐标内的任意位置添加文本。
ax.annotate()在 Axes 的特定点添加注释(文本和可选的箭头)。
fig.suptitle()为整个 Figure 添加一个居中的总标题。
fig.text()在 Figure 坐标内的任意位置添加文本。

所有这些函数都返回一个 matplotlib.text.Text 对象,允许在创建后进行进一步的自定义。

此脚本演示了如何在面向对象 API 中使用各种文本函数:

import matplotlib.pyplot as plt
import numpy as np
# 准备数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 创建 Figure 和 Axes
fig, ax = plt.subplots(figsize=(8, 6))
# 绘制数据
ax.plot(x, y, label='sin(x)')
# --- 添加文本元素 ---
# 标题和标签
ax.set_title('带有各种文本元素的绘图', fontsize=16)
ax.set_xlabel('X轴值', fontsize=12)
ax.set_ylabel('Y轴值', fontsize=12)
# 使用数据坐标的简单文本
ax.text(1, 0.8, '简单文本位于 (1, 0.8)', fontsize=10)
# 带有背景框和样式的文本
ax.text(3, -0.5, '样式化文本', style='italic', fontsize=12,
bbox={'facecolor': 'lightblue', 'alpha': 0.5, 'pad': 5})
# 数学表达式(使用 TeX)
ax.text(6, 0.5, r'Equation: $E = mc^2$', fontsize=14, color='green')
# 使用 Axes 坐标的文本 (0,0 是左下角, 1,1 是右上角)
ax.text(0.05, 0.95, '左上角 (Axes 坐标)',
transform=ax.transAxes, # 指定坐标系
verticalalignment='top', fontsize=10)
# 指向特定数据点的注释
point_x = x[50]
point_y = y[50]
ax.plot(point_x, point_y, 'ro') # 标记点
ax.annotate('此处添加注释', xy=(point_x, point_y), xytext=(point_x + 1, point_y + 0.3),
arrowprops=dict(facecolor='black', shrink=0.05, width=1, headwidth=8))
# --- 最后润色 ---
ax.legend()
ax.grid(True, linestyle='--', alpha=0.6)
ax.axis([0, 10, -1.2, 1.2]) # 设置略宽的轴范围
plt.tight_layout() # 调整布局
plt.show()

此代码将生成一个正弦波图,其中包含各种文本元素:一个主标题、轴标签、使用数据坐标放置的文本、带有背景框的样式化文本、使用 TeX 渲染的数学公式、相对于 Axes 边界定位的文本,以及指向特定数据点并带有箭头的注释。

  • 数据坐标 (Data Coordinates): 默认情况下,ax.text() 使用与您的绘制数据相同的坐标系。
  • Axes 坐标 (Axes Coordinates): 使用 transform=ax.transAxes 进行相对于 Axes 边界框(bounding box)的放置 (0,0 是左下角,1,1 是右上角)。对于角落等固定位置的文本非常有用。
  • Figure 坐标 (Figure Coordinates): 使用 transform=fig.transFigure 进行相对于整个 Figure 画布的放置。
  • 注释 (Annotations): ax.annotate() 是用于标记特定特征的强大工具,它会根据 xy(要注释的点)和 xytext(文本位置)自动处理文本和箭头的放置。