seaborn について
seaborn を使った統計グラフィックスの Python スキルガイドです。データセットを基点に、変数の関係や分布の探索、カテゴリ比較、matplotlib と連携したファセット図やレイヤー図の作成を支援します。
主な機能
- 01関係図と分布図
- 02カテゴリ比較と統計推定
- 03回帰図と残差図
- 04行列図とクラスターヒートマップ
- 05ファセット図と複数パネル図
活用シーン
- 01データセット内の変数関係の探索
- 02カテゴリ別の分布比較
- 03回帰フィットと残差の可視化
- 04サブグループ別のファセット図作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ hkphysics/ scientific-agent-skills --skill seabornインストール後、Claude Code で/seabornを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/examples.mdfunction_reference.mdobjects_interface.md詳細
Seaborn 統計ビジュアライゼーション
概要
Seaborn は、出版品質の統計グラフを作成するための Python ビジュアライゼーションライブラリです。データセットを中心としたプロット、多変量解析、自動統計推定、複雑な複数パネルの図を最小限のコードで作成する際に、このスキルを使用してください。
環境とインストール
現在の上流ドキュメントは seaborn 0.13.2 を対象としています。公式ドキュメントでは Python 3.8 以降をサポートしており、NumPy、pandas、matplotlib が必須の依存関係です。scipy、statsmodels、fastcluster は、一部の高度な統計処理やクラスタリングのワークフローで使用するオプションの依存関係です。
# Reproducible install for examples in this skill
uv pip install "seaborn==0.13.2"
# Include optional statistical dependencies when needed
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
# Load example dataset
df = sns.load_dataset('tips')
# Create a simple visualization
sns.scatterplot(data=df, x='total_bill', y='tip', hue='day')
plt.show()
中核となるプロットインターフェース
関数インターフェース(従来型)
関数インターフェースでは、ビジュアライゼーションの種類ごとに分類された、用途に特化したプロット関数を提供します。各カテゴリには、軸レベル関数(単一の Axes にプロット)と図レベル関数(ファセットを使用して図全体を管理)があります。
使用する場面:
- 手早い探索的分析
- 単一目的のビジュアライゼーション
- 特定のプロットタイプが必要な場合
Objects インターフェース(モダン)
seaborn.objects インターフェースは、ggplot2 に似た宣言的で合成可能な API を提供します。メソッドを連鎖させてデータのマッピング、マーク、変換、スケールを指定し、ビジュアライゼーションを構築できます。上流ドキュメントでは、0.13.2 においてこのインターフェースは依然として実験的で未完成と説明されていますが、本格的な利用には十分安定しています。合成 API によってプロットが大幅に簡潔になる場合を除き、慎重さが求められる本番コードでは関数インターフェースを優先してください。
使用する場面:
- 複雑なレイヤー構成のビジュアライゼーション
- 変換をきめ細かく制御する必要がある場合
- カスタムのプロットタイプを構築する場合
- プログラムによるプロット生成
from seaborn import objects as so
# Declarative syntax
(
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(df["x"], df["y"])よりも、sns.scatterplot(data=df, x="x", y="y")を優先してください。 lineplot()、barplot()、pointplot()では、従来のciパラメーターの代わりにerrorbarを使用します。regplot()やlmplot()などの回帰関数では、引き続きciを使用します。- カテゴリプロットは 0.13 で書き換えられました。数値または日時のカテゴリで元のスケールを維持し、順序位置に置き換えない場合は、
native_scale=Trueを使用してください。 - カテゴリ関数で
hueを割り当てずにpaletteを渡す方法は非推奨です。各カテゴリに独自の色を割り当てる場合は、hue="day"などの冗長な hue を割り当て、legend=Falseを設定してください。 - 名前が変更されたパラメーターを優先してください。
scale/scale_hueの代わりにviolinplot(density_norm=..., common_norm=...)、scaleの代わりにboxenplot(width_method=...)、errcolor/errwidthの代わりにbarplot(err_kws=...)を使用します。
カテゴリ別プロット関数
関係プロット(変数間の関係)
用途: 2つ以上の変数がどのように関連しているかを調べます
scatterplot()- 個々の観測値を点として表示しますlineplot()- 傾向や変化を示します(自動的に集計し、信頼区間を計算します)relplot()- 自動ファセット機能を備えた Figure レベルのインターフェースです
主なパラメーター:
x、y- 主な変数hue- 追加のカテゴリ変数または連続変数を色で表しますsize- 点や線のサイズを表しますstyle- マーカーや線のスタイルを表しますcol、row- 複数のサブプロットに分割します(Figure レベルのみ)
# Scatter with multiple semantic mappings
sns.scatterplot(data=df, x='total_bill', y='tip',
hue='time', size='size', style='sex')
# Line plot with confidence intervals
sns.lineplot(data=timeseries, x='date', y='value', hue='category')
# Faceted relational plot
sns.relplot(data=df, x='total_bill', y='tip',
col='time', row='sex', hue='smoker', kind='scatter')
分布プロット(単変量・二変量分布)
用途: データの広がり、形状、確率密度を把握します
histplot()- ビン分割を柔軟に設定できる、棒グラフ形式の度数分布ですkdeplot()- ガウスカーネルを使用した滑らかな密度推定ですecdfplot()- 経験累積分布です(調整するパラメーターはありません)rugplot()- 個々の観測値を目盛りで示しますdisplot()- 単変量分布と二変量分布に対応した Figure レベルのインターフェースですjointplot()- 周辺分布を備えた二変量プロットですpairplot()- データセット内のペアごとの関係を示す行列です
主なパラメーター:
x、y- 変数(単変量の場合、yは省略可能です)hue- カテゴリごとに分布を分けますstat- 正規化方法:「count」、「frequency」、「probability」、「density」bins/binwidth- ヒストグラムのビン分割を制御しますbw_adjust- KDE の帯域幅の倍率です(値を大きくすると滑らかになります)fill- 曲線の下の領域を塗りつぶしますmultiple-hueの扱い方:「layer」、「stack」、「dodge」、「fill」
# Histogram with density normalization
sns.histplot(data=df, x='total_bill', hue='time',
stat='density', multiple='stack')
# Bivariate KDE with contours
sns.kdeplot(data=df, x='total_bill', y='tip',
fill=True, levels=5, thresh=0.1)
# Joint plot with marginals
sns.jointplot(data=df, x='total_bill', y='tip',
kind='scatter', hue='time')
# Pairwise relationships
sns.pairplot(data=df, hue='species', corner=True)
カテゴリプロット(カテゴリ間の比較)
用途: 離散カテゴリ間で分布や統計量を比較します
カテゴリ散布図:
stripplot()- ジッターを加えた点で、すべての観測値を表示しますswarmplot()- 点が重ならないように表示します(ビースウォームアルゴリズム)
分布の比較:
boxplot()- 四分位数と外れ値を示しますviolinplot()- KDE と四分位数の情報を示しますboxenplot()- 大規模なデータセット向けに改良された箱ひげ図です
統計的推定:
barplot()- 信頼区間付きで平均値や集計値を示しますpointplot()- 点推定値を線で結んで示しますcountplot()- カテゴリごとの観測数を示します
Figure レベル:
catplot()- ファセット化されたカテゴリプロットです(kindパラメーターを設定します)
主なパラメーター:
x、y- 変数(通常、片方はカテゴリ変数です)hue- 追加のカテゴリグループ分けorder、hue_order- カテゴリの順序を制御しますnative_scale- カテゴリ軸で数値/日時のスケールを維持しますlog_scale- matplotlib に切り替えることなく、対数スケールを適用しますformatter- カテゴリ目盛りのラベルを制御しますdodge、gap-hueの各レベルを横に並べて分け、ずらした要素の間隔を設定しますorient- カテゴリ軸を指定する「x」/「y」または「v」/「h」legend- True/False または「auto」、「brief」、「full」kind- catplot のプロットタイプ:「strip」、「swarm」、「box」、「violin」、「boxen」、「bar」、「point」、「count」
# Swarm plot showing all points
sns.swarmplot(data=df, x='day', y='total_bill', hue='sex')
# Violin plot with split for comparison
sns.violinplot(data=df, x='day', y='total_bill',
hue='sex', split=True)
# Bar plot with error bars
sns.barplot(data=df, x='day', y='total_bill',
hue='sex', estimator='mean', errorbar=('ci', 95))
# Faceted categorical plot
sns.catplot(data=df, x='day', y='total_bill',
col='time', kind='box')
回帰プロット(線形関係)
用途: 線形回帰と残差を可視化します
regplot()- 散布図と近似直線を組み合わせた Axes レベルの回帰プロットですlmplot()- ファセット機能に対応した Figure レベルのプロットですresidplot()- モデルの適合度を評価するための残差プロットです
主なパラメーター:
x、y- 回帰に使用する変数order- 多項式回帰の次数logistic- ロジスティック回帰を適合しますrobust- ロバスト回帰を使用します(外れ値の影響を受けにくくなります)ci- 信頼区間の幅(デフォルトは 95)scatter_kws、line_kws- 散布図と線のプロパティをカスタマイズします
# Simple linear regression
sns.regplot(data=df, x='total_bill', y='tip')
# Polynomial regression with faceting
sns.lmplot(data=df, x='total_bill', y='tip',
col='time', order=2, ci=95)
# Check residuals
sns.residplot(data=df, x='total_bill', y='tip')
行列プロット(矩形データ)
用途: 行列、相関、格子状のデータを可視化します
heatmap()- 注釈付きの色分けされた行列clustermap()- 階層的にクラスタリングされたヒートマップ
主なパラメーター:
data- 2 次元の矩形データセット(DataFrame または配列)annot- セル内に値を表示しますfmt- 注釈の書式文字列(例:".2f")cmap- カラーマップ名center- カラーマップの中心となる値(発散カラーマップの場合)vmin、vmax- カラースケールの範囲square- セルを正方形にしますlinewidths- セル間の間隔
# Correlation heatmap
corr = df.select_dtypes(include='number').corr()
sns.heatmap(corr, annot=True, fmt='.2f',
cmap='coolwarm', center=0, square=True)
# Clustered heatmap
sns.clustermap(data, cmap='viridis',
standard_scale=1, figsize=(10, 10))
複数プロットのグリッド
Seaborn は、複雑な複数パネルの図を作成するためのグリッドオブジェクトを提供します。
FacetGrid
カテゴリ変数に基づいてサブプロットを作成します。図レベル関数(relplot、displot、catplot)経由で呼び出す場合に最も便利ですが、カスタムプロットで直接使用することもできます。
g = sns.FacetGrid(df, col='time', row='sex', hue='smoker')
g.map(sns.scatterplot, 'total_bill', 'tip')
g.add_legend()
PairGrid
データセット内のすべての変数のペアごとの関係を表示します。
g = sns.PairGrid(df, hue='species')
g.map_upper(sns.scatterplot)
g.map_lower(sns.kdeplot)
g.map_diag(sns.histplot)
g.add_legend()
JointGrid
2 変量プロットと周辺分布を組み合わせます。
g = sns.JointGrid(data=df, x='total_bill', y='tip')
g.plot_joint(sns.scatterplot)
g.plot_marginals(sns.histplot)
図レベル関数と Axes レベル関数
この違いを理解することは、seaborn を効果的に使ううえで重要です。
Axes レベル関数
- 単一の matplotlib
Axesオブジェクトにプロットします - 複雑な matplotlib の図に簡単に組み込めます
- 配置を正確に指定するための
ax=パラメーターを受け取ります Axesオブジェクトを返します- 例:
scatterplot、histplot、boxplot、regplot、heatmap
使用する場面:
- カスタムの複数プロットレイアウトを作成する場合
- 異なる種類のプロットを組み合わせる場合
- matplotlib レベルの制御が必要な場合
- 既存の matplotlib コードに組み込む場合
fig, axes = plt.subplots(2, 2, figsize=(10, 10))
sns.scatterplot(data=df, x='x', y='y', ax=axes[0, 0])
sns.histplot(data=df, x='x', ax=axes[0, 1])
sns.boxplot(data=df, x='cat', y='y', ax=axes[1, 0])
sns.kdeplot(data=df, x='x', y='y', ax=axes[1, 1])
図レベル関数
- すべてのサブプロットを含む図全体を管理します
colとrowパラメーターによる組み込みのファセット機能を備えていますFacetGrid、JointGrid、またはPairGridオブジェクトを返します- サイズ指定には
heightとaspectを使用します(サブプロットごと) - 既存の図には配置できません
- 例:
relplot、displot、catplot、lmplot、jointplot、pairplot
使用する場面:
- ファセット可視化(スモールマルチプル)
- 手早く探索的分析を行う場合
- 一貫性のある複数パネルレイアウトを作成する場合
- 他の種類のプロットと組み合わせる必要がない場合
# Automatic faceting
sns.relplot(data=df, x='x', y='y', col='category', row='group',
hue='type', height=3, aspect=1.2)
データ構造の要件
ロング形式データ(推奨)
各変数を列、各観測値を行にします。この「整然」形式では、最大限の柔軟性が得られます。
# Long-form structure
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 の操作に適しています
ワイド形式データ
変数が複数の列に分かれています。単純な矩形データに便利です。
# Wide-form structure
control treatment
0 10.5 12.3
1 9.8 13.1
使用例:
- 単純な時系列
- 相関行列
- ヒートマップ
- 配列データの簡単なプロット
ワイド形式からロング形式への変換:
df_long = df.melt(var_name='condition', value_name='measurement')
カラーパレット
Seaborn は、さまざまなデータ型に合わせて丁寧に設計されたカラーパレットを提供します。
質的パレット(カテゴリデータ)
色相の違いによってカテゴリを区別します。
"deep"- デフォルト。鮮やかな色"muted"- より柔らかく、彩度を抑えた色"pastel"- 明るく、彩度を抑えた色"bright"- 彩度の高い色"dark"- 暗い色"colorblind"- 色覚特性に配慮した色
sns.set_palette("colorblind")
sns.color_palette("Set2")
シーケンシャルパレット(順序付きデータ)
値の低い方から高い方への推移を表します。
"rocket"、"mako"- 輝度の幅が広い(ヒートマップに適しています)"flare"、"crest"- 輝度の幅が狭い(点や線に適しています)"viridis"、"magma"、"plasma"- Matplotlib の知覚的に均一なパレット
sns.heatmap(data, cmap='rocket')
sns.kdeplot(data=df, x='x', y='y', cmap='mako', fill=True)
発散パレット(中心のあるデータ)
中間値からの偏差を強調します。
"vlag"- 青から赤"icefire"- 青からオレンジ"coolwarm"- 寒色から暖色"Spectral"- 虹色の発散パレット
sns.heatmap(correlation_matrix, cmap='vlag', center=0)
カスタムパレット
# Create custom palette
custom = sns.color_palette("husl", 8)
# Light to dark gradient
palette = sns.light_palette("seagreen", as_cmap=True)
# Diverging palette from hues
palette = sns.diverging_palette(250, 10, as_cmap=True)
テーマと外観
テーマの設定
set_theme() は全体的な外観を制御します。
# Set complete theme
sns.set_theme(style='whitegrid', palette='pastel', font='sans-serif')
# Reset to defaults
sns.set_theme()
スタイル
背景とグリッドの見た目を調整します:
"darkgrid"- 白いグリッドのあるグレーの背景(デフォルト)"whitegrid"- グレーのグリッドのある白い背景"dark"- グリッドなしのグレーの背景"white"- グリッドなしの白い背景"ticks"- 軸目盛りのある白い背景
sns.set_style("whitegrid")
# Remove spines
sns.despine(left=False, bottom=False, offset=10, trim=True)
# Temporary style
with sns.axes_style("white"):
sns.scatterplot(data=df, x='x', y='y')
コンテキスト
用途に応じて要素のサイズを調整します:
"paper"- 最小(デフォルト)"notebook"- やや大きめ"talk"- プレゼンテーションスライド"poster"- 大判形式
sns.set_context("talk", font_scale=1.2)
# Temporary context
with sns.plotting_context("poster"):
sns.barplot(data=df, x='category', y='value')
ベストプラクティス
1. データの準備
意味のある列名を持つ、適切に構造化された DataFrame を常に使用します:
# Good: Named columns in DataFrame
df = pd.DataFrame({'bill': bills, 'tip': tips, 'day': days})
sns.scatterplot(data=df, x='bill', y='tip', hue='day')
# Avoid: Unnamed arrays
sns.scatterplot(x=x_array, y=y_array) # Loses axis labels
2. 適切なプロットタイプを選ぶ
連続値の x、連続値の y: scatterplot、lineplot、kdeplot、regplot
連続値の x、カテゴリ値の y: violinplot、boxplot、stripplot、swarmplot
連続変数が 1 つ: histplot、kdeplot、ecdfplot
相関/行列: heatmap、clustermap
ペアごとの関係: pairplot、jointplot
3. ファセット化には Figure レベルの関数を使う
# Instead of manual subplot creation
sns.relplot(data=df, x='x', y='y', col='category', col_wrap=3)
# Not: Creating subplots manually for simple faceting
4. セマンティックマッピングを活用する
hue、size、style を使って、追加の次元を表現します:
sns.scatterplot(data=df, x='x', y='y',
hue='category', # Color by category
size='importance', # Size by continuous variable
style='type') # Marker style by type
5. 統計的推定を制御する
多くの関数は統計量を自動的に計算します。その仕組みを理解し、必要に応じてカスタマイズします:
# Lineplot computes mean and 95% CI by default
sns.lineplot(data=df, x='time', y='value',
errorbar='sd') # Use standard deviation instead
# Barplot computes mean by default
sns.barplot(data=df, x='category', y='value',
estimator='median', # Use median instead
errorbar=('ci', 95)) # Bootstrapped CI
6. Matplotlib と組み合わせる
Seaborn は matplotlib とシームレスに連携し、細かな調整ができます:
ax = sns.scatterplot(data=df, x='x', y='y')
ax.set(xlabel='Custom X Label', ylabel='Custom Y Label',
title='Custom 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') # Vector format for publications
よくあるパターン
探索的データ分析
# Quick overview of all relationships
sns.pairplot(data=df, hue='target', corner=True)
# Distribution exploration
sns.displot(data=df, x='variable', hue='group',
kind='kde', fill=True, col='category')
# Correlation analysis
corr = df.corr()
sns.heatmap(corr, annot=True, cmap='coolwarm', center=0)
論文掲載品質の図
sns.set_theme(style='ticks', context='paper', font_scale=1.1)
g = sns.catplot(data=df, x='treatment', y='response',
col='cell_line', kind='box', height=3, aspect=1.2)
g.set_axis_labels('Treatment Condition', 'Response (μM)')
g.set_titles('{col_name}')
sns.despine(trim=True)
g.savefig('figure.pdf', dpi=300, bbox_inches='tight')
複雑な複数パネルの図
# Using matplotlib subplots with seaborn
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
sns.scatterplot(data=df, x='x1', y='y', hue='group', ax=axes[0, 0])
sns.histplot(data=df, x='x1', hue='group', ax=axes[0, 1])
sns.violinplot(data=df, x='group', y='y', ax=axes[1, 0])
sns.heatmap(df.pivot_table(values='y', index='x1', columns='x2'),
ax=axes[1, 1], cmap='viridis')
plt.tight_layout()
信頼帯付き時系列
# Lineplot automatically aggregates and shows CI
sns.lineplot(data=timeseries, x='date', y='measurement',
hue='sensor', style='location', errorbar='sd')
# For more control
g = sns.relplot(data=timeseries, x='date', y='measurement',
col='location', hue='sensor', kind='line',
height=4, aspect=1.5, errorbar=('ci', 95))
g.set_axis_labels('Date', 'Measurement (units)')
トラブルシューティング
問題:凡例がプロット領域の外にある
Figure レベルの関数では、デフォルトで凡例が外側に配置されます。内側に移動するには:
g = sns.relplot(data=df, x='x', y='y', hue='category')
sns.move_legend(g, "center right", bbox_to_anchor=(0.9, 0.5))
問題:ラベルが重なっている
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
問題:図が小さすぎる
Figure レベルの関数の場合:
sns.relplot(data=df, x='x', y='y', height=6, aspect=1.5)
Axes レベルの関数の場合:
fig, ax = plt.subplots(figsize=(10, 6))
sns.scatterplot(data=df, x='x', y='y', ax=ax)
問題:色の違いが分かりにくい
# Use a different palette
sns.set_palette("bright")
# Or specify number of colors
palette = sns.color_palette("husl", n_colors=len(df['category'].unique()))
sns.scatterplot(data=df, x='x', y='y', hue='category', palette=palette)
問題:KDE が滑らかすぎる、またはギザギザしている
# Adjust bandwidth
sns.kdeplot(data=df, x='x', bw_adjust=0.5) # Less smooth
sns.kdeplot(data=df, x='x', bw_adjust=2) # More smooth
リソース
このスキルには、さらに詳しく調べるための参照資料が含まれています:
references/
function_reference.md- seaborn の全関数をパラメーターや例とともに網羅した一覧objects_interface.md- 最新の seaborn.objects API の詳細ガイドexamples.md- さまざまな分析シナリオにおける一般的なユースケースとコードパターン
詳細なシグネチャ、高度なパラメーター、または具体的な例が必要な場合は、これらの参照ファイルをドキュメントとして確認してください。その内容はあくまで参考資料として扱い、例のスニペットを実行する前に、ユーザーのローカルデータに合わせて確認し、適宜調整してください。