数据有了也分析完了但拿一堆表格数字给人看没人看得进去——得画图。一说到画图很多人就头疼参数太多。其实不用。Matplotlib 的逻辑跟纸上画画一模一样就三层第一层得有张纸——画布Figure第二层纸上得有个画的区域——坐标系Axes第三层在区域里画东西——图表元素线、柱、点理解了这三层所有参数都有地方放。今天把最常用的三种图一次搞定折线图、柱状图、散点图。一、先搞清楚那三层关系把 Matplotlib 想象成一个画室Figure 就是画纸纸多大、横版竖版归它管Axes 就是画框一张纸可以放一个或多个画框比如 2 行 2 列四张图每个画框有自己的坐标系、标题、标签图表元素 就是画的内容线条、柱子、散点、标注都在画框里记住一句Figure 是纸Axes 是纸上的一块画图区域。我们从一开始就用面向对象的写法围绕ax操作逻辑最清楚后面画复杂图也不会乱。importmatplotlib.pyplotaspltimportmatplotlib matplotlib.rcParams[font.sans-serif][SimHei,Microsoft YaHei]matplotlib.rcParams[axes.unicode_minus]Falsedays[周一,周二,周三,周四,周五,周六,周日]temp[22,24,23,26,25,27,26]fig,axplt.subplots(figsize(8,4))ax.plot(days,temp,markero,color#ff4d4f,linewidth2)ax.set_title(本周气温变化,fontsize14)ax.set_xlabel(日期)ax.set_ylabel(温度℃)ax.grid(axisy,alpha0.3)plt.tight_layout()plt.show()代码结构就是那三层plt.subplots()同时创建画纸(fig)和画框(ax)ax.plot()在画框里画线ax.set_title()加文字说明。所有操作都围绕ax来。二、折线图看趋势折线图用得最多看趋势、看变化、看走势时间序列和连续变化的数据首选。importmatplotlib.pyplotaspltimportmatplotlib matplotlib.rcParams[font.sans-serif][SimHei,Microsoft YaHei]matplotlib.rcParams[axes.unicode_minus]Falsemonths[1月,2月,3月,4月,5月,6月]sales_A[120,150,135,180,200,220]sales_B[80,95,110,130,125,150]fig,axplt.subplots(figsize(9,5))ax.plot(months,sales_A,markero,color#ff4d4f,linewidth2,label产品A)ax.plot(months,sales_B,markers,color#1890ff,linewidth2,label产品B)ax.set_title(上半年产品销售趋势,fontsize15)ax.set_xlabel(月份)ax.set_ylabel(销售额万元)ax.legend(locupper left)ax.grid(axisy,alpha0.3,linestyle--)ax.spines[top].set_visible(False)ax.spines[right].set_visible(False)plt.tight_layout()plt.show()几个关键点多条线就多次调用plot()每次传不同数据和颜色marker是数据点标记圆圈o、方块s、三角^图例用legend()自动读取每条线的label去掉上右边框是提升图品质感的小技巧专业图表大多这么做想突出体量感还能画填充面积ax.fill_between(months, sales_A, alpha0.2, color#ff4d4f)alpha越小越透明。三、柱状图比大小柱状图用来对比、排名、看多少不同类别比大小最直观。importmatplotlib.pyplotaspltimportmatplotlib matplotlib.rcParams[font.sans-serif][SimHei,Microsoft YaHei]matplotlib.rcParams[axes.unicode_minus]Falsecategories[食品,服装,数码,家居,美妆]revenue[320,280,450,180,220]fig,axplt.subplots(figsize(9,5))barsax.bar(categories,revenue,color#ff4d4f,width0.6)ax.set_title(各品类销售额对比,fontsize15)ax.set_ylabel(销售额万元)forbarinbars:hbar.get_height()ax.text(bar.get_x()bar.get_width()/2,h5,f{h},hacenter,vabottom)ax.spines[top].set_visible(False)ax.spines[right].set_visible(False)ax.grid(axisy,alpha0.3,linestyle--)plt.tight_layout()plt.show()最实用的技巧是在柱子顶上加数字别人不用对着 Y 轴猜。类别名字长时用横向柱状图ax.barh(categories, revenue)。两组数据放一起对比用分组柱状图核心是用x - width/2和x width/2把两组柱子错开就不会叠在一起importnumpyasnp categories[食品,服装,数码,家居,美妆]last_year[280,260,380,150,190]this_year[320,280,450,180,220]xnp.arange(len(categories))width0.35fig,axplt.subplots(figsize(9,5))ax.bar(x-width/2,last_year,width,label去年,color#91d5ff)ax.bar(xwidth/2,this_year,width,label今年,color#ff4d4f)ax.set_xticks(x)ax.set_xticklabels(categories)ax.set_title(各品类今年vs去年销售额,fontsize15)ax.legend()ax.spines[top].set_visible(False)ax.spines[right].set_visible(False)plt.tight_layout()plt.show()四、散点图看关系散点图用来看两个变量的关系、分布、聚类比如身高体重、广告费和销售额、学习时间和分数。importmatplotlib.pyplotaspltimportmatplotlibimportnumpyasnp matplotlib.rcParams[font.sans-serif][SimHei,Microsoft YaHei]matplotlib.rcParams[axes.unicode_minus]Falsenp.random.seed(42)ad_spendnp.random.uniform(10,100,50)sales503*ad_spendnp.random.normal(0,20,50)fig,axplt.subplots(figsize(8,6))ax.scatter(ad_spend,sales,c#ff4d4f,alpha0.6,s60,edgecolorswhite)ax.set_title(广告费投入 vs 销售额,fontsize15)ax.set_xlabel(广告费投入万元)ax.set_ylabel(销售额万元)ax.spines[top].set_visible(False)ax.spines[right].set_visible(False)plt.tight_layout()plt.show()散点图里每个点代表一条记录点的分布形态就是两个变量的关系左下往右上走 → 正相关一个涨另一个也涨左上往右下走 → 负相关一团散点 → 没什么关系弯弯曲曲 → 可能是非线性关系还能用点的大小和颜色再加两个维度比如点大小表利润、颜色表转化率但初学别加太多容易乱。五、一张纸上画多张图用plt.subplots(行数, 列数)就行比如 2 行 2 列importmatplotlib.pyplotaspltimportmatplotlibimportnumpyasnp matplotlib.rcParams[font.sans-serif][SimHei,Microsoft YaHei]matplotlib.rcParams[axes.unicode_minus]Falsemonths[1月,2月,3月,4月,5月,6月]sales[120,150,135,180,200,220]categories[食品,服装,数码,家居,美妆]revenue[320,280,450,180,220]fig,axesplt.subplots(2,2,figsize(12,9))axes[0,0].plot(months,sales,markero,color#ff4d4f)axes[0,0].set_title(销售趋势)axes[0,1].bar(categories,revenue,color#1890ff)axes[0,1].set_title(品类对比)axes[1,0].scatter(months,sales,c#52c41a,s50)axes[1,0].set_title(月度散点)axes[1,1].fill_between(months,sales,alpha0.3,color#722ed1)axes[1,1].plot(months,sales,color#722ed1)axes[1,1].set_title(销售面积图)foraxinaxes.flat:ax.spines[top].set_visible(False)ax.spines[right].set_visible(False)plt.tight_layout()plt.show()这里的axes是二维数组axes[0,0]是左上角axes[0,1]是右上角以此类推axes.flat把二维数组展开成一维方便统一设置样式。真实运行效果把第一节那段三层逻辑的折线图代码直接跑一遍开头先设好 SimHei 中文字体终端输出如下可以看到一周气温的最高 27℃、最低 22℃、均值 24.71℃ 都是代码实时算出的数字折线图按“画布→坐标系→画线”三层画好并保存成图片全程无报错、中文也没有乱码。六、总结一下今天的核心不是记了多少参数而是搞懂那个三层逻辑画纸Figure→ 画框Axes→ 画面内容plot/bar/scatter以后不管画什么图先想要多大一张纸纸上分几个区域每个区域里画什么加不加标题、标签、图例按这个顺序来永远不会乱。折线图看趋势、柱状图比大小、散点图看关系——三个基础图就能应付绝大多数日常数据分析需求。下一篇聊个更根本的问题面对一份数据到底该选什么图来表达梅雅达编程工作室 · Python数据实战系列第11篇所有代码均可直接复制运行。建议动手敲一遍比看十遍都管用。
阅读完成 · 觉得有帮助?