第46课:数据可视化:Matplotlib 基础
1. 学习目标
学完本课,你将能够:
- 理解 Matplotlib 的核心架构,特别是
Figure(画板) 与Axes(坐标系) 的关系。 - 掌握 使用
matplotlib.pyplot模块绘制基本图表(折线图、柱状图、散点图)的流程。 - 运用 面向对象 (OO) 的 API 来创建和精细控制图表,包括标题、坐标轴标签、图例和网格。
- 实现 在一个 Figure 中创建多个子图 (Subplots),进行数据的多角度对比分析。
2. 核心概念
Matplotlib 是什么?
想象一下,你想用手画一幅图表。你需要:
- 一块画板 (Figure):这是你所有绘图的容器。
- 一个或多个画布/坐标系 (Axes):每个坐标系是画板上独立绘制图表的区域,包含 x 轴、y 轴、标题、刻度等。
- 画笔和颜料 (绘图函数):在坐标系里绘制点、线、条形等。
Matplotlib 就是用 Python 代码模拟这个过程的工具库。它主要有两种工作方式:
pyplot模块:提供类似 MATLAB 的命令式接口,简单快捷,适合快速探索。- 面向对象 (OO) API:先创建
Figure和Axes对象,再调用它们的方法。更灵活、功能更强大,是构建复杂可视化图表的推荐方式。
我们将重点学习 面向对象 API,因为它能让你对图表的每一个细节拥有完全的控制权。
3. 代码示例
示例1:绘制你的第一张折线图(基础三步曲)
import matplotlib.pyplot as plt
import numpy as np
# 1. 准备数据
x = np.linspace(0, 2 * np.pi, 100) # 生成0到2π之间的100个点
y = np.sin(x) # 正弦函数值
# 2. 创建 Figure 和 Axes 对象(核心步骤)
fig, ax = plt.subplots(figsize=(8, 4)) # figsize设置画板大小(英寸)
# 3. 在 Axes 上绘制图形
ax.plot(x, y, color='blue', linewidth=2, linestyle='-', label='sin(x)')
ax.plot(x, np.cos(x), color='red', linewidth=2, linestyle='--', label='cos(x)')
# 4. 美化和标注图表
ax.set_title('Sine & Cosine Curves') # 设置标题
ax.set_xlabel('Angle (radians)') # 设置x轴标签
ax.set_ylabel('Amplitude') # 设置y轴标签
ax.legend() # 显示图例
ax.grid(True, linestyle=':', alpha=0.7) # 显示网格,alpha设置透明度
ax.set_ylim(-1.5, 1.5) # 设置y轴范围
# 5. 显示图表
plt.show()
示例2:多子图 (Subplots) 绘制
将多个图表放在一个画板上,便于对比分析。
import matplotlib.pyplot as plt
import numpy as np
# 准备数据
x = np.linspace(0, 10, 50)
y1 = np.sin(x)
y2 = np.exp(x/10)
y3 = x**2
# 创建2行2列的子图布局,返回Figure对象和包含4个Axes对象的数组
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8))
# 在每个子图上分别绘图
# axes[0, 0] 表示第一行第一列的子图
axes[0, 0].plot(x, y1, 'r-')
axes[0, 0].set_title('Sin(x)')
axes[0, 0].set_xlabel('x')
axes[0, 0].set_ylabel('y')
axes[0, 1].scatter(x, y2, color='green', marker='o', s=20) # 散点图,s控制点大小
axes[0, 1].set_title('Exp(x/10)')
axes[0, 1].set_xlabel('x')
axes[1, 0].bar(np.arange(10), np.arange(10)**2, color='purple') # 柱状图
axes[1, 0].set_title('Bar Chart')
axes[1, 0].set_xlabel('n')
axes[1, 0].set_ylabel('n^2')
axes[1, 1].plot(x, y3, 'g--', linewidth=3)
axes[1, 1].set_title('x^2')
axes[1, 1].set_xlabel('x')
axes[1, 1].set_ylabel('y')
axes[1, 1].grid(True)
# 自动调整子图间距,防止标签重叠
plt.tight_layout()
plt.show()
4. 实践练习
练习1:基础柱状图
要求:使用面向对象 API,绘制一周七天(周一到周日)每日销售额的柱状图。
- 自行创建模拟数据(如
[120, 135, 148, 160, 175, 190, 155])。 - 设置图表标题为 "Weekly Sales Report"。
- 设置 x 轴标签为 "Day",y 轴标签为 "Sales (USD)"。
- 给柱子设置你喜欢的颜色。
练习2:多子图对比
要求:创建一个 Figure,包含两个并排的子图 (1行2列)。
- 左边子图:绘制
y = x^3在x从 -5 到 5 的曲线图,并加上网格线。 - 右边子图:绘制
y = 3^x在x从 0 到 5 的曲线图,并使用红色线。 - 为每个子图设置合适的标题和坐标轴标签。
练习3:综合挑战(选做)
要求:读取或生成一个包含 "月份" 和 "降雨量(mm)" 的数据集(如12个月),绘制:
- 一个主图 (Axes) 为柱状图,显示各月降雨量。
- 在同一张图上覆盖一个折线图,显示月平均降雨量线(假设为常数 80mm)。
- 将折线图的标签设为 "Average",并在图例中清晰显示。
5. 常见错误
- 忘记调用
plt.show():在脚本或非交互式环境中,不调用show()函数,图表窗口将不会弹出。在 Jupyter Notebook 中通常可以省略,因为它会自动显示最后的对象。 - 混淆
Figure和Axes的属性设置方法:记住,ax.set_title()设置的是坐标系内的标题,fig.suptitle()设置的是整个画板的总标题。 - 坐标轴标签显示乱码(特别是中文):这是字体问题。可以在代码开头添加以下设置来尝试解决:
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 - 子图布局重叠:使用
plt.tight_layout()或在subplots()中设置constrained_layout=True,可以自动调整子图参数,使之填充整个图像区域,避免标签或标题被切断。 - 过度使用
pyplot全局状态:在复杂脚本或循环中,频繁调用plt.plot()等命令可能导致难以追踪当前操作的是哪个Axes。养成先创建明确对象 (fig, ax = plt.subplots()),再对对象进行操作的习惯。
6. 小结
- 核心架构:Matplotlib 的绘图围绕
Figure(画板) 和Axes(坐标系) 展开。一个Figure可以包含一个或多个Axes。 - 两种API:
pyplot适合快速绘图,面向对象 API (fig, ax) 功能强大且灵活,是专业可视化的首选。 - 基本三步曲:
import matplotlib.pyplot as pltfig, ax = plt.subplots()创建对象。ax.plot()/ax.bar()/ax.scatter()绑定数据并绘制。
- 图表美化:通过
ax.set_title(),ax.set_xlabel(),ax.legend(),ax.grid()等方法,为图表添加清晰的上下文信息,使其易于理解。 - 多图分析:使用
plt.subplots(nrows, ncols)轻松创建子图网格,实现数据的多维度并行展示。
掌握了 Matplotlib 的这些基础,你就拥有了将数据转化为直观图像的能力。下一课,我们将在此基础上学习更高级、更美观的统计图表绘制库——Seaborn。
练习编辑器
python
Loading...