第7课 - Matplotlib 基础:数据可视化入门
学习目标
完成本课后,你将能够:
- 理解 Matplotlib 的核心概念(Figure 和 Axes)
- 使用 Matplotlib 绘制折线图、柱状图和饼图等基础图表
- 对图表的标题、坐标轴标签、图例等元素进行基本自定义
- 将生成的图表保存为图片文件
核心概念
想象一下,你是一个画家,面前有画纸和画笔。在 Matplotlib 的世界里:
- Figure:就是你的整张“画纸”。它是容纳所有绘图元素(图表、标题、标签等)的最顶层容器。
- Axes:是画纸上的一个“画框”或“绘图区域”。一张画纸(Figure)上可以有一个或多个画框(Axes),你实际上是在 Axes 上绘制数据点的。
最常用的工作流程是:先创建一个 Figure 和一个或多个 Axes,然后在 Axes 上调用绘图方法(如 plot()),最后对图表进行装饰(加标题、标签等)。
Matplotlib 的两种常用接口:
pyplot接口:类似 MATLAB 的风格,快速简单,适合交互式探索。我们将主要使用它。- 面向对象接口:更灵活、更强大,适合创建复杂的图表。
pyplot接口在其底层也调用了它。
代码示例
示例1:绘制你的第一张折线图
import matplotlib.pyplot as plt
import numpy as np # 用于生成示例数据
# 1. 准备数据
x = np.linspace(0, 10, 100) # 在0到10之间生成100个等间距点
y = np.sin(x) # 计算每个点的正弦值
# 2. 创建 Figure 和 Axes,并绘制折线图
plt.figure(figsize=(8, 4)) # 创建一个8英寸宽、4英寸高的画纸
plt.plot(x, y, label='sin(x)', color='blue', linewidth=2)
# 3. 装饰图表
plt.title('My First Matplotlib Plot') # 设置标题
plt.xlabel('X Axis') # 设置X轴标签
plt.ylabel('Y Axis') # 设置Y轴标签
plt.legend() # 显示图例
plt.grid(True) # 显示网格线
# 4. 显示图表
plt.show()
示例2:使用子图绘制多个图表
import matplotlib.pyplot as plt
import numpy as np
# 准备两组数据
x = np.linspace(0, 2 * np.pi, 50)
y1 = np.sin(x)
y2 = np.cos(x)
# 创建一个包含 1行2列 子图的 Figure
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))
# 在第一个子图(ax1)上绘制正弦曲线
ax1.plot(x, y1, 'r-', label='sin') # 'r-' 表示红色实线
ax1.set_title('Sine Wave')
ax1.set_xlabel('x')
ax1.set_ylabel('sin(x)')
ax1.legend()
ax1.grid(True, alpha=0.3) # alpha控制透明度
# 在第二个子图(ax2)上绘制余弦曲线
ax2.plot(x, y2, 'b--', label='cos') # 'b--' 表示蓝色虚线
ax2.set_title('Cosine Wave')
ax2.set_xlabel('x')
ax2.set_ylabel('cos(x)')
ax2.legend()
ax2.grid(True, alpha=0.3)
plt.tight_layout() # 自动调整子图间距,避免标签重叠
plt.show()
示例3:柱状图和饼图
import matplotlib.pyplot as plt
# 示例数据:不同编程语言的学习人数
languages = ['Python', 'Java', 'C++', 'JavaScript', 'Go']
popularity = [45, 30, 15, 40, 10]
# 创建一个 Figure 和两个并排的 Axes
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
# 绘制柱状图
bars = ax1.bar(languages, popularity, color=['skyblue', 'lightgreen', 'lightcoral', 'lightsalmon', 'gold'])
ax1.set_title('Programming Language Popularity')
ax1.set_xlabel('Language')
ax1.set_ylabel('Number of Learners (thousands)')
ax1.set_ylim(0, 50) # 设置Y轴范围,让图表更清晰
# 绘制饼图
colors = ['#ff9999','#66b3ff','#99ff99','#ffcc99','#c2c2f0']
ax2.pie(popularity, labels=languages, autopct='%1.1f%%', colors=colors, startangle=90)
ax2.set_title('Popularity Distribution')
ax2.axis('equal') # 确保饼图是圆形的
plt.tight_layout()
plt.show()
# 也可以单独保存图表到文件
# fig.savefig('language_popularity.png', dpi=300, bbox_inches='tight')
实践练习
练习1:绘制正弦和余弦曲线
要求:
- 在同一个 Axes 上绘制
y = sin(x)和y = cos(x),其中x从0到2π。 - 为两条曲线设置不同的颜色和线型(如实线和虚线)。
- 添加标题、坐标轴标签和图例。
- 显示网格线。
预期输出应显示两条交织的曲线,有清晰的标签和图例。
练习2:创建数据对比图表
假设有以下销售数据:
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']
product_A_sales = [120, 135, 148, 160, 155, 170]
product_B_sales = [90, 110, 125, 130, 140, 150]
要求:
- 创建一个 Figure 包含两个子图。
- 第一个子图:使用柱状图对比两种产品每月的销售额。
- 第二个子图:使用折线图展示两种产品销售额随时间的变化趋势。
- 给每个子图添加合适的标题和标签。
练习3:绘制组合图表(挑战题)
要求:
- 创建一个包含两个Y轴的图表(使用
twinx()方法)。 - 左侧Y轴绘制某城市每月平均气温的折线图(单位:摄氏度)。
- 右侧Y轴绘制该城市每月降水量的柱状图(单位:毫米)。
- 为两个Y轴分别添加标签,并在图例中区分两种数据。
提示:你可以使用如下示例数据:
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']
temperature = [2, 5, 10, 15, 20, 25]
rainfall = [50, 40, 45, 55, 60, 40]
常见错误
-
忘记调用
plt.show():在脚本环境中(非 Jupyter Notebook),如果忘了这一步,图表窗口不会弹出。# 错误示例 plt.plot([1, 2, 3]) # 缺少 plt.show(),图表可能不显示 # 正确做法 plt.plot([1, 2, 3]) plt.show() -
混淆 Figure 和 Axes:试图在 Figure 上直接设置标题或标签,而不是在 Axes 上。
fig = plt.figure() # 错误:fig.set_title() 不存在 # 正确:应该先获取 axes ax = fig.add_subplot(111) ax.set_title('My Title') -
在循环中不加区分地绘图:每次循环都创建新的 Figure,导致生成多个窗口。
# 错误:每次循环创建新画纸 for i in range(3): plt.figure() # 这会创建三个独立的窗口 plt.plot([1, 2, 3], [i, i+1, i+2]) plt.show() # 正确:先创建好画纸和画框 fig, ax = plt.subplots() for i in range(3): ax.plot([1, 2, 3], [i, i+1, i+2], label=f'Line {i}') ax.legend() plt.show() -
硬编码数据到绘图代码中:使得代码难以复用和修改。
# 不推荐 plt.bar(['A', 'B', 'C'], [10, 20, 15]) # 推荐:使用变量 categories = ['A', 'B', 'C'] values = [10, 20, 15] plt.bar(categories, values)
小结
本课我们学习了 Matplotlib 的基础知识:
- 核心架构:理解了
Figure(画纸)和Axes(画框)的关系,这是使用 Matplotlib 的关键。 - 基本绘图:掌握了折线图 (
plot)、柱状图 (bar)、饼图 (pie) 的绘制方法。 - 图表装饰:学会了如何添加标题 (
title)、坐标轴标签 (xlabel/ylabel)、图例 (legend) 和网格线 (grid)。 - 子图布局:使用
subplots创建并管理多个子图,实现数据的并排对比。 - 实践出真知:数据可视化不仅是代码,更是艺术。多尝试不同的图表类型和样式,找到最能传达数据故事的方式。
在下一课中,我们将开始使用 Scikit-learn 构建机器学习模型,而 Matplotlib 将成为你可视化模型结果、理解数据分布的得力工具。
练习编辑器
rust
Loading...