跳到主要内容

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多子图对比