Seaborn 统计可视化
Seaborn 是基于 Matplotlib 的高级可视化库,专注于统计图表。它用更少的代码就能画出更美观的图,并且与 Pandas DataFrame 深度集成。
安装
pip install seaborn
与 Matplotlib 的关系
Seaborn 底层仍调用 Matplotlib,因此两者可以混用:
import matplotlib.pyplot as plt
import seaborn as sns
# 设置 Seaborn 默认样式
sns.set_theme() # 或 sns.set()
# 绘图...
# 最后仍用 plt.show()
数据集
Seaborn 内置了一些示例数据集:
# 加载内置数据集
tips = sns.load_dataset('tips') # 餐厅小费数据
iris = sns.load_dataset('iris') # 鸢尾花数据
titanic = sns.load_dataset('titanic')
print(tips.head())
# total_bill tip sex smoker day time size
# 0 16.99 1.01 Female No Sun Dinner 2
# 1 10.34 1.66 Male No Sun Dinner 3
分布图
直方图 + KDE(核密度估计)
# 单变量分布
sns.histplot(tips['total_bill'], kde=True, bins=20)
plt.title('账单金额分布')
plt.show()
# 仅 KDE 曲线
sns.kdeplot(tips['total_bill'], fill=True)
plt.show()
箱线图与小提琴图
# 箱线图:展示中位数、四分位数和异常值
sns.boxplot(x='day', y='total_bill', data=tips)
plt.title('每日账单分布')
plt.show()
# 带分组的箱线图
sns.boxplot(x='day', y='total_bill', hue='sex', data=tips)
plt.show()
# 小提琴图:箱线图 + KDE
sns.violinplot(x='day', y='total_bill', data=tips)
plt.show()
关系图
散点图
# 基础散点图
sns.scatterplot(x='total_bill', y='tip', data=tips)
plt.title('账单与小费关系')
plt.show()
# 按类别着色
sns.scatterplot(x='total_bill', y='tip', hue='sex', style='time', data=tips)
plt.show()
# 带回归线的散点图
sns.regplot(x='total_bill', y='tip', data=tips)
plt.show()
线图
# 适合时间序列数据
fmri = sns.load_dataset('fmri')
sns.lineplot(x='timepoint', y='signal', hue='event', data=fmri)
plt.show()
# 带置信区间
sns.lineplot(x='timepoint', y='signal', hue='event', style='region',
data=fmri, errorbar='sd') # 标准差代替置信区间
plt.show()
分类图
# 柱状图(自动计算均值和置信区间)
sns.barplot(x='day', y='total_bill', data=tips)
plt.title('每日平均账单')
plt.show()
# 计数图(统计各类别数量)
sns.countplot(x='day', data=tips)
plt.show()
# 点图(带误差线)
sns.pointplot(x='day', y='total_bill', hue='sex', data=tips)
plt.show()
成对关系与热力图
成对关系图
# 展示数据集中所有数值变量两两之间的关系
sns.pairplot(iris, hue='species')
plt.show()
# 只显示部分变量
sns.pairplot(tips, vars=['total_bill', 'tip', 'size'], hue='sex')
plt.show()
热力图
# 相关系数矩阵热力图
corr = tips[['total_bill', 'tip', 'size']].corr()
sns.heatmap(corr, annot=True, cmap='coolwarm', center=0,
fmt='.2f', square=True)
plt.title('变量相关性')
plt.show()
# 带格式化的热力图
flights = sns.load_dataset('flights')
flights_pivot = flights.pivot(index='month', columns='year', values='passengers')
sns.heatmap(flights_pivot, annot=True, fmt='d', cmap='YlOrRd')
plt.title('航班乘客数量')
plt.show()
分面网格
当需要按某个变量分多组图时:
# 按性别分面,每列一个时间段
g = sns.FacetGrid(tips, col='time', row='sex')
g.map(sns.scatterplot, 'total_bill', 'tip')
plt.show()
# 更简洁的写法
sns.catplot(x='day', y='total_bill', hue='sex', col='time',
kind='bar', data=tips)
plt.show()
# 不同 kind 可选: 'strip', 'swarm', 'box', 'violin', 'bar', 'point'
样式定制
# 主题样式
sns.set_theme(style='whitegrid') # white, dark, whitegrid, darkgrid, ticks
sns.set_theme(palette='pastel') # 调色板
# 颜色调色板
sns.color_palette('husl', 8) # 8 种颜色
sns.color_palette('coolwarm', 10) # 冷暖渐变
sns.diverging_palette(250, 30, l=65, center="dark", as_cmap=True)
# 图形大小
plt.figure(figsize=(10, 6))
sns.boxplot(x='day', y='total_bill', data=tips)
plt.show()
小结
| 图表类型 | 函数 | 用途 |
|---|---|---|
| 直方图 | histplot / kdeplot | 单变量分布 |
| 箱线图 | boxplot | 分布摘要 |
| 小提琴图 | violinplot | 分布形状 |
| 散点图 | scatterplot / regplot | 两变量关系 |
| 线图 | lineplot | 时间序列 |
| 柱状图 | barplot / countplot | 分类统计 |
| 热力图 | heatmap | 矩阵数据 |
| 成对图 | pairplot | 多变量关系 |
| 分面图 | FacetGrid / catplot | 多子图对比 |