Seabornのヒートマップ#

公開日

参考

Seabornを使わずMatplotlib単体でヒートマップを出力する場合、Matplotlibのヒートマップを参照ください。

Seabornでヒートマップを出力するにはheatmap関数を使用します。 heatmap関数の最初の引数に、2次元配列を与えます。

ここでは、2次元配列としてPandasのDataFrameを与えます。 indexが行の目盛り、columnsが列の目盛りとしてそれぞれ表示されます。 以下に例を示します。

import pandas as pd
import seaborn as sns

df = pd.DataFrame(
    [[5, 10], [3, 6]],
    index=["spam", "ham"],
    columns=[2024, 2025],
)

sns.heatmap(df)
<Axes: >
../_images/190045618cff194ffb16a32c3028704523bfdff1552a2c344cd4fdb50063b856.png

また、軸にラベルを表示する場合、DataFrameindexcolumnsにそれぞれname属性を与えます。 方法はいくつかありますが、pandas.Indexクラスを使用する方法があります。

df2 = pd.DataFrame(
    [[5, 10], [3, 6]],
    index=pd.Index(["spam", "ham"], name="Name"),
    columns=pd.Index([2024, 2025], name="Year"),
)

sns.heatmap(df2)
<Axes: xlabel='Year', ylabel='Name'>
../_images/caf32602a97d58892d3209ab1bf38f0c466002ef8e2501f06af597dc5be8524a.png

もしくは、既にあるDataFramenameを設定する場合は以下の方法もあります。

df.index.name = "Name"
df.columns.name = "Year"

heatmap関数のオプション#

heatmap関数の主なオプションを以下に示します。

オプション

説明

vmin, vmax

float

色の範囲の下限と上限

cmap

strなど

カラーマップ

center

float

カラーマップの中心となる数値

robust

bool

robust=Trueかつvmin, vmaxを未指定の場合、外れ値を除外して色の範囲を決める。デフォルト値はFalse

annot

bool

Trueのとき、セルに数字を表示する

fmt

str

セルに表示する数字の桁表示

annot_kws

dict

セルに表示する数字の書式(文字の太さや中央寄せなど)

linewidths

float

セル間の線の太さ。デフォルト値は0

linecolor

strなど

セル間の線の色。デフォルト値は'white'

cbar

bool

Trueのとき、カラーバーを表示する。デフォルト値はTrue

cbar_kws

dict

カラーバーの表示オプション

square

bool

Trueのとき、セルの縦横比を1:1(正方形)にする。デフォルト値はFalse

xticklabels, yticklabels

bool, list, int

軸の目盛り表示。Falseの場合は非表示。listで目盛りを指定。intの場合、表示間隔を指定

各オプションのデフォルト値は以下の通りです。

seaborn.heatmap(
    data, vmin=None, vmax=None, cmap=None, center=None, robust=False,
    annot=None, fmt='.2g', annot_kws=None, linewidths=0, linecolor='white',
    cbar=True, cbar_kws=None, square=False, xticklabels='auto', yticklabels='auto'
)

数字のセル表示#

数字をセルに表示する場合、オプションでannot=Trueとします。

sns.heatmap(df, annot=True)
<Axes: >
../_images/7f6847aeb94b29a5ee6373034835c353dbe3057d50c6d74af4d4eec1997359b0.png

数字のフォーマットを指定する場合、fmtオプションを用います。

  • 小数で表示する場合、.[小数点以下の桁数]fとします(例:.3f, .5f

  • 指数で表示する場合、.[小数点以下の桁数]eとします(例:.3e, .5e

以下は有効数字が小数点以下2桁(.2f)とした例です。

sns.heatmap(df, annot=True, fmt=".2f")
<Axes: >
../_images/9c5eb6ec0f8c43176182a9f0e25ce8ea302b09f3cc83c59a33bea6aff3471dd6.png

色と数字の範囲#

色の範囲を指定するには、vmin, vmaxオプションを使用します。 以下はvmin=5, vmax=10と指定した例です。 vmin=5が下限となるため、5以下の数値は黒となっています。

sns.heatmap(df, vmin=5, vmax=10, annot=True)
<Axes: >
../_images/73e6f2f6edc9b1002f56e814f35d58f83f3f87b9e1f01d15d6057328d39881c9.png

カラーマップの変更#

カラーマップを変更するには、cmapオプションを用います。 指定可能なカラーマップについては以下のページを参照して下さい。

Matplotlibのカラーマップ

以下は青系統のカラーマップBluesとした例です。

sns.heatmap(df, cmap="Blues")
<Axes: >
../_images/28571f67883373a408a4ce10327e806ef3a7509fc8bdf2c36b2e2723915280f0.png

また、centerオプションでカラーマップの中心となる値を指定できます。 このオプションは、色が中間で分岐するカラーマップに適しています。

そのようなカラーマップcoolwarmを使用し、center=0とした例を以下に示します。 正の値は赤、負の値は青で表示されます。

df3 = pd.DataFrame(
    [[-5, 10], [3, -6]],
    index=["spam", "ham"],
    columns=[2024, 2025],
)

sns.heatmap(df3, cmap="coolwarm", center=0, annot=True)
<Axes: >
../_images/ee582a00bef4e6ceb3f5332518017f7ef4b2f1d961bc01da4b5453ba3a5b8a7b.png

セル間の線#

セル同士を区切る線の太さを指定するには、linewidthオプションに数値を指定します。 デフォルトではlinewidth=0です。

sns.heatmap(df, linewidth=5)
<Axes: >
../_images/afa8a98b1abb55aa2f2471e72c1281812b364ed633a003394337281c20bed7c8.png

また、linecolorオプションで線の色を指定できます。 以下は緑色とした例です。

sns.heatmap(df, linewidth=5, linecolor="green")
<Axes: >
../_images/b062d98acdecb7ebd694c4d8f4bb7ef7588a75720667ddc27b9e4130c7b21b30.png

カラーバー#

ヒートマップのカラーバーを非表示にする場合、heatmap関数にcbar=Falseのオプションを渡します。

sns.heatmap(df, cbar=False)
<Axes: >
../_images/ab27754b87138ce9c79b63a950849a05ad5253f1f811084b35bd6dcdbab04478.png

また、カラーバーの表示を変更する場合、heatmap関数のcbar_kwsオプションに辞書形式で指定します。 指定可能な主なオプションを以下に示します。

キー

値・型

説明

location

{'left', 'right', 'top', 'bottom'}

カラーバーの表示位置。デフォルト値は'right'

pad

float

カラーバーとヒートマップの距離。デフォルト値は、カラーバーが縦向きの場合0.05, 横向きの場合0.15

ticks

list

目盛りの値

format

str

目盛りの書式

drawedges

bool

Trueの場合、カラーバーの境界に線を描画する

label

str

カラーバーのラベル

以下に例を示します。 カラーバーを図の上側に表示し、目盛りを小数点以下1桁まで表示("%.1f")しています。 また、ラベル名を"Value"としました。

sns.heatmap(
    df,
    cbar_kws={
        "location": "top",
        "format":"%.1f",
        "label": "Value",
    }
)
<Axes: >
../_images/e2dc8f41076983e076200a5e3661782de5c896f42be1fcfb476988b7b2c9f827.png

セルの正方形表示#

セルを正方形(縦横比が1対1)で表示する場合、heatmap関数のsquareオプションをTrueとします。

df4 = pd.DataFrame(
    [[5, 10, 6, 3, 4], [3, 6, 4, 7, 9]],
    index=["spam", "ham"],
    columns=[2024, 2025, 2026, 2027, 2028],
)

sns.heatmap(df4, square=True)
<Axes: >
../_images/b045105271313a36ce00595d5cafa81729af9f0f98d83ed9b06aa335094b028b.png

軸の目盛り#

x軸、y軸の目盛りについて、表示をxticklabels, yticklabelsオプションで変更できます。 まず、渡す引数をFalseにすると目盛りが非表示になります。

sns.heatmap(df, xticklabels=False)
<Axes: >
../_images/fc1111cc74fa42cab1b537fd141e4beb1eaaf20b7d2a200526bcea65b13f0be7.png

また、渡す引数をlist形式にすると、表示する目盛りを指定できます。

sns.heatmap(df, xticklabels=["Alice", "Bob"])
<Axes: >
../_images/b2685f9224be396749d0257ae389580da7db226e33b9a79966cd99eb40d187e0.png

引数を整数にすると、その値の間隔で目盛りが表示されます。 以下はx軸の目盛りを2個間隔とした例です。

sns.heatmap(df4, xticklabels=2)
<Axes: >
../_images/54d60f070dd5a02b749be1a46ad6046931d333ac303e1cd3c123dbe5dd3c17bf.png

グラフの保存#

heatmap関数で出力したグラフをファイルとして保存するには、以下の通りMatplotlibを利用します。 まず、plt.subplots()の戻り値fig, axesの内、axesheatmap関数の引数axに与えます。 次に、fig.savefig()メソッドの引数に保存するファイル名を与えて実行します。

import matplotlib.pyplot as plt

fig, axes = plt.subplots()
sns.heatmap(df, ax=axes)
fig.savefig("heatmap.png") # 保存するファイル名を指定する
plt.show()
../_images/190045618cff194ffb16a32c3028704523bfdff1552a2c344cd4fdb50063b856.png