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/ee5014f0e983663f611adeed041bfe44408219080fda9043f7bdc4520d801263.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/40dc28395d8315cd7e52a7d34d2ea7460949fc871ee9b07089c4b9b0e876d860.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/f1826e78237d10bfa9b2c8ffcbdd1432daefe256a2ea4480bfccafe9e9cc9f32.png

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

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

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

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

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

色と数字の範囲#

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

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

カラーマップの変更#

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

Matplotlibのカラーマップ

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

sns.heatmap(df, cmap="Blues")
<Axes: >
../_images/2796f7bd44e5b63d0efbdc20072cb736e58df16aeec1d210a185ba55420579a7.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/995e63b7c5a833127fa9e1b579ebe6ddce516d1ed32c0472455a5b3480198b13.png

セル間の線#

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

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

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

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

カラーバー#

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

sns.heatmap(df, cbar=False)
<Axes: >
../_images/9da73fdafaaa18edb43073c93dd5d330ad6f5dc94a897cf3220f8d0b93d17e0c.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/a20018c355ae185766699f857e00e7d5c0d1de6c0280a64985408f8f1f362a76.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/3168eed35a3df6e31b6602e679a56eb19d00f6c022d10f51ff0f097fbe37a5d0.png

軸の目盛り#

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

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

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

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

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

sns.heatmap(df4, xticklabels=2)
<Axes: >
../_images/e5f1a8d4de5f9bed0ac0d34ab16cb6289f81b362018b621c427f87fcf5be7b6b.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/ee5014f0e983663f611adeed041bfe44408219080fda9043f7bdc4520d801263.png