46·模块十:数据处理与分析进阶

数据可视化:Matplotlib 基础

matplotlibvisualizationplotting

第46课:数据可视化:Matplotlib 基础

1. 学习目标

学完本课,你将能够:

  • 理解 Matplotlib 的核心架构,特别是 Figure (画板) 与 Axes (坐标系) 的关系。
  • 掌握 使用 matplotlib.pyplot 模块绘制基本图表(折线图、柱状图、散点图)的流程。
  • 运用 面向对象 (OO) 的 API 来创建和精细控制图表,包括标题、坐标轴标签、图例和网格。
  • 实现 在一个 Figure 中创建多个子图 (Subplots),进行数据的多角度对比分析。

2. 核心概念

Matplotlib 是什么?

想象一下,你想用手画一幅图表。你需要:

  1. 一块画板 (Figure):这是你所有绘图的容器。
  2. 一个或多个画布/坐标系 (Axes):每个坐标系是画板上独立绘制图表的区域,包含 x 轴、y 轴、标题、刻度等。
  3. 画笔和颜料 (绘图函数):在坐标系里绘制点、线、条形等。

Matplotlib 就是用 Python 代码模拟这个过程的工具库。它主要有两种工作方式:

  • pyplot 模块:提供类似 MATLAB 的命令式接口,简单快捷,适合快速探索。
  • 面向对象 (OO) API:先创建 FigureAxes 对象,再调用它们的方法。更灵活、功能更强大,是构建复杂可视化图表的推荐方式。

我们将重点学习 面向对象 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^3x 从 -5 到 5 的曲线图,并加上网格线。
  • 右边子图:绘制 y = 3^xx 从 0 到 5 的曲线图,并使用红色线。
  • 为每个子图设置合适的标题和坐标轴标签。

练习3:综合挑战(选做)

要求:读取或生成一个包含 "月份""降雨量(mm)" 的数据集(如12个月),绘制:

  • 一个主图 (Axes) 为柱状图,显示各月降雨量。
  • 在同一张图上覆盖一个折线图,显示月平均降雨量线(假设为常数 80mm)。
  • 将折线图的标签设为 "Average",并在图例中清晰显示。

5. 常见错误

  1. 忘记调用 plt.show():在脚本或非交互式环境中,不调用 show() 函数,图表窗口将不会弹出。在 Jupyter Notebook 中通常可以省略,因为它会自动显示最后的对象。
  2. 混淆 FigureAxes 的属性设置方法:记住,ax.set_title() 设置的是坐标系内的标题,fig.suptitle() 设置的是整个画板的总标题。
  3. 坐标轴标签显示乱码(特别是中文):这是字体问题。可以在代码开头添加以下设置来尝试解决:
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号
    
  4. 子图布局重叠:使用 plt.tight_layout() 或在 subplots() 中设置 constrained_layout=True,可以自动调整子图参数,使之填充整个图像区域,避免标签或标题被切断。
  5. 过度使用 pyplot 全局状态:在复杂脚本或循环中,频繁调用 plt.plot() 等命令可能导致难以追踪当前操作的是哪个 Axes。养成先创建明确对象 (fig, ax = plt.subplots()),再对对象进行操作的习惯。

6. 小结

  • 核心架构:Matplotlib 的绘图围绕 Figure (画板)Axes (坐标系) 展开。一个 Figure 可以包含一个或多个 Axes
  • 两种APIpyplot 适合快速绘图,面向对象 API (fig, ax) 功能强大且灵活,是专业可视化的首选。
  • 基本三步曲
    1. import matplotlib.pyplot as plt
    2. fig, ax = plt.subplots() 创建对象。
    3. ax.plot() / ax.bar() / ax.scatter() 绑定数据并绘制。
  • 图表美化:通过 ax.set_title(), ax.set_xlabel(), ax.legend(), ax.grid() 等方法,为图表添加清晰的上下文信息,使其易于理解。
  • 多图分析:使用 plt.subplots(nrows, ncols) 轻松创建子图网格,实现数据的多维度并行展示。

掌握了 Matplotlib 的这些基础,你就拥有了将数据转化为直观图像的能力。下一课,我们将在此基础上学习更高级、更美观的统计图表绘制库——Seaborn。

练习编辑器

python
Loading...

继续学习

完成本课后,建议继续学习下一课「数据可视化:Seaborn 统计图表」 以巩固所学知识。