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()
關于顏色映射介紹可以學習這篇文章:在 Matplotlib 中選擇色彩映射 — Matplotlib 3.10.0 文檔 - Matplotlib 繪圖庫
③ 下三角 + 回歸線
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 的瑞士軍刀。