Matplotlib 数据可视化:图表绘制与定制
Matplotlib 数据可视化:图表绘制与定制
Matplotlib 是 Python 中最经典、功能最全面的数据可视化库。它既能快速生成出版质量的图表,又能深入控制每一个绘图元素。本教程面向零基础用户,从第一个图形开始,带你掌握常见图表的绘制与高度自定义。
1. 环境准备与第一个图形
在使用前请确保已安装 Matplotlib:
pip install matplotlib
导入惯例:
import matplotlib.pyplot as plt
import numpy as np
绘制第一条折线:
x = [1, 2, 3, 4]
y = [2, 4, 6, 8]
plt.plot(x, y)
plt.show()
你会看到一个简洁的折线图窗口。plot() 是核心函数,show() 用于显示图形。在 Jupyter Notebook 中,可使用 %matplotlib inline 让图形嵌入单元格。
2. 常用图表类型速成
Matplotlib 可通过不同函数生成各类统计图表。以下覆盖5种最常用图表。
2.1 折线图(Line Plot)
适合展示趋势或连续数据变化。
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
2.2 散点图(Scatter Plot)
展示两个变量间的关系或分布。
x = np.random.rand(50)
y = np.random.rand(50)
colors = np.random.rand(50)
plt.scatter(x, y, c=colors, alpha=0.7)
2.3 柱状图(Bar Chart)
比较分类数据的数值。
categories = ['A', 'B', 'C', 'D']
values = [25, 40, 30, 50]
plt.bar(categories, values)
横向柱状图使用 plt.barh()。
2.4 直方图(Histogram)
观察数据分布及频数。
data = np.random.randn(1000)
plt.hist(data, bins=30, edgecolor='black')
2.5 饼图(Pie Chart)
展示各部分占整体的比例。
sizes = [30, 25, 20, 25]
labels = ['A', 'B', 'C', 'D']
plt.pie(sizes, labels=labels, autopct='%1.1f%%')
plt.axis('equal') # 保证饼图为正圆
3. 图表定制:从可用到专业
默认样式往往不能满足需求,定制是数据可视化的重要环节。
3.1 样式与颜色
Matplotlib 提供丰富的内置样式,也可手动修改颜色、线型等。
plt.style.use('seaborn-v0_8-darkgrid') # 使用内置样式
# plot 中定制颜色、线宽、线型、标记
plt.plot(x, y, color='#2ca02c', linewidth=2, linestyle='--', marker='o')
常用线型:'-'(实线)、'--'(虚线)、'-.'(点划线)、':'(点线)。
颜色支持英文名称、十六进制码、RGB 元组等。
3.2 标题与坐标轴标签
信息充分的标签让图表自解释。
plt.title('Sine Wave', fontsize=14, fontweight='bold')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
3.3 图例(Legend)
多数据系列时必须添加图例。
plt.plot(x, np.sin(x), label='sin')
plt.plot(x, np.cos(x), label='cos')
plt.legend(loc='upper right', frameon=True)
loc 可指定位置,如 'best'、'lower left' 等。
3.4 坐标轴范围与刻度
控制显示区域与刻度密度。
plt.xlim(0, 8) # X轴范围
plt.ylim(-1.5, 1.5) # Y轴范围
plt.xticks(np.arange(0, 9, 2)) # 自定义刻度位置
plt.yticks([-1, 0, 1], ['Low', 'Zero', 'High']) # 刻度标签
3.5 网格与参考线
网格提高可读性,参考线强调关键值。
plt.grid(True, linestyle=':', alpha=0.7) # 开启网格
plt.axhline(y=0, color='red', linewidth=1) # 水平参考线
plt.axvline(x=5, color='gray', linestyle='--')
3.6 注释与文本
在数据点添加说明文字。
plt.annotate('maximum', xy=(1.57, 1), xytext=(3, 1.3),
arrowprops=dict(facecolor='black', arrowstyle='->'))
也可使用 plt.text(x, y, 'text') 放置普通文本。
4. 多子图与画布控制
在实际报告中常需要将多个图表组合在一起。
4.1 使用 subplot()
plt.figure(figsize=(10, 4)) # 画布尺寸
plt.subplot(1, 2, 1) # 1行2列第1个
plt.plot(x, np.sin(x))
plt.title('Sin')
plt.subplot(1, 2, 2)
plt.plot(x, np.cos(x))
plt.title('Cos')
plt.tight_layout() # 自动调整子图间距
plt.show()
4.2 更灵活的 subplots()
返回 figure 和 axes 数组,适合批量操作。
fig, axes = plt.subplots(2, 2, figsize=(8, 6))
axes[0, 0].plot(x, y, 'r')
axes[0, 1].scatter(x, y, s=5)
axes[1, 0].bar(['A','B'], [10,20])
axes[1, 1].hist(data, bins=20)
plt.tight_layout()
5. 保存与导出图表
图表可保存为多种格式,适合嵌入论文或网页。
plt.savefig('chart.png', dpi=300, bbox_inches='tight', transparent=False)
参数说明:
dpi:分辨率,印刷推荐 300 以上。bbox_inches='tight':自动裁剪白边。transparent:是否透明背景。
保存前建议先调用 plt.tight_layout() 以防标签被截断。
6. 进阶定制建议
- 面向对象风格:推荐使用
fig, ax = plt.subplots()然后调用ax.plot()等方法,便于精确控制。 - 自定义字体:通过
plt.rcParams['font.family']设置全局字体,解决中文显示问题。 - 颜色映射(Colormap):散点图、热力图使用
cmap参数映射数值颜色,如cmap='viridis'。 - 双Y轴:使用
ax.twinx()创建共享X轴的不同Y轴。 - 交互模式:
plt.ion()开启交互绘图,适合实时数据流。
7. 常见问题排查
| 问题 | 解决方法 |
|---|---|
| 图形不显示 | 检查是否调用 plt.show() 或 %matplotlib inline |
| 中文乱码或方框 | 设置支持中文的字体,如 plt.rcParams['font.sans-serif'] = ['SimHei'] |
| 多图重叠 | 使用 plt.tight_layout() 或在创建时调整 figsize |
| 保存图片一片空白 | 保存代码放在 plt.show() 之前,或在 plt.show() 后先 plt.gcf() |
通过上述核心绘图与定制技巧,你已经可以用 Matplotlib 创建专业且可复用的数据可视化作品。多加练习,将数据的故事用图形有力表达出来。