个人主页杨利杰YJlio❄️个人专栏《Sysinternals实战教程》 《Windows PowerShell 实战》 《WINDOWS教程》 《IOS教程》《微信助手》 《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》让复杂的事情更简单让重复的工作自动化《超简单用 Python 让 Excel 飞起来》读书笔记第8章 扩展 制作组合图表展示多维信息1. 第8章 扩展 制作组合图表展示多维信息2. 绘制组合图同坐标轴适合量级相近的数据3. 设置不同坐标轴双 y 轴组合图解决量级差异4. 组合图的核心判断不是能不能画而是该不该画5. 企业可交付版从 Excel 读取数据一键生成组合图并保存 PNG6. 常见坑组合图最容易“看着对其实错”6.1 右轴不锁范围趋势可能被夸大6.2 两边单位不写清楚图表就没有交付价值6.3 图例只显示一边会导致读者看不懂7. 效果验证一张组合图是否合格看这 5 点8. 本节小结组合图是一张图讲完“量 趋势 质量”9. 我的总结提升11. 发布版补充我建议这样使用这篇笔记1. 第8章 扩展 制作组合图表展示多维信息V4修正版进度标记本篇为 07月11日 第1篇承接前面 Matplotlib 图表章节继续更新。读书笔记定位本文是我阅读《超简单用 Python 让 Excel 飞起来》时整理的学习笔记重点不是照搬原书而是把“组合图表”这个知识点整理成更适合博客阅读、实操复盘和后续查阅的版本。这一篇主要解决一个很常见的问题单独看柱形图只能看数量单独看折线图只能看趋势但真实汇报往往需要同时看“量”和“变化”。比如桌面支持月报里既要看每个月工单数量又要看解决率、满意度、平均处理时长如果分成多张图读者就要来回对照如果强行塞进同一个坐标轴又很容易因为量级不同导致折线贴地爬行。组合图的价值就在这里柱形图负责表达数量折线图负责表达趋势一张图把多个维度的信息放到同一个分析场景里。这张图展示了组合图表的核心主题用柱形图看数量用折线图看趋势。从这张图中可以看出组合图并不是为了“把图做得更复杂”而是为了让一张图同时承载数量、趋势、比例、变化方向等信息。这里要注意组合图只有在数据关系明确时才有价值不能为了炫技硬组合。读完这篇文章至少要带走三件事知道什么时候应该使用组合图而不是柱形图或折线图理解同坐标轴组合图和双 y 轴组合图的区别能用 Python 从 Excel 读取数据生成一张可用于报告的组合图 PNG。接近差异明显明确汇报目标数据量级是否接近使用同坐标轴组合图使用双y轴组合图检查单位和图例保存PNG或写回Excel用于月报/周报/数据复盘2. 绘制组合图同坐标轴适合量级相近的数据组合图最简单的做法是把柱形图和折线图画在同一个坐标轴里。这个方法适合两组数据的数值范围差不多比如“工单数量”和“处理时长评分”、“销售额”和“订单数量指数”这类相对接近的数据。但这里有一个硬前提两组数据的量级必须接近。如果一组数据是 010000另一组数据是 0100强行放在同一个 y 轴上小的那条线基本看不清这种图表不是分析而是在制造误读。这张图展示了同坐标轴组合图的效果适合把量级相近的数据放在一起观察。从这张图中可以看出柱形图和折线图共享同一个 y 轴读者可以直接比较两组数据的变化节奏。它的优点是简单直观缺点也明显一旦两组数据量级差异过大图表就会失真。下面是同坐标轴组合图的最小可用代码importmatplotlib.pyplotaspltimportnumpyasnp plt.rcParams[font.sans-serif][SimHei]plt.rcParams[axes.unicode_minus]Falsemonths[1月,2月,3月,4月,5月,6月]tickets[120,98,135,110,150,160]# 柱形工单数量avg_time[80,75,90,82,88,95]# 折线处理效率评分xnp.arange(len(months))plt.figure(figsize(9,6))plt.bar(x,tickets,width0.6,label工单数量,alpha0.75)plt.plot(x,avg_time,markero,linewidth2,label处理效率评分)plt.xticks(x,months)plt.title(组合图工单数量 处理效率评分)plt.xlabel(月份)plt.ylabel(数值)plt.grid(axisy,linestyle--,alpha0.4)plt.legend()plt.tight_layout()plt.show()推荐做法同坐标轴组合图适合用在“两个指标都能放到同一个数值尺度下解释”的场景。只要你发现其中一条线被压得几乎看不见就不要硬撑应该改用双 y 轴。3. 设置不同坐标轴双 y 轴组合图解决量级差异真实工作里更常见的是另一种情况柱形图表示数量折线图表示百分比。例如“工单数量”可能是几千单“解决率”却是 0100%。这两个指标如果放在同一个 y 轴上解决率折线会被压扁看起来几乎没有变化。这时候就要用 Matplotlib 的twinx()创建第二个 y 轴。左边 y 轴给柱形图右边 y 轴给折线图。这张图展示了双 y 轴组合图的典型用法左轴看工单量右轴看解决率。从这张图中可以看出双 y 轴最大的价值是解决“单位不同、量级不同”的问题。左侧 y 轴承载数量右侧 y 轴承载百分比读者既能看到业务量变化也能看到质量指标是否跟得上。下面是双 y 轴组合图的代码模板importmatplotlib.pyplotaspltimportnumpyasnp plt.rcParams[font.sans-serif][SimHei]plt.rcParams[axes.unicode_minus]Falsemonths[1月,2月,3月,4月,5月,6月]tickets[120,98,135,110,150,160]# 柱形工单数量solve_rate[92,88,95,90,96,97]# 折线解决率xnp.arange(len(months))fig,ax1plt.subplots(figsize(9,6))# 左轴柱形图ax1.bar(x,tickets,width0.6,alpha0.75,label工单数量)ax1.set_xlabel(月份)ax1.set_ylabel(工单数量单)ax1.set_xticks(x)ax1.set_xticklabels(months)ax1.grid(axisy,linestyle--,alpha0.4)# 右轴折线图ax2ax1.twinx()ax2.plot(x,solve_rate,markero,linewidth2,linestyle--,label解决率%)ax2.set_ylabel(解决率%)ax2.set_ylim(0,100)# 合并图例h1,l1ax1.get_legend_handles_labels()h2,l2ax2.get_legend_handles_labels()ax1.legend(h1h2,l1l2,locupper left)plt.title(组合图工单数量柱 解决率折线)plt.tight_layout()plt.show()注意双 y 轴不是万能方案。它能提高可读性也可能制造误解。尤其是右轴范围如果随意缩放会让一条折线看起来“波动很大”实际可能只是 1%2% 的变化。4. 组合图的核心判断不是能不能画而是该不该画很多人学图表时容易进入一个误区只要代码能画出来就觉得图表是合理的。但在真实汇报里图表首先是表达工具不是代码炫技。组合图尤其如此因为它把两个甚至多个指标放在一起如果没有清晰的业务关系读者反而更难理解。我判断一张组合图是否应该使用通常看三个问题两组数据是否有业务关联两组数据是否需要放在同一时间维度下观察读者是否能通过一张图得出更清晰的判断。举个桌面运维的例子场景柱形图指标折线图指标是否适合组合图月度工单复盘工单数量解决率适合镜像上线评估投诉数量稳定率适合资产盘点设备数量品牌占比不太适合网络排障断网次数平均恢复时长适合用户满意度满意人数满意率适合推荐做法组合图应该服务于一个明确判断例如“业务量增加后服务质量有没有下降”“工单减少后处理效率有没有提升”如果没有这种判断目标就不建议强行做组合图。5. 企业可交付版从 Excel 读取数据一键生成组合图并保存 PNG如果只是手写几组列表画图学习意义有但工作价值有限。真正能落地的做法是从 Excel 读取数据然后自动生成 PNG。这样每次月报、周报、数据复盘只需要更新 Excel 数据脚本就能重新输出图表。这张图展示了从 Excel 数据读取、Python 生成组合图、最终保存 PNG 的完整流程。从这张图中可以看出自动化出图的关键不在于单个绘图函数而在于形成一条完整链路读取数据 → 清洗字段 → 生成图表 → 保存文件 → 用于报告。这才是办公自动化的实际价值。假设 Excel 中有三列月份工单数量解决率1月120922月98883月13595可以使用下面这段代码生成组合图importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltfrompathlibimportPath plt.rcParams[font.sans-serif][SimHei]plt.rcParams[axes.unicode_minus]Falsedefexcel_to_combo_chart(xlsx_path:str,sheet:str,x_col:str,bar_col:str,line_col:str,out_png:strout/combo.png,line_is_percent:boolTrue):dfpd.read_excel(xlsx_path,sheet_namesheet)# 读取并清洗数据x_labelsdf[x_col].astype(str).tolist()barpd.to_numeric(df[bar_col],errorscoerce).fillna(0).tolist()linepd.to_numeric(df[line_col],errorscoerce).fillna(0).tolist()xnp.arange(len(x_labels))fig,ax1plt.subplots(figsize(10,6))# 左轴柱形图ax1.bar(x,bar,width0.6,alpha0.75,labelbar_col)ax1.set_xlabel(x_col)ax1.set_ylabel(bar_col)ax1.set_xticks(x)ax1.set_xticklabels(x_labels)ax1.grid(axisy,linestyle--,alpha0.4)# 给柱形图加数据标签fori,vinenumerate(bar):ax1.text(i,v,str(int(v)),hacenter,vabottom)# 右轴折线图ax2ax1.twinx()ax2.plot(x,line,markero,linewidth2,linestyle--,labelline_col)ax2.set_ylabel(line_col)ifline_is_percent:ax2.set_ylim(0,100)# 合并图例h1,l1ax1.get_legend_handles_labels()h2,l2ax2.get_legend_handles_labels()ax1.legend(h1h2,l1l2,locupper left)plt.title(f组合图{bar_col}柱 {line_col}折线)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__:pngexcel_to_combo_chart(xlsx_pathreport.xlsx,sheet数据,x_col月份,bar_col工单数量,line_col解决率,out_pngout/组合图_工单数量_解决率.png,line_is_percentTrue)print(已输出,png)这段代码的关键点有三个第一使用 pandas 从 Excel 读取数据第二使用twinx()创建双 y 轴第三将图表保存为 PNG方便插入 Word、PPT、Excel 或 CSDN 博客。不要只看脚本有没有报错。生成图片以后一定要打开 PNG 检查标题、图例、单位、数据范围是否合理。图能生成不代表图就是对的。6. 常见坑组合图最容易“看着对其实错”组合图最危险的地方不是代码写不出来而是图表看起来很专业实际表达却有问题。尤其是双 y 轴组合图如果坐标范围、单位、图例没有处理好读者很容易被误导。这张图展示了组合图常见坑与规范包括单位清楚、标签清晰、范围锁定、图例合并等关键点。从这张图中可以看出一张可交付的组合图不只是“柱形 折线”这么简单还要保证单位清楚、标签不拥挤、图例能看懂、百分比范围合理。否则图表越复杂误导风险越高。6.1 右轴不锁范围趋势可能被夸大如果折线表示百分比比如解决率、满意度、达成率我建议右轴固定为 0100。否则 Matplotlib 自动缩放后95% 到 97% 的变化可能被画得像大幅波动。ax2.set_ylim(0,100)推荐做法百分比指标优先锁定 0100除非你明确告诉读者这是局部放大图。6.2 两边单位不写清楚图表就没有交付价值左轴是“单”右轴是“%”必须写在轴标题里。否则读者只能靠猜这对技术文章和工作汇报都不合格。ax1.set_ylabel(工单数量单)ax2.set_ylabel(解决率%)6.3 图例只显示一边会导致读者看不懂双 y 轴图表有两个坐标轴对象分别是ax1和ax2。如果只调用一边的legend()图例可能只显示柱形图不显示折线图。h1,l1ax1.get_legend_handles_labels()h2,l2ax2.get_legend_handles_labels()ax1.legend(h1h2,l1l2,locupper left)这个问题很隐蔽。因为图已经画出来了但读者不知道每条线代表什么最终会降低整张图的可信度。7. 效果验证一张组合图是否合格看这 5 点脚本执行完成以后不要只看 PNG 文件是否生成。我更建议从“交付视角”检查图表因为组合图最终是给人看的不是给 Python 自己看的。我通常按下面 5 点验收标题是否说明图表主题例如“工单数量 解决率趋势”左右 y 轴单位是否明确一个是数量一个是百分比图例是否完整柱形和折线都能对应上数据标签是否影响阅读标签不能挤在一起坐标范围是否合理百分比是否锁定 0100数量是否留有顶部空间。真正的验证不是“有没有生成图”而是“图能不能支持你要表达的判断”。比如你要说明“工单量增长但解决率没有下降”那读者应该能从图里一眼看出来。8. 本节小结组合图是一张图讲完“量 趋势 质量”这一节我真正掌握的不是某一行代码而是组合图背后的表达逻辑。柱形图适合表达数量折线图适合表达趋势双 y 轴适合处理不同单位和不同量级的数据。我把这节内容总结成四句话同量级数据可以使用同坐标轴组合图不同量级数据优先考虑双 y 轴组合图百分比指标建议锁定 0100避免视觉误导自动化交付从 Excel 读取数据生成 PNG才是真正可复用的办公自动化流程。组合图不是为了让图表“看起来高级”而是为了让读者在一张图里同时看清业务量有没有变化趋势有没有变化质量有没有跟上。9. 我的总结提升这一篇的核心不是简单记住“制作组合图表展示多维信息”这个小节名称而是要把它放到 Python Excel 办公自动化的完整路径里理解。真正有价值的读书笔记应该做到三点知道它解决什么问题不是为了画图而画图而是为了让数据表达更清楚知道代码为什么这样写尤其是twinx()、图例合并、坐标范围锁定这些关键点知道如何验证结果图表生成以后要检查单位、范围、图例和业务结论是否一致。如果只会复制代码但不能判断图表是否误导读者这类图表反而会降低汇报质量。所以我建议把组合图当成一个“汇报表达工具”而不是单纯的 Matplotlib 练习。后续写周报、月报、工单统计、镜像上线效果评估时这类图非常实用。11. 发布版补充我建议这样使用这篇笔记这一节在书中的位置是第8章图表扩展核心主题是制作组合图表展示多维信息。我不建议只把它当成“代码记忆点”而应该把它放到办公自动化流程里理解先判断图表要表达什么再选择图表结构最后确认结果是否真正适合交付。最容易翻车的地方通常不是 Python 语法而是图表表达不严谨单位没写清楚、右轴范围不合理、图例不完整、两组数据没有业务关系却强行组合。我的建议是后续做图表类文章时不要只给代码还要补充“什么场景适合用、什么场景不适合用、生成后怎么验证”。这样文章才不是单纯的代码笔记而是能直接迁移到工作中的实战模板。返回顶部