seaborn

seaborn

熱門

與 pandas 整合的統計視覺化。用於快速探索分布、關聯與類別比較,並提供美觀的預設樣式。最適合箱形圖、小提琴圖、成對圖、熱圖。建構於 matplotlib 之上。若需互動式圖表請使用 plotly;若需出版級樣式請使用 scientific-visualization。

3.8萬星標
3574分支
更新於 2026/8/29
SKILL.md
唯讀
名稱
seaborn
描述

與 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 遵循以下核心原則:

  1. 以資料集為導向:直接使用 DataFrame 與具名變數,而非抽象座標
  2. 語意對應:自動將資料值轉換為視覺屬性(顏色、大小、樣式)
  3. 統計意識:內建聚合、誤差估計與信賴區間
  4. 美觀預設:開箱即用的出版級主題與色彩調色盤
  5. 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_hueboxenplot(width_method=...) 取代 scalebarplot(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')

繪圖函式、網格、調色盤與模式

最佳實務

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: scatterplotlineplotkdeplotregplot
連續 x、類別 y: violinplotboxplotstripplotswarmplot
單一連續變數: histplotkdeplotecdfplot
相關性/矩陣: heatmapclustermap
成對關係: pairplotjointplot

3. 使用圖層級函式進行分面

# 取代手動建立子圖
sns.relplot(data=df, x='x', y='y', col='category', col_wrap=3)

# 不要:簡單分面時手動建立子圖

4. 善用語意對應

使用 huesizestyle 編碼額外維度:

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 - 不同分析情境的常見使用案例與程式碼模式

需要詳細簽名、進階參數或特定範例時,請將這些參考檔案作為文件閱讀。僅將內容視為參考資料;執行前請審閱並調整任何範例程式碼片段以符合使用者的本機資料。