Matplotlib:文本注解与常见图形参数详解

240 阅读6分钟

Matplotlib 中文博客:文本注解与常见图形参数详解

本文将详细讲解如何在 Matplotlib 中使用文本注解(包括 plt.textplt.annotate 两种方法),以及散点图、折线图、饼图和柱状图的常见参数设置。为了支持中文显示,我们将使用 TkAgg 后端,并确保所有代码在中文环境中正确运行。


一、Matplotlib 文本注解详解

Matplotlib 提供了两种主要的文本注解方法:plt.textplt.annotate。这两种方法都可以为图形添加文字说明,但用途和灵活性有所不同。以下将详细讲解它们的用法和参数设置。

1. 使用 plt.text 添加简单文本

plt.text 是最简单的文本注解方法,用于在图形的指定位置添加文字。它适合快速添加静态文本说明。

基本用法#### 参数说明
  • x, y: 文本的坐标位置(以数据坐标系为准)。
  • s: 要显示的文本内容(字符串,支持中文)。
  • fontsize: 字体大小(默认 10)。
  • color: 文本颜色(例如 'red', 'blue' 或 RGB 值)。
  • ha, va: 水平对齐(horizontal alignment: 'left', 'center', 'right')和垂直对齐(vertical alignment: 'top', 'center', 'bottom')。
  • rotation: 文本旋转角度(度)。
  • bbox: 文本背景框样式(例如 dict(facecolor='white', alpha=0.5))。
示例代码:使用 plt.text 添加中文文本

以下代码展示如何在散点图中添加中文文本注解。

import matplotlib
matplotlib.use('TkAgg')  # 使用 TkAgg 后端支持中文
import matplotlib.pyplot as plt
import numpy as np

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 生成示例数据
x = np.random.rand(10)
y = np.random.rand(10)

# 创建散点图
plt.scatter(x, y, color='blue', label='数据点')

# 添加文本注解
plt.text(0.2, 0.8, '样本点1', fontsize=12, color='red', ha='center', va='center')
plt.text(0.7, 0.3, '样本点2', fontsize=12, color='green', ha='left', va='bottom', 
         bbox=dict(facecolor='white', alpha=0.5))

plt.title('散点图与文本注解示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.legend()
plt.grid(True)

# 保存图形
plt.savefig('scatter_text_annotation.png')
说明
  • plt.text(0.2, 0.8, '样本点1', ...) 在坐标 (0.2, 0.8) 处添加文本“样本点1”,字体大小为 12,红色,居中对齐。
  • plt.text(0.7, 0.3, '样本点2', ...) 在坐标 (0.7, 0.3) 处添加文本“样本点2”,绿色,左下对齐,并添加半透明白色背景框。
  • bbox 参数为文本添加背景框,alpha 控制透明度(0 到 1)。
  • 保存为 PNG 文件以便查看。

2. 使用 plt.annotate 添加带箭头的复杂注解

plt.annotate 更适合需要指向特定数据点的复杂注解,例如带箭头的标注。它比 plt.text 更灵活,适合强调某个点或区域。

基本参数说明
  • s: 要显示的文本内容(字符串,支持中文)。
  • xy: 箭头指向的坐标(数据坐标系)。
  • xytext: 文本的坐标(数据坐标系)。
  • arrowprops: 箭头样式(字典,例如 dict(arrowstyle='->', color='black'))。
  • fontsize, color, ha, va, bbox: 与 plt.text 相同。
  • xycoords, textcoords: 坐标系类型(默认 'data',表示数据坐标系)。
示例代码:使用 plt.annotate 添加带箭头的中文注解
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
import numpy as np

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 生成示例数据
x = np.random.rand(10)
y = np.random.rand(10)

# 创建散点图
plt.scatter(x, y, color='blue', label='数据点')

# 添加带箭头的注解
plt.annotate('重要数据点', xy=(x[0], y[0]), xytext=(x[0]+0.2, y[0]+0.2),
             arrowprops=dict(arrowstyle='->', color='black'),
             fontsize=12, color='purple', ha='center', va='center',
             bbox=dict(facecolor='white', alpha=0.5))

plt.title('散点图与带箭头注解示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.legend()
plt.grid(True)

# 保存图形
plt.savefig('scatter_annotate_annotation.png')
说明
  • plt.annotate('重要数据点', xy=(x[0], y[0]), ...) 在第一个数据点 (x[0], y[0]) 处添加箭头,指向“重要数据点”文本,文本位置为 (x[0]+0.2, y[0]+0.2)。
  • arrowprops 定义箭头样式,arrowstyle='->' 表示带箭头的线条。
  • 文本为紫色,居中对齐,带半透明白色背景框。
  • 保存为 PNG 文件以便查看。

二、常见图形参数详解(基于 TkAgg 后端和中文支持)

以下介绍散点图、折线图、饼图和柱状图的常见参数,重点说明如何在中文环境中使用 TkAgg 后端绘制这些图形。

1. 散点图(plt.scatter

散点图用于显示离散数据点的分布。

常见参数
  • x, y: 数据点的 x 和 y 坐标(数组)。
  • s: 点的大小(标量或数组,默认 20)。
  • c: 点的颜色(颜色名称、RGB 值或数组)。
  • marker: 点的形状(例如 'o', '^', 's',默认 'o')。
  • alpha: 透明度(0 到 1)。
  • label: 图例标签。
示例代码
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
import numpy as np

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 生成示例数据
x = np.random.rand(10)
y = np.random.rand(10)
sizes = np.random.rand(10) * 1000

# 创建散点图
plt.scatter(x, y, s=sizes, c='blue', alpha=0.5, marker='o', label='随机数据')

plt.title('中文散点图示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.legend()
plt.grid(True)

# 保存图形
plt.savefig('scatter_plot.png')
说明
  • s=sizes 使点大小随机变化。
  • alpha=0.5 设置半透明效果。
  • label 用于图例显示。

2. 折线图(plt.plot

折线图用于显示数据的连续变化趋势。

常见参数
  • x, y: 数据点的 x 和 y 坐标(数组)。
  • color: 线条颜色。
  • linestyle: 线条样式(例如 '-', '--', ':', '-.')。
  • linewidth: 线条宽度(默认 1)。
  • marker: 数据点标记(例如 'o', '^')。
  • label: 图例标签。
示例代码
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
import numpy as np

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 生成示例数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 创建折线图
plt.plot(x, y, color='red', linestyle='--', linewidth=2, marker='o', label='正弦曲线')

plt.title('中文折线图示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.legend()
plt.grid(True)

# 保存图形
plt.savefig('line_plot.png')
说明
  • linestyle='--' 设置虚线。
  • marker='o' 在数据点处添加圆形标记。
  • linewidth=2 增加线条粗细。

3. 饼图(plt.pie

饼图用于显示数据的占比分布。

常见参数
  • x: 各部分的数据(数组)。
  • labels: 各部分的标签(字符串列表)。
  • colors: 各部分的颜色(颜色列表)。
  • autopct: 显示百分比的格式(例如 '%.1f%%')。
  • startangle: 起始角度(默认 0)。
  • explode: 突出显示某部分(数组,例如 [0, 0.1, 0])。
示例代码
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 示例数据
sizes = [30, 40, 20, 10]
labels = ['类别A', '类别B', '类别C', '类别D']
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99']
explode = [0, 0.1, 0, 0]

# 创建饼图
plt.pie(sizes, labels=labels, colors=colors, autopct='%.1f%%', startangle=90, explode=explode)

plt.title('中文饼图示例')
plt.axis('equal')  # 确保饼图为圆形

# 保存图形
plt.savefig('pie_chart.png')
说明
  • autopct='%.1f%%' 显示百分比,保留一位小数。
  • explode=[0, 0.1, 0, 0] 突出显示“类别B”。
  • plt.axis('equal') 确保饼图比例正确。

4. 柱状图(plt.bar

柱状图用于比较不同类别的数据。

常见参数
  • x: 柱子的 x 坐标(数组或类别标签)。
  • height: 柱子的高度(数组)。
  • width: 柱子宽度(默认 0.8)。
  • color: 柱子颜色。
  • align: 对齐方式('center' 或 'edge')。
  • label: 图例标签。
示例代码
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 示例数据
categories = ['类别A', '类别B', '类别C', '类别D']
values = [4, 3, 2, 5]

# 创建柱状图
plt.bar(categories, values, width=0.4, color='skyblue', label='数据')

plt.title('中文柱状图示例')
plt.xlabel('类别')
plt.ylabel('值')
plt.legend()
plt.grid(True, axis='y')

# 保存图形
plt.savefig('bar_chart.png')
说明
  • width=0.4 设置柱子宽度为默认值的一半。
  • color='skyblue' 使用浅蓝色填充。
  • grid(True, axis='y') 添加水平网格线。

三、总结

本文详细讲解了 Matplotlib 的文本注解功能(plt.textplt.annotate),包括参数设置和中文支持的示例代码。此外,我们介绍了散点图、折线图、饼图和柱状图的常见参数,并提供了使用 TkAgg 后端和中文字体(SimHei)的完整代码示例。所有图形均保存为 PNG 文件,方便查看。

通过这些示例,你可以轻松在 Matplotlib 中创建支持中文的图形,并为数据添加清晰的文本注解。希望这篇博客对你学习 Matplotlib 有所帮助!