前面我们学了散点图(展示变量关系)、线图(展示变化趋势),今天我们学习统计类图表的“入门款”——直方图。
在数据分析中,我们经常需要查看数据的分布情况:比如“学生成绩集中在哪个分数段”“账单金额主要分布在哪个区间”“用户年龄分布是否均匀”,而直方图就是最直观的工具。
用Seaborn绘制直方图,不仅颜值高,还能一键添加核密度曲线、分组对比,新手也能轻松搞定统计分布可视化👇
Seaborn绘制直方图的核心函数是sns.histplot(),核心作用是将数据分成多个“区间(bins)”,用柱子的高度表示每个区间的数据数量,能快速看出数据的集中范围。
用小费数据集,展示“账单金额”的分布情况,看大多数账单集中在哪个金额区间,3行核心代码搞定:
import seaborn as snsimport matplotlib.pyplot as plt# 1. 加载数据+设置主题tips = sns.load_dataset("tips")sns.set_style("whitegrid", rc={"font.sans-serif": ["SimHei"]})# 2. 绘制基础直方图:x轴=账单金额,默认分组区间sns.histplot(x="total_bill", data=tips, color="#4ECDC4")# 3. 优化图表:标题、坐标轴标签plt.title("账单金额分布直方图")plt.xlabel("账单金额(元)")plt.ylabel("数据数量(人数)")# 显示图表plt.show()

实际分析中,我们常常需要对比不同类别的数据分布(比如“不同性别的账单金额分布差异”),同时添加核密度曲线,更清晰地看出数据分布趋势,这些用Seaborn都能一键实现:
import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")sns.set_style("whitegrid", rc={"font.sans-serif": ["SimHei"]})# 1. 按性别分组,对比不同性别的账单金额分布,添加核密度曲线sns.histplot(x="total_bill", hue="sex", data=tips,kde=True, # kde=True 添加核密度曲线palette="Set2", # 分组配色edgecolor="black" # 柱子边框颜色(更清晰))plt.title("不同性别账单金额分布直方图(带核密度曲线)")plt.xlabel("账单金额(元)")plt.ylabel("数据数量(人数)")plt.show()# 2. 自定义区间数量(bins),更精准展示分布# bins越大,区间越多,细节越清晰;反之则越简洁sns.histplot(x="total_bill", data=tips,bins=20, # 自定义20个区间color="#FF6B6B",edgecolor="black")plt.title("账单金额分布直方图(自定义20个区间)")plt.xlabel("账单金额(元)")plt.ylabel("数据数量(人数)")plt.show()


bins参数怎么设?不宜过大或过小:过大会导致图表杂乱(区间太多),过小会丢失分布细节(区间太少),建议根据数据量设置为10-30之间;
分组后柱子重叠?用multiple="dodge"参数,让分组柱子并排显示,比如sns.histplot(x="total_bill", hue="sex", data=tips, multiple="dodge");
不需要核密度曲线?去掉kde=True即可,默认不显示;
柱子颜色太单调?用color参数自定义单颜色,或用palette参数自定义分组配色。
将直方图与散点图结合,同时展示数据分布和变量关系,让可视化更全面:
import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")sns.set_style("whitegrid", rc={"font.sans-serif": ["SimHei"]})# 创建2行1列的子图,上下布局fig, axes = plt.subplots(2, 1, figsize=(10, 8))# 上子图:直方图(账单金额分布)sns.histplot(x="total_bill", data=tips, color="#4ECDC4", ax=axes[0])axes[0].set_title("账单金额分布直方图")axes[0].set_xlabel("账单金额(元)")axes[0].set_ylabel("数据数量(人数)")# 下子图:散点图(账单金额与小费金额关系)sns.scatterplot(x="total_bill", y="tip", data=tips, color="#FF6B6B", ax=axes[1])axes[1].set_title("账单金额与小费金额关系散点图")axes[1].set_xlabel("账单金额(元)")axes[1].set_ylabel("小费金额(元)")# 调整子图间距,避免拥挤plt.tight_layout()plt.show()

本篇我们掌握了Seaborn直方图的基础绘制、分组对比、核密度曲线添加,能轻松应对“查看数据分布”的统计需求~
下篇我们将讲解直方图的“平滑版”——核密度图,教你更直观地展示数据分布趋势,对比多个类别的分布差异,提升统计可视化的专业性!
往期回顾:
Python学习笔记——从入门到报废(十九、第三方库(下))
(文章使用AI进行润色和排版)