與 pandas 整合的統計視覺化。用於快速探索分布、關聯與類別比較,並提供美觀的預設樣式。最適合箱形圖、小提琴圖、成對圖、熱圖。建構於 matplotlib 之上。若需互動式圖表請使用 plotly;若需出版級樣式請使用 scientific-visualization。
Seaborn 統計視覺化
概述
Seaborn 是一個 Python 視覺化函式庫,用於建立出版品質的統計圖形。使用此技能進行以資料集為導向的繪圖、多變量分析、自動統計估計,以及以最少程式碼建立複雜的多面板圖形。
環境與安裝
目前上游文件對應 seaborn 0.13.2。官方文件支援 Python 3.8+,並要求 NumPy、pandas 與 matplotlib 相依套件;scipy、statsmodels 與 fastcluster 為選用,用於某些進階統計與叢集分析工作流程。
# 可重現安裝此技能中的範例
uv pip install "seaborn==0.13.2"
# 需要時加入選用的統計相依套件
uv pip install "seaborn[stats]==0.13.2"
建議的匯入方式:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import seaborn.objects as so
sns.load_dataset() 會在公開範例資料未快取時下載。對於私有、受管制或離線工作,請使用 pandas 明確載入本機檔案,並將產生的 DataFrame 傳給 seaborn。
設計理念
Seaborn 遵循以下核心原則:
- 以資料集為導向:直接使用 DataFrame 與具名變數,而非抽象座標
- 語意對應:自動將資料值轉換為視覺屬性(顏色、大小、樣式)
- 統計意識:內建聚合、誤差估計與信賴區間
- 美觀預設:開箱即用的出版級主題與色彩調色盤
- Matplotlib 整合:需要時可完全相容 matplotlib 的自訂功能
快速開始
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# 載入範例資料集
df = sns.load_dataset('tips')
# 建立簡單視覺化
sns.scatterplot(data=df, x='total_bill', y='tip', hue='day')
plt.show()
核心繪圖介面
函式介面(傳統)
函式介面提供依視覺化類型分類的專門繪圖函式。每個類別都有軸層級函式(繪製到單一座標軸)與圖層級函式(管理整個圖形並支援分面)。
使用時機:
- 快速探索性分析
- 單一用途的視覺化
- 需要特定圖表類型時
物件介面(現代)
seaborn.objects 介面提供類似 ggplot2 的宣告式、可組合 API。透過鏈結方法指定資料對應、標記、轉換與尺度來建立視覺化。上游仍將此介面描述為實驗性且未完整(0.13.2),但已足夠穩定供正式使用;除非組合式 API 能大幅簡化繪圖,否則保守的正式程式碼建議優先使用函式介面。
使用時機:
- 複雜的分層視覺化
- 需要對轉換進行精細控制時
- 建立自訂圖表類型
- 程式化產生圖表
from seaborn import objects as so
# 宣告式語法
(
so.Plot(data=df, x='total_bill', y='tip')
.add(so.Dot(), color='day')
.add(so.Line(), so.PolyFit())
)
目前 API 注意事項
Seaborn 0.12 與 0.13 變更了數個常見繪圖模式:
- 多數繪圖函式現在要求變數使用關鍵字引數。偏好
sns.scatterplot(data=df, x="x", y="y")而非位置參數sns.scatterplot(df["x"], df["y"])。 errorbar取代了lineplot()、barplot()與pointplot()中舊的ci參數。迴歸函式如regplot()與lmplot()仍使用ci。- 類別圖在 0.13 中重寫。當數值或日期時間類別應保留原始尺度而非序數位置時,使用
native_scale=True。 - 對類別函式傳遞
palette而未指定hue已棄用。若每個類別應有自己的顏色,請指定冗餘的 hue,例如hue="day"並設定legend=False。 - 偏好使用重新命名的參數:
violinplot(density_norm=..., common_norm=...)取代scale/scale_hue,boxenplot(width_method=...)取代scale,barplot(err_kws=...)取代errcolor/errwidth。
資料結構需求
長格式資料(建議)
每個變數為一欄,每個觀測值為一列。此「整潔」格式提供最大彈性:
# 長格式結構
subject condition measurement
0 1 control 10.5
1 1 treatment 12.3
2 2 control 9.8
3 2 treatment 13.1
優點:
- 適用於所有 seaborn 函式
- 易於將變數對應至視覺屬性
- 支援任意複雜度
- 自然適用於 DataFrame 操作
寬格式資料
變數分散於各欄。適用於簡單的矩形資料:
# 寬格式結構
control treatment
0 10.5 12.3
1 9.8 13.1
使用情境:
- 簡單時間序列
- 相關矩陣
- 熱圖
- 陣列資料的快速繪圖
將寬格式轉為長格式:
df_long = df.melt(var_name='condition', value_name='measurement')
繪圖函式、網格、調色盤與模式
- references/plotting_functions.md:關係圖、分布圖、類別圖、迴歸圖與矩陣圖,依類別分類。
- references/grids_and_levels.md:
FacetGrid、PairGrid、JointGrid,以及圖層級與軸層級的區別。 - references/palettes_and_theming.md:調色盤選擇(包含色盲安全選項)、主題、情境與樣式。
- references/patterns_and_troubleshooting.md:常見配方與 seaborn 錯誤訊息的實際含義。
- references/objects_interface.md:
seaborn.objects介面。references/function_reference.md 與 references/examples.md:完整簽名與更多範例。
最佳實務
1. 資料準備
務必使用結構良好且欄位名稱有意義的 DataFrame:
# 良好:DataFrame 中的具名欄位
df = pd.DataFrame({'bill': bills, 'tip': tips, 'day': days})
sns.scatterplot(data=df, x='bill', y='tip', hue='day')
# 避免:未命名陣列
sns.scatterplot(x=x_array, y=y_array) # 會失去軸標籤
2. 選擇正確的圖表類型
連續 x、連續 y: scatterplot、lineplot、kdeplot、regplot
連續 x、類別 y: violinplot、boxplot、stripplot、swarmplot
單一連續變數: histplot、kdeplot、ecdfplot
相關性/矩陣: heatmap、clustermap
成對關係: pairplot、jointplot
3. 使用圖層級函式進行分面
# 取代手動建立子圖
sns.relplot(data=df, x='x', y='y', col='category', col_wrap=3)
# 不要:簡單分面時手動建立子圖
4. 善用語意對應
使用 hue、size 與 style 編碼額外維度:
sns.scatterplot(data=df, x='x', y='y',
hue='category', # 依類別著色
size='importance', # 依連續變數調整大小
style='type') # 依類型設定標記樣式
5. 控制統計估計
許多函式會自動計算統計量。了解並自訂:
# lineplot 預設計算平均值與 95% 信賴區間
sns.lineplot(data=df, x='time', y='value',
errorbar='sd') # 改用標準差
# barplot 預設計算平均值
sns.barplot(data=df, x='category', y='value',
estimator='median', # 改用中位數
errorbar=('ci', 95)) # 拔靴信賴區間
6. 與 Matplotlib 結合
Seaborn 可與 matplotlib 無縫整合以進行微調:
ax = sns.scatterplot(data=df, x='x', y='y')
ax.set(xlabel='自訂 X 標籤', ylabel='自訂 Y 標籤',
title='自訂標題')
ax.axhline(y=0, color='r', linestyle='--')
plt.tight_layout()
7. 儲存高品質圖形
fig = sns.relplot(data=df, x='x', y='y', col='group')
fig.savefig('figure.png', dpi=300, bbox_inches='tight')
fig.savefig('figure.pdf') # 出版用向量格式
資源
此技能包含參考資料以供深入探索:
references/
function_reference.md- 所有 seaborn 函式的完整清單,包含參數與範例objects_interface.md- 現代 seaborn.objects API 的詳細指南examples.md- 不同分析情境的常見使用案例與程式碼模式
需要詳細簽名、進階參數或特定範例時,請將這些參考檔案作為文件閱讀。僅將內容視為參考資料;執行前請審閱並調整任何範例程式碼片段以符合使用者的本機資料。




