5-1 Matplotlib 基础数据可视化

🎯 教学目标与重难点…

【三维目标】

  • 📚 知识目标:掌握 Matplotlib 的导包与极简绘图流程;理解 plot() 函数的核心样式参数;掌握画布、坐标轴、图例、标题及网格等图表元素的配置方法。
  • ⚙️ 能力目标:能够独立根据给定的数据序列,运用合适的颜色、线型和标记绘制双线对比折线图,并配置规范的图表文本说明。
  • 💡 素养目标:培养规范的数据表达习惯与代码编写严谨性,建立数据可视化呈现的审美与信息传递意识。

【重点与难点】

  • 🟢 教学重点plt.plot() 美化参数(颜色、线型、标记)的组合使用;图表基础辅助元素(标题、坐标轴标签、图例、网格)的完整渲染。
  • 🟡 教学难点:多线条绘制时的参数对应与 legend() 图例映射;Windows 环境下中文字体乱码的全局配置。

📌 一、 课程导入(5分钟)

1. 极简代码展示: 在 Jupyter Notebook 中运行仅用 4 行代码生成的极简折线图:

1import matplotlib.pyplot as plt
2
3x = [1, 2, 3, 4, 5]
4y = [2, 4, 6, 8, 10]
5
6plt.plot(x, y)
7plt.show()

2. 启发式讨论: 引导学生观察生成的图表并思考:

  • 图表虽然出来了,但我们能看出它表达的是什么数据吗?
  • 没有标题、没有坐标轴说明、线条单调,这样的图表能否直接放到项目报告或网页展示中?
  • 结论:数据可视化的核心不仅是“画出来”,更是“清晰、规范地表达数据”。本节课我们将学习如何给图表进行全面美化与标准配置。
  • 👨‍🏫 教师活动:现场演示运行极简代码,抛出问题引导学生观察图表缺失的要素,总结可视化规范的重要性。
  • 🧑‍🎓 学生活动:观察屏幕上渲染的折线图,指出图表中缺少标题、单位、线条标识等问题,思考如何改进。

通过“极简但简陋”的代码结果形成反差,迅速消除学生对绘图代码的恐惧感,同时激发学生修饰和完善图表的学习欲望。


📖 二、 解决问题过程(一):核心线条美化与参数详解(20分钟)

要让折线图具有良好的可读性,核心在于对 plt.plot() 函数的参数配置。

1. 中文字体全局初始化(Windows 环境)

在进行任何含中文图表绘制前,需配置字体解决乱码问题:

1plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
2plt.rcParams['axes.unicode_minus'] = False     # 用来正常显示负号

2. plt.plot() 核心美化参数一览表

参数名 全称 / 缩写 作用说明 常用可选值与示例
color c 折线颜色 'r'(红), 'g'(绿), 'b'(蓝), 'k'(黑), '#336699'
linestyle ls 线型样式 '-'(实线), '--'(虚线), ':'(点线), '-.'(点划线)
linewidth lw 线条宽度 数值,如 1.5, 2.0, 3.0
marker - 数据标记点形状 'o'(圆点), 's'(正方形), '*'(星号), '+'(加号)
markersize ms 标记点大小 数值,如 6, 8, 10
markerfacecolor mfc 标记点内部填充色 颜色字符串,如 'white', 'yellow'

3. 代码示例:修饰单条折线

 1import matplotlib.pyplot as plt
 2
 3plt.rcParams['font.sans-serif'] = ['SimHei']
 4plt.rcParams['axes.unicode_minus'] = False
 5
 6days = ['周一', '周二', '周三', '周四', '周五']
 7sales = [120, 180, 150, 230, 210]
 8
 9plt.plot(days, sales, 
10         color='crimson', 
11         linestyle='--', 
12         linewidth=2.5, 
13         marker='o', 
14         markersize=8, 
15         markerfacecolor='white')
16plt.show()
  • 👨‍🏫 教师活动:讲解中文字体配置必要性;拆解 plot() 各美化参数,边演示修改参数边展示图形的变化效果。
  • 🧑‍🎓 学生活动:在 Jupyter Notebook 中同步输入代码,动手尝试修改颜色、线型和标记点,直观感受参数作用。

使用结构化的表格帮助学生快速建立参数索引意识,通过实操增强对控制样式参数的直观理解。


💻 三、 解决问题过程(二):图表辅助元素与环境配置(20分钟)

一套完整合格的数据可视化图表,必须具备明确的标题、坐标说明、网格与图例。

1. 图表辅助配置函数表

配置项 调用函数 核心参数与说明
画布大小 plt.figure() figsize=(width, height)(如 (8, 5)),dpi=100
图表标题 plt.title() label(文本),fontsize=14(字号),pad=10
坐标轴标签 plt.xlabel() / ylabel() xlabel(文本),fontsize=12
坐标轴范围 plt.xlim() / ylim() (min, max) 限定坐标范围
网格线 plt.grid() visible=True, linestyle=':', alpha=0.6
图例标注 plt.legend() loc='upper left' / 'best', fontsize=10(需配合 plot(label=...)

2. 完整实践代码:双线对比图

 1import matplotlib.pyplot as plt
 2
 3# 1. 字体配置与画布创建
 4plt.rcParams['font.sans-serif'] = ['SimHei']
 5plt.rcParams['axes.unicode_minus'] = False
 6plt.figure(figsize=(8, 4.5), dpi=100)
 7
 8# 2. 准备数据
 9months = ['1月', '2月', '3月', '4月', '5月', '6月']
10team_a = [45, 52, 61, 60, 75, 88]
11team_b = [30, 40, 55, 70, 68, 79]
12
13# 3. 绘制折线(必须设置 label 以供图例使用)
14plt.plot(months, team_a, color='#1f77b4', linestyle='-', marker='o', label='研发一组')
15plt.plot(months, team_b, color='#ff7f0e', linestyle='--', marker='s', label='研发二组')
16
17# 4. 配置辅助元素
18plt.title('2026年上半年项目组绩效趋势对比', fontsize=14, pad=12)
19plt.xlabel('月份', fontsize=11)
20plt.ylabel('完成节点数', fontsize=11)
21plt.ylim(20, 100)
22plt.grid(True, linestyle=':', alpha=0.5)
23plt.legend(loc='upper left', fontsize=10)
24
25# 5. 显示渲染
26plt.tight_layout() # 自动调整边距
27plt.show()
  • 👨‍🏫 教师活动:演示如何从零构建一张规范的双线对比图,重点强调 plot() 中的 label 参数与 plt.legend() 的绑定机制。
  • 🧑‍🎓 学生活动:跟随教师完成双线对比图的编写,尝试调整 legendloc 位置以及修改网格的透明度 alpha

通过完整的双线对比案例,让学生掌握从“新建画布”到“数据绘制”再到“文本标注与优化”的全套标准化绘图流程。


✍️ 四、 解决问题过程(三):课堂练习与巩固(15分钟)

📝 任务一:绘制两家电商平台季度销售额趋势图…

背景与题目: 某公司需要对比 A 平台与 B 平台在一季度(1月-3月)的销售额变化(单位:万元)。 请根据以下数据绘制对比图:

  • 月份:['1月', '2月', '3月']
  • A平台销售额:[150, 210, 180]
  • B平台销售额:[120, 190, 230]

要求

  1. 画布大小设置为 (7, 4)
  2. A 平台使用蓝色实线、圆点标记;B 平台使用绿色虚线、正方形标记。
  3. 添加图表标题:“2026年一季度电商平台销售额对比”。
  4. 添加 X/Y 轴标签,启用透明度为 0.5 的点状网格线。
  5. 在左上角显示图例。
🔍 查看参考代码与解析…
 1import matplotlib.pyplot as plt
 2
 3plt.rcParams['font.sans-serif'] = ['SimHei']
 4plt.rcParams['axes.unicode_minus'] = False
 5
 6# 1. 创建画布
 7plt.figure(figsize=(7, 4))
 8
 9# 2. 数据准备
10months = ['1月', '2月', '3月']
11sales_a = [150, 210, 180]
12sales_b = [120, 190, 230]
13
14# 3. 绘制折线
15plt.plot(months, sales_a, color='blue', linestyle='-', marker='o', label='A平台')
16plt.plot(months, sales_b, color='green', linestyle='--', marker='s', label='B平台')
17
18# 4. 图表修饰
19plt.title('2026年一季度电商平台销售额对比', fontsize=12)
20plt.xlabel('月份')
21plt.ylabel('销售额(万元)')
22plt.grid(True, linestyle=':', alpha=0.5)
23plt.legend(loc='upper left')
24
25plt.tight_layout()
26plt.show()

📝 五、 课堂小结(5 分钟)

flowchart LR
    root["📊 Matplotlib 基础折线图绘制流程"]

    subgraph C1["1️⃣ 环境与画布"]
        direction TB
        A1["配置 SimHei 中文字体"]
        A2["plt.figure(figsize, dpi)"]
    end

    subgraph C2["2️⃣ 数据与折线"]
        direction TB
        B1["plt.plot(x, y, label=...)"]
        B2["样式:color / ls / lw"]
        B3["标记:marker / ms / mfc"]
    end

    subgraph C3["3️⃣ 文本与辅助标注"]
        direction TB
        C1_node["title / xlabel / ylabel"]
        C2_node["xlim / ylim 范围限定"]
        C3_node["grid(True) 网格配置"]
    end

    subgraph C4["4️⃣ 渲染与显示"]
        direction TB
        D1["plt.legend(loc=...) 激活图例"]
        D2["plt.show() 输出渲染"]
    end

    root --> C1
    root --> C2
    root --> C3
    root --> C4

    %% 自定义主题色彩美化
    style root fill:#4b6cb7,stroke:#253b6e,color:#fff,stroke-width:2px,rx:8px,ry:8px
    style C1 fill:#e3f2fd,stroke:#2196f3,stroke-width:1px
    style C2 fill:#fff3e0,stroke:#ff9800,stroke-width:1px
    style C3 fill:#e8f5e9,stroke:#4caf50,stroke-width:1px
    style C4 fill:#f3e5f5,stroke:#9c27b0,stroke-width:1px

✏️ 随堂检测与互动练习

点击展开:随堂测试题(带解析)

一、 单选题

  1. 在 Matplotlib 中,若要将折线的样式设置为“红色虚线”,并在数据点上加上“圆形标记”,plt.plot() 的参数组合设置正确的是?
  • A. color='red', linestyle=':', marker='s'
  • B. color='r', linestyle='--', marker='o'
  • C. c='r', ls='-', marker='+'
  • D. color='red', linestyle='-.', marker='v'
【答案】

【解析】B。红色简写为 'r',虚线为 '--',圆形标记为 'o'。A选项中 ':' 为点线,'s' 为正方形;C选项中 '-' 为实线;D选项中 '-.' 为点划线。

  1. 在使用 plt.legend() 生成图例时,如果在图表中无法正常显示某条折线的标签,最可能的原因是?
  • A. 没有调用 plt.grid() 函数
  • B. 在 plt.plot() 函数中漏掉了 label 参数
  • C. 没有设置 plt.figure() 的大小
  • D. 坐标轴标签 plt.xlabel() 未设置
【答案】

【解析】Bplt.legend() 会自动收集各个绘图函数中设置的 label 属性,若 plot() 中未声明 label 参数,图例将无法渲染对应的标识。

  1. 在 Windows 环境下使用 Matplotlib 绘制中文图表时,中文出现方块乱码,需要通过配置 plt.rcParams 设置哪种字体?
  • A. Times New Roman
  • B. Arial
  • C. SimHei
  • D. Consolas
【答案】

【解析】CSimHei(黑体)是 Windows 系统自带的常用中文字体,常用于解决 Matplotlib 中文显示乱码问题。

  1. 关于 plt.grid(True, alpha=0.3) 中的 alpha 参数,下列说法正确的是?
  • A. 控制网格线的粗细
  • B. 控制网格线的颜色
  • C. 控制网格线的透明度(取值 0 到 1 之间)
  • D. 控制网格线的数量
【答案】

【解析】Calpha 参数表示不透明度,0 为完全透明,1 为完全不透明。


二、 代码填空题

题目 1:请补全以下代码,设置画布宽为 10、高为 5,并绘制一条线宽为 3 的黑色点线:

1import matplotlib.pyplot as plt
2
3# 1. 创建画布
4plt.figure(figsize=________________)
5
6# 2. 绘制黑色点线
7x = [1, 2, 3]
8y = [10, 20, 15]
9plt.plot(x, y, color='k', linestyle=________, linewidth=3)
【答案】
  1. (10, 5)
  2. ':'':'

题目 2:请补充代码,使折线图能够在右上角显示图例,并为 Y 轴添加说明文字“温度 (℃)”:

1import matplotlib.pyplot as plt
2
3plt.plot([1, 2, 3], [22, 25, 21], label='机房温度')
4
5# 1. 设置 Y 轴标签
6________________________('温度 (℃)')
7
8# 2. 激活并显示图例(位置设为右上角)
9plt.legend(loc=________________)
【答案】
  1. plt.ylabel
  2. 'upper right'

📮 六、 课后作业与拓展

📮 课后作业…

作业 1:基础图形绘制(单线绘制)

  • 任务:根据一周气温数据(days = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']temp = [18, 19, 22, 20, 25, 23, 21]),绘制气温变化折线图。
  • 要求:使用蓝色实线,五角星标记(marker='*'),设置字号大小,并配置合适的标题与坐标轴标签。

作业 2:样式参数微调(三线对比)

  • 任务:模拟三个班级在期中考试中的平均分变化趋势(三次考试)。
  • 要求:在同一张图表中绘制 3 条折线,分别使用不同的颜色(如红、蓝、绿)与不同的线型(实线、虚线、点线),并添加右上角图例说明。

作业 3:坐标轴与网格控制(细节调优)

  • 任务:拿作业 1 的气温数据,将 Y 轴的显示范围固定在 1030 度之间(使用 plt.ylim),并开启透明度为 0.3 的灰色网格线(color='gray', alpha=0.3)。

作业 4:数据可视化综合应用(实际案例)

  • 任务:收集或构造某产品在 2025 年 12 个月的销量数据,绘制一张完整的专业销售分析折线图。
  • 要求:包含全局中文配置、自定义画布尺寸 (10, 5)、节点数据标记、清晰的标题与坐标说明,要求代码规范、结构美观。

作业 5:拓展思考题(自主查阅与探究)

  • 任务:查阅 Matplotlib 官方文档或资料,思考并尝试:如何在折线图的数据节点旁边,直接用代码打上具体的数值标签(提示:寻找 plt.text()plt.annotate() 函数的使用方法)?并在下一节课进行小组交流。

📋 七、 板书设计

🛠️ 板书设计…
 1===================================================================
 2                  64-1 Matplotlib 基础数据可视化
 3===================================================================
 4一、 初始化与画布                             三、 辅助元素配置
 5  1. 中文字体配置                            1. 标题与标签
 6     plt.rcParams['font.sans-serif'] = ['SimHei'] plt.title('标题', fontsize=14)
 7     plt.rcParams['axes.unicode_minus'] = False   plt.xlabel('X轴') / plt.ylabel('Y轴')
 8  2. 创建画布                                2. 坐标与网格
 9     plt.figure(figsize=(w, h), dpi=100)          plt.xlim(min, max) / plt.ylim(min, max)
10                                                  plt.grid(True, linestyle=':', alpha=0.5)
11二、 折线绘制 plt.plot() 核心参数               3. 图例标注
12  1. 颜色: color / c ('r', 'g', 'b', '#HEX')      plt.plot(..., label='说明文字')
13  2. 线型: linestyle / ls ('-', '--', ':', '-.')   plt.legend(loc='upper left')
14  3. 标记: marker ('o', 's', '*'), ms, mfc
15===================================================================

🔤本课专业英语词汇表 (Vocabulary)

🔤 Vocabulary
  1. Plot /plɒt/

    • 通用释义:v. 绘制,标绘
    • 专业解释v./n. (To create) a graphic representation of data. (绘制或生成数据图形)
  2. Figure /ˈfɪɡər/

    • 通用释义:n. 画布,图像窗口
    • 专业解释n. The top-level container for all plot elements. (承载所有图表元素的顶层画布容器)
  3. Axes /ˈæksiːz/

    • 通用释义:n. 坐标轴区域
    • 专业解释n. The region of the image with data space, including x/y axis, ticks, and labels. (包含坐标轴、刻度和标签的实际数据绘图区)
  4. Legend /ˈledʒənd/

    • 通用释义:n. 图例
    • 专业解释n. An area of a chart explaining the symbols, colors, or patterns used. (解释图表中不同线条/颜色含义的说明框)
  5. Marker /ˈmɑːrkər/

    • 通用释义:n. 数据标记点
    • 专业解释n. A visual symbol used to represent individual data points on a line. (折线上表示具体数据节点的形状符号)

常用中文字体

字体名称 英文名 特点
黑体 SimHei 粗体,醒目,最常用
宋体 SimSun 细体,适合正文
微软雅黑 Microsoft YaHei 清晰现代,Windows 默认
楷体 KaiTi 手写风格
仿宋 FangSong 仿宋风格
华文黑体 STHeiti Mac 黑体
华文宋体 STSong Mac 宋体
苹方 PingFang SC Mac 默认字体
思源黑体 Source Han Sans SC 开源字体

中文字体

代码示例

 1# 方法1:直接设置单个字体  simple 黑体
 2plt.rcParams['font.sans-serif'] = ['SimHei']
 3
 4# 方法2:设置多个字体(防止找不到)
 5plt.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei', 'PingFang SC', 'sans-serif']
 6
 7# 方法3:根据不同系统自动选择
 8import platform
 9if platform.system() == 'Windows':
10    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
11elif platform.system() == 'Darwin':  # Mac
12    plt.rcParams['font.sans-serif'] = ['PingFang SC']
13else:  # Linux
14    plt.rcParams['font.sans-serif'] = ['WenQuanYi Zen Hei']

常用中文字体对照表

系统 推荐字体 英文名
Windows 微软雅黑 Microsoft YaHei
Windows 黑体 SimHei
Windows 宋体 SimSun
Mac 苹方 PingFang SC
Mac 华文黑体 STHeiti
Mac 华文宋体 STSong
Linux 文泉驿正黑 WenQuanYi Zen Hei
Linux 文泉驿微米黑 WenQuanYi Micro Hei
通用 思源黑体 Source Han Sans SC

查看系统所有可用字体

 1import matplotlib.font_manager as fm
 2
 3# 查看所有字体
 4fonts = [f.name for f in fm.fontManager.ttflist]
 5print('可用字体数量:', len(fonts))
 6
 7# 搜索中文字体
 8chinese_fonts = [f for f in fonts if any(k in f for k in ['Sim', 'Song', 'Hei', 'YaHei', 'Ping', 'ST', 'Wen', 'Source'])]
 9print('中文字体:', chinese_fonts)
10
11# 查看特定字体是否可用
12print('SimHei 可用:', 'SimHei' in fonts)
13print('Microsoft YaHei 可用:', 'Microsoft YaHei' in fonts)

最佳实践

 1import matplotlib.pyplot as plt
 2
 3# 通用设置(大部分环境都能显示)
 4plt.rcParams['font.sans-serif'] = [
 5    'Microsoft YaHei',    # Windows
 6    'PingFang SC',        # Mac
 7    'SimHei',             # Windows 备用
 8    'WenQuanYi Zen Hei',  # Linux
 9    'sans-serif'          # 兜底
10]
11plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

负号显示问题演示

 1import matplotlib.pyplot as plt
 2import numpy as np
 3
 4# 设置中文字体
 5plt.rcParams['font.sans-serif'] = ['SimHei']
 6
 7# ========== 不加这行 ==========
 8# plt.rcParams['axes.unicode_minus'] = False
 9
10x = np.linspace(-5, 5, 100)
11y = -x**2 + 10
12
13plt.plot(x, y, label='y = -x² + 10')
14plt.axhline(y=0, color='black', linewidth=0.5)
15plt.axvline(x=0, color='black', linewidth=0.5)
16plt.xlabel('X轴')
17plt.ylabel('Y轴')
18plt.title('负号演示')
19plt.legend()
20plt.show()

对比效果

不加这行 加了这行
负号 - 显示为方块 或乱码 负号 - 正常显示

结论

1# 加了才能正常显示负号
2plt.rcParams['axes.unicode_minus'] = False

本质原因:中文字体里没有 Unicode 的负号 (减号),改成 ASCII 的 -(短横)就能正常显示了。
记住:用到中文就加这一行! 😊