《超简单:用 Python 让 Excel 飞起来》读书笔记:第7章 案例03 举一反三 制作双折线图

📅 2026/7/5 15:16:29
《超简单:用 Python 让 Excel 飞起来》读书笔记:第7章 案例03 举一反三 制作双折线图
个人主页杨利杰YJlio❄️个人专栏《Sysinternals实战教程》 《Windows PowerShell 实战》 《WINDOWS教程》 《IOS教程》《微信助手》 《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》让复杂的事情更简单让重复的工作自动化《超简单用 Python 让 Excel 飞起来》读书笔记第7章 案例03 举一反三 制作双折线图1. 第7章 案例03 举一反三制作双折线图2. 为什么要用双折线图它是“趋势对比”的高效表达3. 最小可用同坐标系画两条折线4. 让双折线更好读marker 标记点5. 交付增强标注关键峰值与拐点6. 导入 Excel 数据一键生成双折线图7. 效果验证不要只看图生成了没有8. 什么时候不该用双折线图9. 常见问题与踩坑记录10. 我的总结提升11. 发布版补充我建议这样使用这篇笔记1. 第7章 案例03 举一反三制作双折线图V4修正版进度标记本篇为 07月04日 第1篇承接 06月07日第2篇“2.7.2 自定义函数”之后继续更新。读书笔记定位本文是我阅读《超简单用 Python 让 Excel 飞起来》时整理的学习笔记重点不是照搬原书而是把本节内容重新整理成更适合博客阅读、实操复盘和后续查阅的版本。这一篇进入第 7 章图表部分主题是制作双折线图。如果说单折线图解决的是“一个指标如何变化”那么双折线图解决的就是“两个指标之间的趋势如何对比”。在真实工作里很多问题不是看一个数而是看两个数放在一起之后的变化关系。比如网络工单和软件工单谁增长更快A 机型和 B 机型谁故障率下降更明显本月工单量和上月工单量是否出现异常波动。这张图展示了本文的核心主题用 Python 制作双折线图把两组数据放在同一个坐标系中观察趋势差异。从这张图中可以看出双折线图的价值不在于“画两条线”而在于让读者快速判断两组数据的变化方向、差距变化和关键波动点。对于技术博客和工作汇报来说这类图表非常适合表达趋势对比。读完这篇文章至少要带走三件事1. 双折线图适合解决什么问题2. 如何用matplotlib画出两条趋势线3. 如何把普通折线图优化成适合汇报和复盘的图表。准备两组数据调用 plot 画第一条线再次调用 plot 画第二条线添加 legend 图例添加 marker 和网格线标注峰值或拐点保存为 PNG 或写回 Excel2. 为什么要用双折线图它是“趋势对比”的高效表达单折线图只能回答一个问题这个指标自己怎么变。双折线图可以进一步回答两个指标放在一起时它们是同步变化、反向变化还是其中一个明显跑得更快。比如在 IT 桌面支持场景中如果只看网络类工单数量下降会觉得网络问题变少了但如果同时把软件类工单放进图里可能会发现软件问题正在持续上升。这个时候双折线图就比单独看表格更有判断价值。原理说明双折线图本质上是在同一个横轴上放置两个数据序列通过线条走势观察它们的同步性、差异性和变化节奏。常见使用场景包括1. 网络工单 vs 软件工单趋势对比2. A 机型 vs B 机型故障率对比3. 本月工单量 vs 上月工单量对比4. 处理时长 vs 工单数量变化观察5. 产品 A vs 产品 B 销售趋势对比。注意双折线图有一个前提两组数据的量级最好接近。如果一条线是 0 到 200另一条线是 0 到 1小的那条线很可能会贴着底部看起来几乎没有变化。3. 最小可用同坐标系画两条折线双折线图并没有一个特殊的新函数。它的核心非常简单调用两次plt.plot()。第一次画第一组数据第二次画第二组数据最后通过legend()显示图例。这张图展示了双折线图的入门逻辑代码里执行两次plot图表中就出现两条趋势线。从这张图中可以看出双折线图的入门门槛并不高。真正需要注意的不是“怎么画出两条线”而是每条线代表什么数据、图例是否清楚、坐标轴是否能被读者理解。最小可用代码如下importmatplotlib.pyplotasplt# 中文支持plt.rcParams[font.sans-serif][SimHei]plt.rcParams[axes.unicode_minus]Falsemonths[1月,2月,3月,4月,5月,6月]# 两组数据network[35,30,28,26,24,22]software[40,45,50,55,52,58]plt.figure()# 第一条折线plt.plot(months,network,label网络工单)# 第二条折线plt.plot(months,software,label软件工单)plt.title(网络 vs 软件工单趋势对比)plt.xlabel(月份)plt.ylabel(数量)plt.legend()plt.grid(axisy,linestyledashed,alpha0.4)plt.tight_layout()plt.show()这段代码里最关键的是三点1.plt.plot(months, network, label网络工单)画第一条线2.plt.plot(months, software, label软件工单)画第二条线3.plt.legend()显示图例否则读者不知道哪条线对应哪组数据。推荐做法只要图中超过一条线就必须加图例。没有图例的双折线图读者只能猜这是非常不专业的。4. 让双折线更好读marker 标记点很多人画折线图时只画线但忽略了一个细节真实数据往往不是连续曲线而是按月、按周、按天采样出来的离散点。折线只是把这些点连接起来帮助我们观察趋势。这张图展示了 marker 标记点的作用每一个数据点都被明确标出来读者能更容易看清每个月的数据位置。从这张图中可以看出marker 能明显提升图表可读性。特别是把图表截图发到群里、放进报告里、上传到博客时点标记能帮助读者快速定位每个时间节点。示例代码如下importmatplotlib.pyplotasplt plt.rcParams[font.sans-serif][SimHei]plt.rcParams[axes.unicode_minus]Falsemonths[1月,2月,3月,4月,5月,6月]current[120,98,135,110,150,160]trend[110,112,120,122,135,145]plt.figure()plt.plot(months,current,markero,label当月工单量)plt.plot(months,trend,markers,label趋势参考线)plt.title(双折线图marker 标记点提升可读性)plt.xlabel(月份)plt.ylabel(数量)plt.grid(axisy,linestyledashed,alpha0.4)plt.legend()plt.tight_layout()plt.show()这里的markero表示圆点标记markers表示方形标记。两条线使用不同 marker可以降低误读概率。原理说明折线图中的线并不是现实中真实连续发生的轨迹而是对离散数据点的连接。marker 的作用就是提醒读者这些点才是真实采集值。5. 交付增强标注关键峰值与拐点如果只是画两条线图表还停留在“展示数据”的层面。真正适合汇报的图表应该进一步告诉读者哪里是峰值哪里是拐点哪里值得关注。这张图展示了在双折线图中标注峰值和拐点的效果。通过箭头和文字说明图表开始具备“结论表达”的能力。从这张图中可以看出标注不是装饰而是把读者注意力引导到真正重要的变化点上。比如某个月突然上升、突然下降或者两条线之间差距明显拉大这些都值得单独标出来。下面给一个标注峰值的模板importmatplotlib.pyplotasplt plt.rcParams[font.sans-serif][SimHei]plt.rcParams[axes.unicode_minus]Falsemonths[1月,2月,3月,4月,5月,6月]network[35,30,28,26,24,22]software[40,45,50,55,52,58]plt.figure()plt.plot(months,network,markero,label网络工单)plt.plot(months,software,markero,label软件工单)# 找到软件工单最大值max_valuemax(software)max_indexsoftware.index(max_value)plt.annotate(f峰值{max_value},xy(max_index,max_value),xytext(max_index,max_value3),arrowpropsdict(arrowstyle-))plt.title(双折线图标注关键峰值)plt.xlabel(月份)plt.ylabel(数量)plt.grid(axisy,linestyledashed,alpha0.4)plt.legend()plt.tight_layout()plt.show()plt.annotate()是这里的重点。它可以指定标注文字、标注位置、文字显示位置和箭头样式。推荐做法一张图最多标注 1 到 3 个关键点。标注太多图表会从“辅助理解”变成“信息噪音”。风险提醒不要随便标注一个看起来波动的点就下结论。图表只是证据入口真正的判断还要结合时间线比如那个月是否上线了新镜像、是否批量更新了补丁、是否发生了业务变更。6. 导入 Excel 数据一键生成双折线图前面的例子都是在 Python 代码里手写数据。真实办公场景里数据更多来自 Excel。更实际的流程应该是从 Excel 读取数据用 Python 生成双折线图再保存成 PNG用于写回 Excel、插入报告或上传博客。这张图展示了完整工作流Excel 数据表作为输入Python 负责读取和绘图最后导出双折线图 PNG。从这张图中可以看出真正能落地的图表自动化不是单独画一张图而是把 Excel 数据、Python 脚本、PNG 结果串成一条流水线。这样后续只要更新 Excel 数据就能重新生成图表。假设 Excel 表格结构如下月份网络工单软件工单2026-0135402026-0230452026-0328502026-0426552026-0524522026-062258可以使用下面这段脚本从 Excel 中读取数据并保存图表importpandasaspdimportmatplotlib.pyplotaspltfrompathlibimportPath plt.rcParams[font.sans-serif][SimHei]plt.rcParams[axes.unicode_minus]Falsedefdual_line_from_excel(xlsx_path:str,sheet_name:str,x_col:str,y1_col:str,y2_col:str,out_png:strout/dual_line.png): 从 Excel 读取数据并生成双折线图 dfpd.read_excel(xlsx_path,sheet_namesheet_name)xdf[x_col].astype(str).tolist()y1pd.to_numeric(df[y1_col],errorscoerce).fillna(0).tolist()y2pd.to_numeric(df[y2_col],errorscoerce).fillna(0).tolist()plt.figure(figsize(10,6))plt.plot(x,y1,markero,labely1_col)plt.plot(x,y2,markero,labely2_col)plt.title(f{y1_col}vs{y2_col}趋势对比)plt.xlabel(x_col)plt.ylabel(数值)plt.grid(axisy,linestyledashed,alpha0.4)plt.xticks(rotation30)plt.legend()plt.tight_layout()out_pngPath(out_png)out_png.parent.mkdir(parentsTrue,exist_okTrue)plt.savefig(out_png,dpi200)plt.close()returnstr(out_png)if__name____main__:pngdual_line_from_excel(xlsx_pathreport.xlsx,sheet_name数据,x_col月份,y1_col网络工单,y2_col软件工单,out_pngout/网络_vs_软件_双折线.png)print(✅ 已输出,png)这段代码有几个实际价值1.pd.read_excel()负责读取 Excel 数据2.pd.to_numeric()负责把数据转成数值避免文本数字导致绘图异常3.plt.savefig()负责把图表保存为 PNG4.Path(...).parent.mkdir()自动创建输出目录避免目录不存在时报错。推荐做法如果这类图表要反复生成建议把函数放进自己的脚本库。以后只需要换文件路径、Sheet 名称和列名就能重复使用。7. 效果验证不要只看图生成了没有图表脚本运行成功不代表图表结果一定正确。尤其是从 Excel 读取数据时字段名、空值、文本数字、日期格式都可能影响最终图表。我建议至少验证以下几项1. 输出目录下是否生成了 PNG 文件2. 图表标题、横轴、纵轴是否显示正常3. 图例是否能区分两条线4. 每个月的数据点是否与 Excel 原始数据一致5. 中文是否正常显示没有乱码或方块6. 如果保存到报告中图片清晰度是否足够。不要只用“有没有报错”判断脚本是否成功。图表类脚本最怕的是代码能跑但读出来的列不对、数据类型不对、图表含义被误读。实战建议第一次运行时可以随机抽取 2 到 3 个数据点对照 Excel 原表确认。确认图表数据来源无误后再批量复用脚本。8. 什么时候不该用双折线图双折线图很好用但不能乱用。图表选择错了读者会被误导。第一种情况两组数据量级差太大。比如一条线是工单数量范围是 0 到 300另一条线是满意度范围是 0 到 1。如果直接放在同一个 y 轴上满意度那条线几乎看不出变化。第二种情况两个指标没有可比性。比如把“设备数量”和“平均响应时长”直接画在一起读者很容易误以为两者存在直接关系但实际上可能只是放在同一张图里而已。第三种情况想表达占比结构。如果你的目的是说明各类别占整体比例应该优先考虑饼图或堆叠图而不是双折线图。推荐做法如果两组数据量级差距很大可以考虑双 y 轴图如果只是为了统一比较变化幅度可以先把两组数据标准化或转成同比、环比。9. 常见问题与踩坑记录问题 1中文标题显示成方块。这是字体问题。可以在代码开头加入plt.rcParams[font.sans-serif][SimHei]plt.rcParams[axes.unicode_minus]False问题 2图例不显示。检查是否给每条线设置了label并且是否调用了plt.legend()。问题 3横轴月份挤在一起。可以使用plt.xticks(rotation30)让标签旋转显示。问题 4图片保存后不清晰。保存时提高 dpi例如plt.savefig(dual_line.png,dpi200)问题 5Excel 读取出来的数据不对。优先检查 Sheet 名称、列名、空值、合并单元格、标题行位置。真实办公表格经常不是标准数据表这一点不能假设。经验判断凡是要交付的图表至少要做到“标题清楚、坐标轴清楚、图例清楚、数据来源清楚”。少任何一个都容易影响读者判断。10. 我的总结提升这一篇的核心不是简单记住“双折线图怎么画”而是理解它在数据表达中的位置。我从这一节带走的第一个结论是双折线图适合做趋势对比而不是万能图表。它最适合回答“两个指标在同一时间轴上如何变化”。第二个结论是双折线图的基础实现很简单关键在交付细节。两次plot()就能画出图但要想让图表真正可读还需要标题、图例、marker、网格线、关键点标注。第三个结论是图表不能替代分析。双折线图只能告诉我们“变化在哪里”不能自动告诉我们“为什么变化”。真正的技术判断还要结合业务事件、系统变更、版本更新、补丁上线、用户反馈等证据。如果后续继续学习图表自动化我建议把重点放到“从 Excel 读取数据 → 自动生成图表 → 自动写回报告”这条链路上。这样 Python 画图才不是单独练习而是可以真正进入办公自动化场景。11. 发布版补充我建议这样使用这篇笔记这一节在书中的位置是第7章 案例03 举一反三核心主题是制作双折线图。我不建议只把它当成“matplotlib 画图函数笔记”而应该把它放到 Excel 自动化和数据可视化流程里理解。真正可复用的思路是先明确要对比哪两个指标再判断它们是否适合同轴展示接着用 Python 自动生成图表最后结合业务背景解释趋势变化。最容易翻车的地方不是plt.plot()写错而是数据量级不一致、图例不清楚、横轴标签混乱、或者看到了趋势却没有做原因判断。我的建议是以后凡是做双折线图都先问三句话两组数据是否可比是否在同一个时间轴上读者能不能 3 秒内看懂哪条线代表什么如果这三个问题回答不清楚就不要急着画图。返回顶部 返回顶部点击回到顶部