Seaborn ヒートマップ:Pythonでヒートマップを作成する完全ガイド
Updated on
数十の変数を持つデータセットがあるとします。どの特徴が相関しているか、パターンがどこに隠れているか、または機械学習モデルがなぜ誤動作し続けるのかを理解する必要があります。数字の行と列を見つめても、ほとんど何も分かりません。これがまさに seaborn ヒートマップ が解決する問題です。密な値の行列を、脳が数秒で解析できる色分けされたグリッドに変換します。
ヒートマップはデータサイエンスで最も広く使用される可視化タイプの1つであり、Pythonのseabornライブラリはそれらを作成することを非常に簡単にします。相関行列の構築、混同行列の分析、時系列パターンの可視化のいずれであっても、sns.heatmap()は数行のコードで公開可能なチャートを提供します。
このガイドでは、基本的な構文、カスタマイズオプション、クラスター化されたヒートマップなどの高度な技術、完全なパラメータ参照表まで、すべてを説明します。すべてのコード例はコピー&ペーストですぐに使用できます。
基本的なSeabornヒートマップの構文
コア関数は sns.heatmap() です。これは2次元データセット(通常はpandas DataFrameまたはNumPy配列)を受け取り、色付きグリッドとしてレンダリングします。
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# Create sample data
data = np.random.rand(5, 7)
ax = sns.heatmap(data)
plt.title("Basic Seaborn Heatmap")
plt.show()これが最も単純なヒートマップです。各セルの色はその数値を表し、seabornは右側に自動的にカラーバーを追加します。しかし、実際の使用では、ほとんどの場合、より多くの設定が必要になります。次にそれについて説明します。
相関行列ヒートマップの作成
seabornヒートマップの最も一般的な使用例は、相関行列 の可視化です。これは、データセット内の各変数のペアがどれだけ強く関連しているかを示します。
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# Load a built-in dataset
df = sns.load_dataset("mpg").select_dtypes(include="number")
# Compute the correlation matrix
corr = df.corr()
# Plot the heatmap
plt.figure(figsize=(10, 8))
sns.heatmap(
corr,
annot=True,
fmt=".2f",
cmap="coolwarm",
center=0,
square=True,
linewidths=0.5
)
plt.title("Correlation Matrix - MPG Dataset")
plt.tight_layout()
plt.show()ここで起こっている重要なこと:
annot=Trueは各セル内に相関係数を印刷します。fmt=".2f"はこれらの数値を小数点以下2桁にフォーマットします。cmap="coolwarm"は発散カラーパレットを使用し、負の相関は青、正の相関は赤になります。center=0はゼロ相関が中立の中点色にマッピングされることを保証します。square=Trueは各セルを完全な正方形にして、よりクリーンなビジュアルを実現します。
カスタマイズオプション
カラーパレット(cmapパラメータ)
cmap パラメータは配色を制御します。適切なパレットの選択は、データタイプによって異なります。
| パレットタイプ | 例の名前 | 最適な用途 |
|---|---|---|
| 順次型 | "YlOrRd"、"Blues"、"viridis" | 低から高までのデータ(カウント、マグニチュード) |
| 発散型 | "coolwarm"、"RdBu_r"、"seismic" | 意味のある中心点を持つデータ(相関、残差) |
| 質的 | "Set2"、"Paired" | カテゴリカルデータ(ヒートマップでは一般的ではない) |
| 知覚的に均一 | "viridis"、"magma"、"inferno" | アクセシビリティと正確な知覚の確保 |
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
data = np.random.rand(6, 6)
fig, axes = plt.subplots(1, 3, figsize=(18, 5))
cmaps = ["viridis", "coolwarm", "YlOrRd"]
for ax, cmap in zip(axes, cmaps):
sns.heatmap(data, cmap=cmap, ax=ax, annot=True, fmt=".2f")
ax.set_title(f'cmap="{cmap}"')
plt.tight_layout()
plt.show()アノテーション(annotとfmtパラメータ)
アノテーションは各セル内に数値を表示します。そのフォーマットを制御できます:
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
data = np.random.randint(0, 1000, size=(4, 5))
plt.figure(figsize=(8, 5))
sns.heatmap(
data,
annot=True,
fmt="d", # integer format
cmap="Blues",
annot_kws={"size": 14, "weight": "bold"} # customize font
)
plt.title("Heatmap with Integer Annotations")
plt.show()一般的な fmt の値:".2f" は小数点以下2桁、"d" は整数、".1%" はパーセンテージ、".1e" は科学的記数法。
図のサイズとアスペクト比
Seabornヒートマップはmatplotlibの図からサイズを継承します。sns.heatmap() を呼び出す前に設定します:
plt.figure(figsize=(12, 8)) # width=12, height=8 inches
sns.heatmap(data, cmap="viridis")
plt.show()正方形のセルの場合、sns.heatmap() に square=True を渡します。これにより、図のアスペクト比が上書きされ、各セルが等しいサイズになります。
上三角または下三角のマスキング
相関行列は対称です。両方の半分を表示することは冗長です。NumPyの triu または tril を使用して半分をマスクします:
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
df = sns.load_dataset("mpg").select_dtypes(include="number")
corr = df.corr()
# Create a mask for the upper triangle
mask = np.triu(np.ones_like(corr, dtype=bool))
plt.figure(figsize=(10, 8))
sns.heatmap(
corr,
mask=mask,
annot=True,
fmt=".2f",
cmap="coolwarm",
center=0,
square=True,
linewidths=0.5
)
plt.title("Lower Triangle Correlation Heatmap")
plt.tight_layout()
plt.show()mask パラメータは、データと同じ形状のブール配列を受け入れます。mask=True のセルは非表示になります。
ヒートマップパラメータ参照表
| パラメータ | 説明 | デフォルト |
|---|---|---|
data | 2次元データセット(DataFrame、ndarray) | 必須 |
vmin / vmax | カラーマップスケーリングの最小値/最大値 | データから自動 |
cmap | カラーマップ名またはオブジェクト | None(seabornのデフォルト) |
center | カラーマップを中心にする値 | None |
annot | セルに数値を表示 | False |
fmt | アノテーションのフォーマット文字列 | ".2g" |
annot_kws | アノテーションテキストのキーワード引数の辞書 | {} |
linewidths | セルを分離する線の幅 | 0 |
linecolor | セル境界線の色 | "white" |
cbar | カラーバーを表示 | True |
cbar_kws | カラーバーのキーワード引数の辞書 | {} |
square | セルを正方形に強制 | False |
mask | ブール配列;Trueのセルは表示されない | None |
xticklabels | x軸目盛りのラベル | 自動 |
yticklabels | y軸目盛りのラベル | 自動 |
ax | 描画するMatplotlib Axesオブジェクト | 現在のAxes |
高度な例
sns.clustermapを使用したクラスタリングヒートマップ
類似した行と列をグループ化したい場合、sns.clustermap() は階層的クラスタリングを適用し、軸を自動的に並べ替えます:
import seaborn as sns
import matplotlib.pyplot as plt
df = sns.load_dataset("mpg").select_dtypes(include="number").dropna()
corr = df.corr()
g = sns.clustermap(
corr,
annot=True,
fmt=".2f",
cmap="vlag",
center=0,
linewidths=0.5,
figsize=(8, 8),
dendrogram_ratio=0.15
)
g.ax_heatmap.set_title("Clustered Correlation Heatmap", pad=60)
plt.show()左側と上部のデンドログラムは、クラスタリング階層を示します。最も密接に相関している変数は互いに隣接して配置され、パターンを見つけやすくなります。
カスタムカラー範囲(vmin、vmax)
デフォルトでは、seabornはデータの最小値と最大値に色をスケーリングします。これを上書きして、複数のヒートマップを同じスケールで比較したり、特定の範囲を強調表示したりできます:
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
data = np.random.uniform(-1, 1, size=(8, 8))
plt.figure(figsize=(8, 6))
sns.heatmap(
data,
vmin=-1,
vmax=1,
center=0,
cmap="RdBu_r",
annot=True,
fmt=".2f"
)
plt.title("Heatmap with Fixed Color Range (-1 to 1)")
plt.show()相関行列または理論的範囲がわかっている正規化データをプロットする場合、vmin=-1 と vmax=1 を設定すると特に便利です。
混同行列ヒートマップ
もう1つの実用的なアプリケーションは、分類モデルからの混同行列の可視化です:
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics import confusion_matrix
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
# Train a quick model
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
iris.data, iris.target, test_size=0.3, random_state=42
)
clf = RandomForestClassifier(random_state=42)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
# Build and plot the confusion matrix
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(7, 5))
sns.heatmap(
cm,
annot=True,
fmt="d",
cmap="Blues",
xticklabels=iris.target_names,
yticklabels=iris.target_names
)
plt.xlabel("Predicted")
plt.ylabel("Actual")
plt.title("Confusion Matrix - Iris Classification")
plt.tight_layout()
plt.show()対角線は正しい予測を示します。非対角セルは、モデルが1つのクラスを別のクラスと混同する場所を明らかにします。
時系列ヒートマップ
ヒートマップは、時間次元全体でパターンを見つけるのにも適しています。曜日と時間ごとのアクティビティを示す例を次に示します:
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
np.random.seed(0)
hours = list(range(24))
days = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
data = pd.DataFrame(
np.random.poisson(lam=20, size=(7, 24)),
index=days,
columns=hours
)
plt.figure(figsize=(14, 5))
sns.heatmap(data, cmap="YlOrRd", linewidths=0.3, annot=False)
plt.xlabel("Hour of Day")
plt.ylabel("Day of Week")
plt.title("Activity Heatmap by Day and Hour")
plt.tight_layout()
plt.show()Seabornヒートマップ vs Matplotlib imshow
matplotlib.pyplot.imshow() でもヒートマップのような可視化を作成できます。2つの比較は次のとおりです:
| 機能 | sns.heatmap() | plt.imshow() |
|---|---|---|
| 組み込みカラーバー | はい、自動 | 手動(plt.colorbar()) |
| セルアノテーション | annot=True | 手動テキスト配置 |
| DataFrameを受け入れる | はい、自動ラベル付き | いいえ、配列が必要 |
| 目盛りラベル処理 | DataFrameインデックス/列から自動 | 手動セットアップ |
| マスキングサポート | 組み込み mask パラメータ | np.ma で手動 |
| クラスタリング | sns.clustermap() 経由 | 組み込みではない |
| セル間隔 | linewidths パラメータ | 直接サポートされていない |
| 学習曲線 | 一般的なユースケースでは低い | より低レベル、より手動 |
| カスタマイズの上限 | 高い(matplotlibを継承) | 非常に高い(完全な制御) |
**結論:**最小限のコードできれいでラベル付けされたヒートマップが必要な場合は、sns.heatmap() を使用してください。ピクセルレベルの制御が必要な場合、または表形式データではなく画像データを扱っている場合は、imshow() にフォールバックしてください。
インタラクティブな代替手段:PyGWalker
静的ヒートマップはレポートや論文には強力ですが、探索的データ分析中は、コードを書き直さずにデータを操作(フィルタリング、ピボット、ドリルダウン、チャートタイプの切り替え)したいことがよくあります。
PyGWalker (opens in a new tab)(Graphic WalkerのPythonバインディング)は、任意のpandas DataFrameをJupyter Notebook内のTableauのようなインタラクティブUIに直接変換します。可視化コードをまったく書かずに、フィールドをドラッグアンドドロップしてヒートマップ、散布図、棒グラフなどを作成できます。
pip install pygwalkerimport pandas as pd
import pygwalker as pyg
df = pd.read_csv("your_data.csv")
walker = pyg.walk(df)インタラクティブインターフェイスが起動すると、次のことができます:
- カテゴリカル変数を行にドラッグし、別の変数を列にドラッグし、メジャーを色にドラッグしてヒートマップを作成します。
- 他のチャートタイプ(棒グラフ、折れ線グラフ、散布図)に即座に切り替えます。
- 追加のコードを書かずにフィルタリングと集計を行います。
これは、最終的なseabornヒートマップに含める変数をまだ探索している場合に特に便利です。探索段階ではPyGWalkerを使用し、共有用に sns.heatmap() で最終的な静的可視化をロックします。
よくある質問
seabornヒートマップのサイズを変更するにはどうすればよいですか?
sns.heatmap() を呼び出す前に、plt.figure(figsize=(width, height)) を使用して図のサイズを設定します。たとえば、plt.figure(figsize=(12, 8)) は12×8インチの図を作成します。サブプロットを使用している場合は、ax パラメータを渡すこともできます。
seabornヒートマップに値を注釈するにはどうすればよいですか?
sns.heatmap() に annot=True を渡します。fmt パラメータで数値フォーマットを制御します(例:fmt=".2f" は小数点以下2桁)。annot_kws を使用してフォントプロパティをカスタマイズします。例:annot_kws={"size": 12, "weight": "bold"}。
sns.heatmapとsns.clustermapの違いは何ですか?
sns.heatmap() は元の行と列の順序でデータを表示します。sns.clustermap() は階層的クラスタリングを適用して行と列を並べ替え、類似した値をグループ化し、デンドログラムを追加してクラスタリング構造を示します。
相関ヒートマップの半分をマスクするにはどうすればよいですか?
NumPyを使用してブールマスクを作成します。上三角の場合:mask = np.triu(np.ones_like(corr, dtype=bool))。次に、sns.heatmap() に mask=mask を渡します。下三角の場合は、代わりに np.tril() を使用します。
seabornヒートマップを画像ファイルとして保存できますか?
はい。ヒートマップを作成した後、plt.show() の前に plt.savefig("heatmap.png", dpi=300, bbox_inches="tight") を呼び出します。Seabornヒートマップは、PNG、SVG、PDF、EPSを含むすべてのmatplotlib出力フォーマットをサポートしています。
結論
seabornヒートマップは、データサイエンティストの可視化ツールキットで最も汎用性の高いツールの1つです。相関分析から混同行列、時系列パターン検出まで、sns.heatmap() はこれらすべてをクリーンな構文と公開品質の出力で処理します。
基本から始めます。データを渡してカラーマップを選択します。次に、分析の要求に応じて、アノテーション、マスキング、カスタム範囲、クラスタリングをレイヤー化します。最終的な可視化をロックする前の探索段階では、PyGWalker (opens in a new tab) のようなツールを使用すると、インタラクティブなドラッグアンドドロップチャートでワークフローを高速化できます。
このガイドのコード例はすべてコピー&ペーストですぐに使用できます。ユースケースに最も近いものを選択し、データを入れ替えると、1分以内に明確で有益なヒートマップが得られます。