20250713-`Seaborn.pairplot` 的使用注意事项
Seaborn.pairplot
的使用注意事项
sns.pairplot
是 Seaborn 中最常用、最强大的探索性数据分析(EDA)函数之一。 它在一个调用里就能同时展示:
- 任意两两变量间的 散点图(观察关系、聚类、异常值)
- 对角线上每个变量的 单变量分布(直方图 / KDE / 计数)
- 按 类别变量 分组的 颜色映射(hue)
1. 基本语法
seaborn.pairplot(data, # 必需,DataFramevars=None, # 指定列(默认全部数值列)x_vars=None, y_vars=None, # 仅画部分组合(高级用法)hue=None, # 按该列分组上色hue_order=None, # hue 显示顺序palette=None, # 调色板kind='scatter', # 非对角线子图类型:'scatter' | 'reg' | 'kde' | 'hist'diag_kind='auto', # 对角线:'auto' | 'hist' | 'kde' | Nonemarkers=None, # 不同 hue 的散点形状 ['o','s','^']height=2.5, # 单幅子图的高度(英寸inch)aspect=1, # 宽高比(正方形)corner=False, # 只画下三角dropna=True, # 是否丢弃缺失值plot_kws=None, # 传给非对角线的函数关键字(散点/回归函数)diag_kws=None, # 传给对角线的函数关键字grid_kws=None # 传给 PairGrid 的关键字
)
2. 参数详解 & 技巧
参数 | 说明 & 示例 |
---|---|
vars | 只画关心的列:vars=['trip_distance', 'fare_amount', 'tip'] |
hue | 按类别上色:hue='pickup_cluster' |
kind | 关系图类型:kind='reg' → 加回归线kind='kde' → 二维核密度 |
diag_kind | 对角线:diag_kind='hist' (直方图)diag_kind='kde' (密度曲线) |
corner=True | 只画下三角,节省空间 |
height / aspect | 控制整张图大小:height=3, aspect=1.2 |
plot_kws | 传给散点图:plot_kws={'alpha':0.4, 's':20} |
diag_kws | 传给直方图:diag_kws={'bins':30, 'color':'skyblue'} |
markers | 不同 hue 的形状:markers=['o','s','D'] |
3. 最常见用法示例
准备数据:
test_cols = ['medallion', 'hack_license', 'trip_time_in_mins', 'trip_distance', 'total_amount', 'pickup_dayofweek']
df = time_bins_data[test_cols].sample(frac=0.0001) # 从数据集中随机抽取少量的样本(减少计算量)
df.columns
Index(['medallion', 'hack_license', 'trip_time_in_mins', 'trip_distance','total_amount', 'pickup_dayofweek'],dtype='object')
① 快速浏览所有数值特征
sns.pairplot(df)
plt.show()
② 只看指定列 + 按类别着色
sns.pairplot(df,vars=['trip_distance', 'total_amount', 'pickup_dayofweek'],hue='pickup_dayofweek',palette='Set2',height=3
)
plt.show()
此时就出现一个问题 (hue, hue) = ('pickup_dayofweek', 'pickup_dayofweek')
子图是空的。此时应该是 vars
、 hue
变量与核密度函数 kde
之间的冲突问题,可解决该问题的方法有以下三种:
需要注意的一个问题是: 当
diag_kind='auto'(默认值)
时,seaborn 会根据 是否指定了hue
来自动决定对角线子图类型:
- 如果 hue=None(未指定) → 对角线画 直方图
hist
- 如果 hue=某个列名(指定了) → 对角线画 核密度估计
kde
- 不要指定
vars
的内容
sns.pairplot(df[['trip_distance', 'total_amount', 'pickup_dayofweek']],# vars=['trip_distance', 'total_amount', 'pickup_dayofweek'],hue='pickup_dayofweek',palette='Set2',# diag_kind='hist',height=3
)
plt.show()
-
vars
中不要包含hue
列,参见 ③ -
指定对角线子图的
diag_kind='hist'
(前两个方法都不会统计显示hue
列)
sns.pairplot(df,vars=['trip_distance', 'total_amount', 'pickup_dayofweek'], hue='pickup_dayofweek',palette='Set2',diag_kind='hist',height=3
)
plt.show()
③ 下三角 + 回归线
sns.pairplot(df,vars=test_cols[:4],hue='pickup_dayofweek', # 按类别分组palette='Set1', # 颜色调色板kind='reg', # 非对角线加回归diag_kind='hist', # 对角线直方图corner=True, # 只画左下
)
plt.show()
④ 离散类别变量的对角线
sns.pairplot(df,vars=test_cols,hue='pickup_dayofweek', # 按类别分组palette='Set1', # 颜色调色板plot_kws={'alpha': 0.4}, # 点透明度(提升重叠区域可读性)diag_kind='hist', # 对角线子图用直方图展示单变量分布(kde, hist)
)
plt.show()
4. 返回对象 & 进一步自定义
pairplot
本质上是 PairGrid
的封装:
g = sns.pairplot(df,vars=test_cols[2:],hue='pickup_dayofweek', # 按类别分组palette='Set1', # 颜色调色板plot_kws={'alpha': 0.4}, # 点透明度(提升重叠区域可读性)diag_kind='hist', # 对角线子图用直方图展示单变量分布(kde, hist)
)
g.fig.suptitle("My Pairplot", y=1.02) # 总标题
g.set(xlim=(0, 100), ylim=(0, 100)) # 统一坐标轴范围(需要合理设置,不然有些数据可能会无法显示)
g.map_diag(sns.histplot, kde=True) # 对角线子图用直方图展示单变量分布(kde, hist)
plt.show()
# g.savefig("pairplot.png", dpi=300, bbox_inches='tight') # 保存
5. 常见坑 & FAQ
问题 | 原因 & 解决 |
---|---|
对角线空白 | 离散变量 + KDE → 用 diag_kind='hist' |
hue 列不在 vars 里 | 把 hue 列也放进 vars 才能在对角线看到它 |
图太大 | 调小 height 或 corner=True |
颜色太多 | 限制 hue_order 或使用 palette |
sns.pairplot
= 一次函数调用,完成所有两两关系 + 分布 + 分组可视化,是 EDA 的瑞士军刀。