数据可视化让老板一眼看懂你的成果本文基于 Python 3.9涉及库matplotlib、pyecharts。阅读时间约 10 分钟。安装依赖pip install matplotlib pyecharts汇报现场的灾难阿明花了一周做数据分析终于到了汇报的时候。他打开 PPT贴了一张密密麻麻的表格——30 行 × 8 列数字堆得像蚂蚁搬家。老板看了 3 秒眉头一皱“这什么意思”阿明赶紧解释“这是各部门的销售数据第一列是部门第二列是销售额……”老板摆手“我不想看数字我想看趋势、看对比、看问题在哪。”阿明脸红到耳根。会后老张拍着他肩膀“数据是给人看的不是给人找的。一张图胜过一千行表格。”“老板要的是’一眼看懂’不是’仔细研究’。”阿明“那我用 Excel 画图表”可以但慢。而且每次数据更新图要重画。老张打开 VS Code“用 Python数据一变图自动更新。”第一步matplotlib——基础绘图像家常菜“matplotlib是 Python 最基础的绘图库就像家常菜——你能用它做出任何想吃的但需要自己动手调火候。”pipinstallmatplotlib最简示例折线图importmatplotlib.pyplotasplt# 数据一周的销售额days[周一,周二,周三,周四,周五,周六,周日]sales[12000,15000,13000,17000,20000,25000,22000]# 画图plt.figure(figsize(10,6))# 画布大小plt.plot(days,sales,markero,linewidth2,color#2E86AB)# 加标题和标签plt.title(本周销售额趋势,fontsize16,fontweightbold)plt.xlabel(日期,fontsize12)plt.ylabel(销售额元,fontsize12)# 在每个点上方标注数值fori,vinenumerate(sales):plt.text(i,v500,f{v:,},hacenter,fontsize10)# 加网格线plt.grid(True,alpha0.3)# 保存plt.tight_layout()plt.savefig(销售额趋势.png,dpi150)plt.show()print(✅ 图表已保存)运行后一张带标题、标签、数值标注、网格线的折线图就生成了。阿明“这代码……比我在 Excel 里点来点去还快”“对而且可复用——下周数据变了换一行数字重新跑一遍图就更新了。”第二步柱状图 饼图——对比和占比“折线图看趋势柱状图看对比饼图看占比。”柱状图各部门销售额对比importmatplotlib.pyplotasplt departments[销售部,市场部,技术部,客服部,财务部]sales[450000,320000,180000,150000,120000]# 颜色列表colors[#2E86AB,#A23B72,#F18F01,#C73E1D,#6A994E]plt.figure(figsize(10,6))barsplt.bar(departments,sales,colorcolors,edgecolorblack,linewidth0.5)# 在柱子上方标注数值forbarinbars:heightbar.get_height()plt.text(bar.get_x()bar.get_width()/2.,height5000,f{height:,.0f},hacenter,vabottom,fontsize11)plt.title(各部门 1 月销售额对比,fontsize16,fontweightbold)plt.ylabel(销售额元,fontsize12)plt.ylim(0,max(sales)*1.15)# Y 轴留点空间plt.tight_layout()plt.savefig(部门销售对比.png,dpi150)plt.show()饼图销售占比plt.figure(figsize(8,8))plt.pie(sales,labelsdepartments,autopct%1.1f%%,colorscolors,startangle90,explode(0.05,0,0,0,0))plt.title(各部门销售额占比,fontsize16,fontweightbold)plt.savefig(销售占比.png,dpi150)plt.show()“autopct%1.1f%%是显示百分比explode是把某一块’拉出来’突出显示。”第三步pyecharts——交互式图表像餐厅摆盘“matplotlib生成的是静态图片够用了。但如果你想要交互式图表——鼠标悬停显示数值、可以缩放、可以切换显示——那就用pyecharts。”“pyecharts就像餐厅摆盘——端出去就让人觉得专业。”pipinstallpyecharts最简示例交互式折线图frompyecharts.chartsimportLinefrompyechartsimportoptionsasopts days[周一,周二,周三,周四,周五,周六,周日]sales[12000,15000,13000,17000,20000,25000,22000]# 创建折线图lineLine()line.add_xaxis(days)line.add_yaxis(销售额,sales,is_smoothTrue,# 平滑曲线markpoint_optsopts.MarkPointOpts(data[opts.MarkPointItem(type_max,name最大值)]),)# 设置标题和提示框line.set_global_opts(title_optsopts.TitleOpts(title本周销售额趋势),tooltip_optsopts.TooltipOpts(triggeraxis),# 鼠标悬停显示toolbox_optsopts.ToolboxOpts(),# 工具箱保存、缩放等)# 保存为 HTML 文件line.render(销售额趋势.html)print(✅ 交互式图表已保存为 HTML)打开生成的 HTML 文件你可以鼠标悬停看具体数值点击图例隐藏/显示某条线用工具箱保存图片、缩放区域“而且可以直接发给别人对方用浏览器打开就能看不需要装 Python。”第四步实战——自动生成周报图表“来把前面学的串起来做一个’自动生成周报图表’的脚本。”importpandasaspdimportmatplotlib.pyplotaspltfrommatplotlibimportrcParams# 设置中文字体WindowsrcParams[font.sans-serif][SimHei,Arial Unicode MS]rcParams[axes.unicode_minus]False# 解决负号显示问题# 读取数据假设是前面 Excel 自动化的输出dfpd.read_excel(1月汇总报表.xlsx)# 按部门汇总dept_summarydf.groupby(来源)[销售额].sum().sort_values(ascendingFalse)# 创建 2×1 的子图fig,axesplt.subplots(2,1,figsize(12,10))# 图 1柱状图 colorsplt.cm.Set3(range(len(dept_summary)))barsaxes[0].bar(dept_summary.index,dept_summary.values,colorcolors)axes[0].set_title(各部门销售额对比,fontsize14,fontweightbold)axes[0].set_ylabel(销售额元)forbarinbars:heightbar.get_height()axes[0].text(bar.get_x()bar.get_width()/2.,height,f{height:,.0f},hacenter,vabottom,fontsize9)# 图 2饼图 axes[1].pie(dept_summary.values,labelsdept_summary.index,autopct%1.1f%%,colorscolors,startangle90)axes[1].set_title(销售额占比,fontsize14,fontweightbold)plt.tight_layout()plt.savefig(周报图表.png,dpi150,bbox_inchestight)plt.show()print(✅ 周报图表已生成)“这段代码干了啥”“1. 读取 Excel 数据2. 按部门汇总3. 画两个子图柱状图看对比饼图看占比4. 保存为高清 PNG”“以前你画这两个图要半小时代码 30 行跑完 2 秒。”第五步把图表嵌入邮件“图表生成了怎么发给老板”“直接作为附件或者嵌入 HTML 邮件正文。”importyagmail yagyagmail.SMTP(user你的邮箱,password授权码,hostsmtp.qq.com)# HTML 正文引用图表html_body h2本周数据汇报/h2 p各部门销售数据如下/p img srccid:chart1 p详细数据请查看附件。/p yag.send(tobosscompany.com,subject【周报】销售数据可视化,contentshtml_body,attachments[周报图表.png,1月汇总报表.xlsx],)print(✅ 带图表的邮件已发送)“有些邮箱客户端支持直接显示图片有些需要附件形式。稳妥起见图表既嵌入正文又作为附件。”踩坑提醒可视化的坑坑 1中文乱码“matplotlib默认不支持中文标题和标签会显示成方框。”“解决办法设置中文字体。”frommatplotlibimportrcParams# WindowsrcParams[font.sans-serif][SimHei,Microsoft YaHei]# MacrcParams[font.sans-serif][Arial Unicode MS,PingFang HK]# LinuxrcParams[font.sans-serif][WenQuanYi Micro Hei]rcParams[axes.unicode_minus]False# 负号正常显示坑 2颜色太丑“默认颜色搭配可能不够商务。”“建议用专业配色”# 商务蓝配色colors[#1f77b4,#ff7f0e,#2ca02c,#d62728,#9467bd]# 或者直接用 seaborn 的风格importseabornassns sns.set_style(whitegrid)坑 3图表信息过载“一张图里塞太多东西老板看不懂。”原则一张图只讲一个观点颜色不要超过 5 种去掉不必要的网格线、边框数值标注要清晰一句话总结阿明把带图表的周报发给老板老板回复了一个。老张路过笑了“数据可视化就像做菜——原始数据是生肉生菜matplotlib是家常做法能做出任何你想吃的pyecharts是餐厅摆盘端出去就让人觉得专业。记住一张图只讲一个观点别让观众找信息。”扩展思考可视化的应用场景还有很多实时监控大屏用pyecharts生成网页投到电视上实时刷新动态报表数据更新后图表自动重绘多维度对比用热力图看各区域、各时间段的销售表现趋势预测用折线图 预测线展示未来走势“核心原则让数据自己说话别让人找数据。”下集预告下一篇阿明的系统周末挂了周一才发现。老张教他机器人告警——异常自动发微信/钉钉再也不用盯着屏幕。记住matplotlib负责家常做法pyecharts负责餐厅摆盘。图表不是越多越好而是越’一眼懂’越好。你们老板喜欢看表格还是图表你有没有因为’数据呈现不好’被批过欢迎在评论区吐槽。