欢迎光临
我们一直在努力

《超简单:用 Python 让 Excel 飞起来》读书笔记:3.6.1 绘制折线图

avatar

🔥
个人主页:
杨利杰YJlio

❄️
个人专栏:
《Sysinternals实战教程》
《Windows PowerShell 实战》
《WINDOWS教程》
《IOS教程》

《微信助手》
《锤子助手》
《Python》
《Kali Linux》

《那些年未解决的Windows疑难杂症》
🌟
让复杂的事情更简单,让重复的工作自动化

请添加图片描述

在这里插入图片描述


《超简单:用 Python 让 Excel 飞起来》读书笔记:3.6.1 绘制折线图

  • 1. 3.6.1 绘制折线图
  • 2. 折线图适合什么场景
  • 3. 准备工作:安装与导入 Matplotlib
  • 4. 最小可用示例:画一条折线
  • 5. 办公常用美化:标题、坐标轴、网格、标记点
  • 6. 多条折线对比:A/B 趋势分析
  • 7. 保存图片:写报告和博客必备
  • 8. 完整代码文件:3.6.1 绘制折线图.py
  • 9. 绘制折线图的标准流程
  • 10. 常见问题与踩坑提醒
  • 11. 效果验证与总结提升

1号标题图

1. 3.6.1 绘制折线图

V4修正版进度标记:本篇为 06月16日 第1篇,承接 06月07日第2篇“2.7.2 自定义函数”之后继续更新。

  这一篇是我阅读《超简单:用 Python 让 Excel 飞起来》时整理的学习笔记,主题是 Matplotlib 绘制折线图。前面我们已经学习了 Python 基础语法、文件处理、Excel 工作簿操作、pandas 表格数据处理。到了这一节,重点就开始从“处理数据”进入到“展示数据”。

  在实际办公场景里,数据处理完以后,很多时候不能只丢给别人一张表。表格适合看明细,但不适合快速看趋势。折线图的价值就在这里:它能把一组数字变成一条趋势线,让读者更快判断数据是上升、下降、波动,还是出现了异常拐点。

  这张图展示的是 Python 使用 Matplotlib 绘制折线图的整体场景:左侧是代码,右侧是趋势图效果,适合用来理解本文的核心目标。

请添加图片描述

  从图中可以看出,折线图不是单纯“画一条线”,而是把数据、坐标轴、标题、网格和标记点组合起来,最终形成一张能用于汇报、分析和博客展示的图表。

  我的理解是:折线图最适合表达“连续变化”。例如月度销售趋势、访问量变化、库存波动、成本走势、温度变化、工单数量变化,这些数据都可以通过折线图快速看出方向。

  读完这一篇,至少要掌握三件事:会画最基础的折线图,会给图表加标题和网格,会把图保存成图片用于报告或博客。


2号标题图

2. 折线图适合什么场景

  折线图最适合看趋势,而不是看明细。比如 12 个月的销售额,如果只看 Excel 表格,读者需要一行一行扫数字;但如果画成折线图,趋势马上就出来了。哪几个月增长明显,哪几个月下降,哪里有异常波动,都能更直观地看见。

  我在办公自动化里更推荐把折线图用在这些场景:

  第一,按时间变化的数据。例如每天访问量、每月销售额、每周工单数量、每季度成本变化。

  第二,指标走势判断。例如 CPU 使用率、库存数量、人员数量、报修数量、资金余额。

  第三,多组数据对比。例如产品 A 和产品 B 的销量走势,两个部门的处理效率变化,两个时间周期的数据对比。

  需要注意:折线图不适合展示没有顺序关系的分类数据。如果只是比较“部门 A、部门 B、部门 C 谁更高”,柱状图通常更合适。如果要看“1 月到 12 月的变化”,折线图才更有优势。


3号标题图

3. 准备工作:安装与导入 Matplotlib

  使用 Python 绘图前,需要先安装 matplotlib。如果本地环境还没有安装,可以在命令行执行下面这条命令。

pip install matplotlib

  安装完成后,在 Python 代码中通常这样导入:

import matplotlib.pyplot as plt

  pyplot 是 Matplotlib 中最常用的绘图接口,习惯上简写为 plt。后面画图、设置标题、设置坐标轴、显示图表、保存图片,基本都会通过 plt 来完成。

  推荐做法:新手阶段先固定使用 import matplotlib.pyplot as plt。不要一开始就混用太多复杂写法,否则代码能跑,但自己不一定能解释清楚。

  如果你后面要显示中文标题,建议提前加入中文字体配置。Windows 环境下可以先尝试使用微软雅黑:

import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["Microsoft YaHei"]
plt.rcParams["axes.unicode_minus"] = False

  axes.unicode_minus = False 的作用是避免负号显示异常。在写图表类脚本时,这个配置很常用。


4号标题图

4. 最小可用示例:画一条折线

  先不要急着做复杂美化。学习图表时,第一步应该是把最小可用代码跑通。只要能把 x 和 y 两组数据画成一条线,后面再加标题、图例、网格和保存都不难。

  这张图展示的是单条折线图的最小可用效果:横轴是 x 数据,纵轴是 y 数据,数据点通过线连接起来。

请添加图片描述

  从图中可以看出,最基础的折线图已经能表达趋势,但信息还比较简单。它适合用来验证绘图逻辑是否跑通,不适合直接拿去做正式报告。

  最小可用代码如下:

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [10, 12, 9, 15, 18]

plt.plot(x, y)
plt.show()

  这里的 x 是横轴数据,y 是纵轴数据。plt.plot(x, y) 负责绘制折线,plt.show() 负责显示图表。

  注意:x 和 y 的长度必须一致。如果 x 有 5 个点,y 也必须有 5 个点,否则无法一一对应。


5号标题图

5. 办公常用美化:标题、坐标轴、网格、标记点

  最小示例跑通以后,就要考虑图表可读性。办公场景中的图表,不能只让自己看懂,还要让别人一眼知道这张图表示什么。因此标题、坐标轴、网格和数据点标记都很重要。

  这张图展示的是折线图美化后的效果:图表有标题,有横纵坐标说明,有网格辅助线,也有明显的数据标记点。

请添加图片描述

  从图中可以看出,美化后的折线图更像一张正式报表图,而不是临时测试图。尤其是标题和坐标轴说明,能让读者快速理解图表含义。

  对应代码如下:

import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["Microsoft YaHei"]
plt.rcParams["axes.unicode_minus"] = False

x = [1, 2, 3, 4, 5]
y = [10, 12, 9, 15, 18]

plt.plot(x, y, marker="o")
plt.title("指标趋势")
plt.xlabel("时间")
plt.ylabel("数值")
plt.grid(True)
plt.show()

  这里有几个关键参数需要理解。

  marker="o" 表示在每个数据点上加圆点标记。数据量少的时候,加标记点会更清楚。

  plt.title() 用来设置图表标题,plt.xlabel() 和 plt.ylabel() 分别设置横轴和纵轴名称。

  plt.grid(True) 用来显示网格线。对于趋势图来说,网格线能帮助读者大致判断数值位置。

  推荐做法:正式图表至少要有标题、坐标轴名称和网格。否则图虽然画出来了,但读者还要猜它表示什么。


6号标题图

6. 多条折线对比:A/B 趋势分析

  折线图更常见的价值,是比较两组或多组数据的趋势。例如产品 A 和产品 B 的月度销量,两个部门的处理效率,两个系统的访问量变化。如果只画一条线,只能看自身走势;如果画多条线,就能看对比关系。

  这张图展示的是多条折线对比效果:产品 A 和产品 B 分别用不同折线表示,并通过图例区分。

请添加图片描述

  从图中可以看出,多条折线可以直观看出两组数据的走势差异。哪一条增长更快,哪一条波动更明显,两个系列是否同步变化,都能通过图形快速判断。

  示例代码如下:

import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["Microsoft YaHei"]
plt.rcParams["axes.unicode_minus"] = False

x = [1, 2, 3, 4, 5]
y1 = [10, 12, 9, 15, 18]
y2 = [8, 11, 13, 14, 16]

plt.plot(x, y1, marker="o", label="产品A")
plt.plot(x, y2, marker="s", label="产品B")

plt.title("A/B 趋势对比")
plt.xlabel("时间")
plt.ylabel("数值")
plt.grid(True)
plt.legend()
plt.show()

  这段代码里,连续调用了两次 plt.plot(),分别绘制产品 A 和产品 B 的折线。

  label 用于设置每条线的名称,plt.legend() 用于显示图例。没有图例时,读者很难知道哪条线代表哪组数据。

  多条折线图的重点不是线越多越好,而是对比关系要清晰。如果一次性画太多条线,图表反而会变乱。

  不建议在一张折线图里塞入过多指标。如果指标超过 4~5 条,最好拆成多张图,或者改用其他可视化方式。


7号标题图

7. 保存图片:写报告和博客必备

  如果只是自己临时看图,plt.show() 就够了。但如果要写报告、写博客、发给同事,图表就必须保存成图片文件。Matplotlib 中常用 plt.savefig() 保存图表。

  这张图展示的是把折线图保存为 PNG 图片后,用于数据分析报告和技术博客的场景。

请添加图片描述

  从图中可以看出,折线图一旦导出成 PNG,就可以沉淀为报告素材、博客配图或数据复盘附件。这一步很关键,因为图表最终不是只在代码窗口里看,而是要进入正式文档。

  保存图片的代码如下:

plt.savefig("折线图.png", dpi=200, bbox_inches="tight")

  dpi=200 表示图片清晰度。一般博客和普通报告用 200 就够了,如果要打印或高清展示,可以适当调高。

  bbox_inches="tight" 表示自动裁剪多余空白边,让图片更紧凑。

  推荐做法:保存图片时,把 savefig() 放在 show() 之前。这样可以避免某些环境下显示后图像状态被清空,导致保存结果异常。

plt.savefig("折线图.png", dpi=200, bbox_inches="tight")
plt.show()


8号标题图

8. 完整代码文件:3.6.1 绘制折线图.py

  下面是一份可以直接保存为 3.6.1 绘制折线图.py 的完整示例代码。它包含单条折线图、多条折线图、中文字体配置和图片保存逻辑,适合作为入门模板。

# -*- coding: utf-8 -*-
"""
文件名:3.6.1 绘制折线图.py
功能:使用 matplotlib 绘制单条折线图和多条折线图,并保存为 PNG 图片
"""

import matplotlib.pyplot as plt

# 设置中文字体,避免中文标题显示为方块
plt.rcParams["font.sans-serif"] = ["Microsoft YaHei"]
plt.rcParams["axes.unicode_minus"] = False

def plot_single_line():
"""绘制单条折线图"""

x = [1, 2, 3, 4, 5]
y = [10, 12, 9, 15, 18]

plt.figure(figsize=(8, 4))
plt.plot(x, y, marker="o", label="指标值")

plt.title("指标趋势(单条折线)")
plt.xlabel("时间")
plt.ylabel("数值")
plt.grid(True)
plt.legend()

plt.savefig("3.6.1_单条折线图.png", dpi=200, bbox_inches="tight")
plt.show()

def plot_multi_lines():
"""绘制多条折线图"""

x = [1, 2, 3, 4, 5]
y1 = [10, 12, 9, 15, 18]
y2 = [8, 11, 13, 14, 16]

plt.figure(figsize=(8, 4))
plt.plot(x, y1, marker="o", label="产品A")
plt.plot(x, y2, marker="s", label="产品B")

plt.title("A/B 趋势对比(多条折线)")
plt.xlabel("时间")
plt.ylabel("数值")
plt.grid(True)
plt.legend()

plt.savefig("3.6.1_多条折线图.png", dpi=200, bbox_inches="tight")
plt.show()

if __name__ == "__main__":
plot_single_line()
plot_multi_lines()

  这份代码的结构比较清楚:先做字体配置,再定义两个函数,最后通过 if __name__ == "__main__": 控制程序入口。

  把绘图逻辑封装成函数的好处是:后续要改数据、改标题、改保存路径时,不需要把所有代码混在一起。这也是办公自动化脚本越写越稳的关键习惯。


9号标题图

9. 绘制折线图的标准流程

  把这一节的内容串起来,绘制折线图一般可以分成 6 个动作:准备数据、创建画布、绘制折线、补充标题与坐标轴、美化网格和图例、保存或显示图表。

#mermaid-svg-yF2VloAaspH2ZTk0{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-yF2VloAaspH2ZTk0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-yF2VloAaspH2ZTk0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-yF2VloAaspH2ZTk0 .error-icon{fill:#552222;}#mermaid-svg-yF2VloAaspH2ZTk0 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-yF2VloAaspH2ZTk0 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-yF2VloAaspH2ZTk0 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-yF2VloAaspH2ZTk0 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-yF2VloAaspH2ZTk0 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-yF2VloAaspH2ZTk0 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-yF2VloAaspH2ZTk0 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-yF2VloAaspH2ZTk0 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-yF2VloAaspH2ZTk0 .marker.cross{stroke:#333333;}#mermaid-svg-yF2VloAaspH2ZTk0 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-yF2VloAaspH2ZTk0 p{margin:0;}#mermaid-svg-yF2VloAaspH2ZTk0 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-yF2VloAaspH2ZTk0 .cluster-label text{fill:#333;}#mermaid-svg-yF2VloAaspH2ZTk0 .cluster-label span{color:#333;}#mermaid-svg-yF2VloAaspH2ZTk0 .cluster-label span p{background-color:transparent;}#mermaid-svg-yF2VloAaspH2ZTk0 .label text,#mermaid-svg-yF2VloAaspH2ZTk0 span{fill:#333;color:#333;}#mermaid-svg-yF2VloAaspH2ZTk0 .node rect,#mermaid-svg-yF2VloAaspH2ZTk0 .node circle,#mermaid-svg-yF2VloAaspH2ZTk0 .node ellipse,#mermaid-svg-yF2VloAaspH2ZTk0 .node polygon,#mermaid-svg-yF2VloAaspH2ZTk0 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-yF2VloAaspH2ZTk0 .rough-node .label text,#mermaid-svg-yF2VloAaspH2ZTk0 .node .label text,#mermaid-svg-yF2VloAaspH2ZTk0 .image-shape .label,#mermaid-svg-yF2VloAaspH2ZTk0 .icon-shape .label{text-anchor:middle;}#mermaid-svg-yF2VloAaspH2ZTk0 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-yF2VloAaspH2ZTk0 .rough-node .label,#mermaid-svg-yF2VloAaspH2ZTk0 .node .label,#mermaid-svg-yF2VloAaspH2ZTk0 .image-shape .label,#mermaid-svg-yF2VloAaspH2ZTk0 .icon-shape .label{text-align:center;}#mermaid-svg-yF2VloAaspH2ZTk0 .node.clickable{cursor:pointer;}#mermaid-svg-yF2VloAaspH2ZTk0 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-yF2VloAaspH2ZTk0 .arrowheadPath{fill:#333333;}#mermaid-svg-yF2VloAaspH2ZTk0 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-yF2VloAaspH2ZTk0 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-yF2VloAaspH2ZTk0 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-yF2VloAaspH2ZTk0 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-yF2VloAaspH2ZTk0 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-yF2VloAaspH2ZTk0 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-yF2VloAaspH2ZTk0 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-yF2VloAaspH2ZTk0 .cluster text{fill:#333;}#mermaid-svg-yF2VloAaspH2ZTk0 .cluster span{color:#333;}#mermaid-svg-yF2VloAaspH2ZTk0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-yF2VloAaspH2ZTk0 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-yF2VloAaspH2ZTk0 rect.text{fill:none;stroke-width:0;}#mermaid-svg-yF2VloAaspH2ZTk0 .icon-shape,#mermaid-svg-yF2VloAaspH2ZTk0 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-yF2VloAaspH2ZTk0 .icon-shape p,#mermaid-svg-yF2VloAaspH2ZTk0 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-yF2VloAaspH2ZTk0 .icon-shape .label rect,#mermaid-svg-yF2VloAaspH2ZTk0 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-yF2VloAaspH2ZTk0 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-yF2VloAaspH2ZTk0 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-yF2VloAaspH2ZTk0 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

需要

不需要

准备 x 和 y 数据

创建图表画布

plt.plot 绘制折线

设置标题和坐标轴

添加网格 / 标记点 / 图例

是否需要输出图片

plt.savefig 保存 PNG

plt.show 显示图表

  这个流程图可以作为后续绘图脚本的基本检查清单。只要一张图表看起来不完整,就可以按这个流程倒查:数据有没有准备好,标题有没有写,坐标轴有没有说明,图例有没有显示,图片有没有保存。

  推荐以后写绘图代码时,不要一上来就追求复杂效果,先按流程把基础图跑通,再逐步加美化。


10号标题图

10. 常见问题与踩坑提醒

  绘制折线图这件事看起来简单,但新手经常会在环境、中文、路径和图表显示上踩坑。

  第一个常见问题是中文乱码。如果图表标题显示成方块,大概率是 Matplotlib 没有找到可用中文字体。Windows 环境下可以先配置微软雅黑:

plt.rcParams["font.sans-serif"] = ["Microsoft YaHei"]
plt.rcParams["axes.unicode_minus"] = False

  如果电脑没有这个字体,就需要换成当前系统存在的中文字体。

  第二个常见问题是保存图片找不到。默认情况下,plt.savefig("折线图.png") 会保存到当前工作目录,而不是脚本所在目录或桌面。

  推荐写完整保存路径,尤其是正式脚本。

plt.savefig(r"C:\\Temp\\折线图.png", dpi=200, bbox_inches="tight")

  第三个常见问题是 x 和 y 长度不一致。折线图每个横轴点都要对应一个纵轴值,所以两组数据长度必须相同。

x = [1, 2, 3, 4, 5]
y = [10, 12, 9]

  上面这种数据不能直接画成完整折线图,因为横轴有 5 个点,纵轴只有 3 个值。

  第四个常见问题是图表信息不完整。只画一条线,但没有标题、没有坐标轴、没有图例,读者就很难判断图表含义。

  图表不是给自己看的临时草稿,而是给读者看的信息表达。只要用于报告或博客,就应该补齐标题、坐标轴和必要说明。


11号标题图

11. 效果验证与总结提升

  运行本文代码后,可以从三个方面验证结果是否正确。

  第一,运行脚本后是否弹出了折线图窗口。如果图表窗口能正常显示,说明 Matplotlib 基础绘图流程没有问题。

  第二,图表中是否包含标题、坐标轴、网格和图例。如果这些元素都能正常显示,说明图表表达已经比较完整。

  第三,当前目录或指定目录下是否生成了 PNG 图片。如果生成了 3.6.1_单条折线图.png 和 3.6.1_多条折线图.png,说明保存逻辑也正常。

  这一节我最终记成一句话:**折线图不是为了把数字画出来,而是为了把趋势讲清楚。**

  真正推荐的学习方式,是先跑通最小示例,再逐步加标题、坐标轴、网格、图例和保存逻辑。

  不要只满足于“代码没报错”。图表类脚本必须检查最终图片是否清晰、中文是否正常、趋势是否符合原始数据。

  从办公自动化角度看,Matplotlib 的价值不只是绘图,而是把处理后的 Excel 数据转化成可汇报、可复盘、可发布的视觉结果。


返回顶部

请添加图片描述

🔝 返回顶部

点击回到顶部

赞(0)
未经允许不得转载:171主机测评 » 《超简单:用 Python 让 Excel 飞起来》读书笔记:3.6.1 绘制折线图
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址