数据没问题,分析也到位,图画出来了——但就是土土的,不像网上那些专业图表。差在细节:默认Matplotlib画的是"毛坯房",那些好看的专业图,不过是把默认参数一个个调过。
今天拿一张最常见的销售趋势图,从默认版一步步改到专业版。先看起点:
importmatplotlib.pyplotaspltimportnumpyasnp months=['1月','2月','3月','4月','5月','6月']sales_A=[120,150,135,180,200,220]sales_B=[80,95,110,130,125,150]plt.plot(months,sales_A)plt.plot(months,sales_B)plt.title('销售额对比')plt.legend()plt.show()第一步:解决中文乱码
中文全是方块,是Matplotlib默认字体不支持中文。开头加两行全局配置,写一次后面所有图都生效:
importmatplotlib.pyplotaspltimportmatplotlib matplotlib.rcParams['font.sans-serif']=['SimHei','Microsoft YaHei','PingFang SC']matplotlib.rcParams['axes.unicode_minus']=FalseWindows用微软雅黑、Mac用PingFang SC、Linux用SimHei,三个都写上兼容性最好。
第二步:换一套好看的颜色
专业图和默认图的第一个视觉差距就是配色。直接用成熟方案:主色珊瑚红#ff4d4f,辅色#1890ff天蓝、#52c41a翠绿、#722ed1紫罗兰、#fa8c16橘黄。在plot()里加color,顺手把线加粗到2像素:
fig,ax=plt.subplots(figsize=(9,5))ax.plot(months,sales_A,color='#ff4d4f',linewidth=2,label='产品A')ax.plot(months,sales_B,color='#1890ff',linewidth=2,label='产品B')ax.set_title('2026年上半年产品销售趋势',fontsize=14)ax.set_xlabel('月份')ax.set_ylabel('销售额(万元)')ax.legend()plt.tight_layout()plt.show()配色原则:一张图颜色别超过4-5种;主色饱和度适中;折线用纯色,填充区域用半透明(alpha=0.2-0.3)。
第三步:去掉上右两条边框
专业图表通常只留下、左两条边框,上右是多余的:
ax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)两行代码,性价比最高——四条边框在四个方向"抓"视线,把图框死了;去掉两边,视线自然聚焦到数据本身。
第四步:加网格,但只加横向的
没网格读者要对着Y轴比来比去,全网格又像格子本。正确做法是只加横向淡网格:
ax.grid(axis='y',alpha=0.3,linestyle='--')axis='y'只画横向,alpha=0.3很淡不抢戏,linestyle='--'虚线比实线更轻。网格退居二线辅助阅读,而不是抢戏。
第五步:把标题和标签调到位
ax.set_title('2026年上半年产品销售趋势',fontsize=15,fontweight='bold',pad=15,loc='left')ax.set_xlabel('月份',fontsize=11,labelpad=8)ax.set_ylabel('销售额(万元)',fontsize=11,labelpad=8)关键调整:标题左对齐(人眼从左往右读,标题在左边更顺)、加粗、加padding透气、字号有层级(标题15、标签11、刻度10),一眼就知道什么是重点。
第六步:图例美化 + 数值标注
图例去掉边框、原则是别挡住数据:
ax.legend(loc='upper left',frameon=False,fontsize=10)关键数据点旁直接标数字,读者不用猜:
ax.annotate(f'{sales_A[-1]}万',xy=(len(sales_A)-1,sales_A[-1]),xytext=(10,0),textcoords='offset points',fontsize=10,color='#ff4d4f')xy是箭头指向的位置,xytext是文字相对那个点的偏移。数据点密时只标关键节点(最高、最低、最后一个点)。
改造前后对比
六步改完,最终版完整代码可直接复制运行:
importmatplotlib.pyplotaspltimportmatplotlib matplotlib.rcParams['font.sans-serif']=['SimHei','Microsoft YaHei','PingFang SC']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,ax=plt.subplots(figsize=(9,5))ax.plot(months,sales_A,color='#ff4d4f',linewidth=2.5,marker='o',markersize=6,label='产品A')ax.plot(months,sales_B,color='#1890ff',linewidth=2.5,marker='s',markersize=5,label='产品B')ax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)ax.grid(axis='y',alpha=0.25,linestyle='--')ax.set_title('2026年上半年产品销售趋势',fontsize=15,fontweight='bold',pad=15,loc='left')ax.set_xlabel('月份',fontsize=11,labelpad=8)ax.set_ylabel('销售额(万元)',fontsize=11,labelpad=8)ax.legend(loc='upper left',frameon=False,fontsize=10)plt.tight_layout()plt.show()数据没变、图表类型没变,气质完全不一样了。
差的就是这六件事:
- 中文能正常显示
- 换了一套好看的配色
- 去掉了上右两条边框
- 只留横向淡网格
- 标题层级分明
- 图例和标注细节到位
真实运行效果
把上面最终版完整代码复制到本地跑一遍,控制台会依次打印数据统计和六步美化的配置执行情况,图片正常保存即说明改造成功。
截图里能看到产品A、B 的真实销售额与 max/min/均值,以及中文字体、配色、去边框、横向网格、标题层级、图例标注六步逐项配置完成、图片保存成功的完整日志。
最后说一句
美化不是花架子——好看的图读者更容易读、更愿意信。但也别走向另一个极端。记住:所有美化都是为了让数据更容易被读懂,而不是为了炫技。去边框为了聚焦数据,加网格为了方便读数,调颜色为了区分层次,每个动作都有目的。
下一篇换个库——Seaborn,把统计可视化做得更优雅、更省心。
梅雅达编程工作室 · Python数据实战系列第13篇
图表美化这件事,知道方法了就是一层窗户纸。