7·基础入门入门

Matplotlib 基础:数据可视化入门

visualizationmatplotlib

第7课 - Matplotlib 基础:数据可视化入门

学习目标

完成本课后,你将能够:

  1. 理解 Matplotlib 的核心概念(Figure 和 Axes)
  2. 使用 Matplotlib 绘制折线图、柱状图和饼图等基础图表
  3. 对图表的标题、坐标轴标签、图例等元素进行基本自定义
  4. 将生成的图表保存为图片文件

核心概念

想象一下,你是一个画家,面前有画纸和画笔。在 Matplotlib 的世界里:

  • Figure:就是你的整张“画纸”。它是容纳所有绘图元素(图表、标题、标签等)的最顶层容器。
  • Axes:是画纸上的一个“画框”或“绘图区域”。一张画纸(Figure)上可以有一个或多个画框(Axes),你实际上是在 Axes 上绘制数据点的。

最常用的工作流程是:先创建一个 Figure 和一个或多个 Axes,然后在 Axes 上调用绘图方法(如 plot()),最后对图表进行装饰(加标题、标签等)。

Matplotlib 的两种常用接口:

  1. pyplot 接口:类似 MATLAB 的风格,快速简单,适合交互式探索。我们将主要使用它。
  2. 面向对象接口:更灵活、更强大,适合创建复杂的图表。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:绘制正弦和余弦曲线

要求:

  1. 在同一个 Axes 上绘制 y = sin(x)y = cos(x),其中 x0
  2. 为两条曲线设置不同的颜色和线型(如实线和虚线)。
  3. 添加标题、坐标轴标签和图例。
  4. 显示网格线。

预期输出应显示两条交织的曲线,有清晰的标签和图例。

练习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]

要求:

  1. 创建一个 Figure 包含两个子图。
  2. 第一个子图:使用柱状图对比两种产品每月的销售额。
  3. 第二个子图:使用折线图展示两种产品销售额随时间的变化趋势。
  4. 给每个子图添加合适的标题和标签。

练习3:绘制组合图表(挑战题)

要求:

  1. 创建一个包含两个Y轴的图表(使用 twinx() 方法)。
  2. 左侧Y轴绘制某城市每月平均气温的折线图(单位:摄氏度)。
  3. 右侧Y轴绘制该城市每月降水量的柱状图(单位:毫米)。
  4. 为两个Y轴分别添加标签,并在图例中区分两种数据。

提示:你可以使用如下示例数据:

months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']
temperature = [2, 5, 10, 15, 20, 25]
rainfall = [50, 40, 45, 55, 60, 40]

常见错误

  1. 忘记调用 plt.show():在脚本环境中(非 Jupyter Notebook),如果忘了这一步,图表窗口不会弹出。

    # 错误示例
    plt.plot([1, 2, 3])
    # 缺少 plt.show(),图表可能不显示
    
    # 正确做法
    plt.plot([1, 2, 3])
    plt.show()
    
  2. 混淆 Figure 和 Axes:试图在 Figure 上直接设置标题或标签,而不是在 Axes 上。

    fig = plt.figure()
    # 错误:fig.set_title() 不存在
    # 正确:应该先获取 axes
    ax = fig.add_subplot(111)
    ax.set_title('My Title')
    
  3. 在循环中不加区分地绘图:每次循环都创建新的 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()
    
  4. 硬编码数据到绘图代码中:使得代码难以复用和修改。

    # 不推荐
    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...

继续学习

完成本课后,建议继续学习下一课「用 Scikit-learn 构建你的第一个机器学习模型」 以巩固所学知识。