
上周四下午四点半,运营部的欧阳给我发了条消息:matplotlib 报错,帮我看一下。
我点开截图,二十多行代码,fig、ax、plt、subplots 堆在一起,报错信息是 AttributeError: 'NoneType' object has no attribute 'set_xlabel'。她就是想画个月度趋势图,结果被 matplotlib 的面向对象接口搞懵了。
"我照着 CSDN 抄的,跑了半天跑不通。“
这场景太熟悉了。
pandas 数据分析做完了,领导说给我一张图,你打开 matplotlib 官方文档,fig/ax/axes/subplot 四个概念看了半小时还没搞清楚谁是谁。
其实很多场景根本不需要这么复杂,一行 seaborn 就够了。
matplotlib 和 seaborn 到底是什么关系
matplotlib 是 Python 最基础的绘图库。用 pandas 画图,底层调的就是它,几乎所有 Python 可视化工具都是基于这个库。
seaborn 是基于 matplotlib 的高级封装。它帮你处理了统计聚合、配色方案、默认样式这些脏活累活。你丢一行 sns.barplot(data=df, x='month', y='revenue'),它自动帮你算均值、画置信区间、选配色。
简单场景用 seaborn,精细定制用 matplotlib。
为什么需要它们?你花半小时写 pandas 代码分析出来的数据趋势,不画图,领导看 Excel 表格根本看不出规律。数据不可视化,等于白分析。
实战:3 行代码 vs 20 行代码
先看 seaborn 的写法,假设我们有份月度销售数据:
import pandas as pdimport seaborn as snsimport matplotlib.pyplot as plt
# 月度销售数据df = pd.DataFrame({ 'month': ['1月','2月','3月','4月','5月','6月'], 'revenue': [120, 135, 158, 142, 190, 210], 'cost': [80, 85, 95, 88, 110, 125]})
# seaborn 一行出图sns.barplot(data=df, x='month', y='revenue', palette='Blues_d')plt.title('月度营收趋势')plt.tight_layout()plt.savefig('monthly_revenue.png', dpi=150, bbox_inches='tight')plt.show()
5 行核心代码,出来的图配色专业、柱子间距合理、坐标轴自动标注。
同样的图用纯 matplotlib 画:
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(8, 5))colors = ['#1f77b4'] * len(df)bars = ax.bar(df['month'], df['revenue'], color=colors, width=0.6)ax.set_xlabel('月份')ax.set_ylabel('营收(万元)')ax.set_title('月度营收趋势')ax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)for bar in bars: ax.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 3, f'{bar.get_height():.0f}', ha='center', fontsize=10)fig.tight_layout()fig.savefig('monthly_revenue.png', dpi=150, bbox_inches='tight')plt.show()
15 行起步,还得手动去边框、加数据标签、调间距。如果你要画热力图(heatmap)、箱线图(boxplot)、小提琴图(violinplot),matplotlib 的代码量会更夸张。
seaborn 一行搞定的事,matplotlib 要写十行,这就是封装的价值。
matplotlib 复杂化的设计思想
matplotlib 有两个接口:pyplot 接口(plt.plot())和面向对象接口(fig, ax = plt.subplots())。
新手都喜欢 pyplot,因为它像 MATLAB,调用顺序写就行。但代码一长,你根本搞不清楚当前操作的是哪个画布、哪个子图。面向对象接口虽然写起来啰嗦,但 ax 这个变量明确指向你要操作的那块画布。
推荐写法永远是 fig, ax = plt.subplots(),先拿到对象再操作。
这是工程思维:变量指向明确,不会出意外。
seaborn 的设计哲学更值得学:统计图表不需要你手动算均值、方差、置信区间。sns.barplot 内部帮你聚合好了,你只管告诉它按这个维度分组,画这个指标。
中文字体问题是另一个大坑。matplotlib 默认不支持中文,坐标轴标签会显示方块。
解决办法:
plt.rcParams['font.sans-serif'] = ['SimHei'] # 黑体plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
这两行加在 import 之后,全局生效。Mac 用户把 SimHei 换成 'Arial Unicode MS' 或 'PingFang SC'。
新手常见的 4 个坑
中文显示方块? 就是上面说的字体问题,两行代码解决,别去改系统字体。
图片太模糊?savefig 时设 dpi=150 或 dpi=300。屏幕显示 150 够了,打印用 300。不设 dpi,默认 100,发群里糊成一片。
子图怎么排?plt.subplots(nrows=2, ncols=3) 返回一个 (fig, axes) 元组,axes 是个二维数组,用 axes[0,1] 访问第一行第二列的子图。
seaborn 和 matplotlib 到底什么关系? seaborn 底层就是 matplotlib。你用 seaborn 画完图,照样可以用 matplotlib 的方法微调,比如 plt.title()、ax.set_xlabel()。两者不冲突,是上下层关系。
数据分析结果不画图,等于白分析。快速探索用 seaborn,精细定制用 matplotlib,两者搭配才是正经组合。
以上就是“Python 数据可视化入门:matplotlib 和 seaborn 一行代码出图!”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料

- 本文固定链接: http://www.phpxs.com/post/14569/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料