ヒートマップは二次元配列を分かりやすく可視化する方法で、データの全体像を素早く把握することができます。Pythonではseabornを用いてヒートマップが描画されることが多いので、ここではその方法を解説します。
開発環境
- matplotlib 3.4.2
- Python 3.7.11
- seaborn 0.11.2

ヒートマップとは
二次元データを、その値によって色分けすることで一目で見てわかるようにしたグラフをヒートマップといいます。例えば以下のような二次元データをヒートマップで表してみましょう。


その値によって色分けすることで、データが視覚的に分かりやすくなっていることが分かります。
Pythonでヒートマップを作成する方法
matplotlibを使う方法
matplotlibではmatshow関数を用いることで二次元リストを可視化することができます。ただし、この関数はあくまでもimshow関数を拡張したものであり、ヒートマップを描くというよりは単に二次元配列で与えられたデータを可視化するに主眼が置かれています。そのため、例えば軸のラベルを設定したりなどグラフとしての基本的な設定を行うことが簡単にはできないというデメリットがあります。
seabornを使う方法
seabornのheatmap関数を使えば非常に簡単にヒートマップを作成することができ、デザインの調整なども行えます。そのため、Pythonでヒートマップを作成するにはmatplotlibのラッパーであるseabornを使う方法が一般的となっています。
ここでは、seabornを用いてヒートマップを作成する方法を見ていきましょう。
seabornでヒートマップを作成する
以下のようにheatmap関数の第1引数(data)に二次元配列(numpy.ndarrayやpandas.DataFrameなど)を指定するだけでヒートマップを作成することができます。
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# 乱数の発生
generator = np.random.default_rng(100)
rnd = generator.normal(size=(10,10))
# ヒートマップの作成
sns.heatmap(rnd)
plt.show()

特にパラメーターを指定しないデフォルトのヒートマップでもカラーバーまで付属していて、必要にして十分なものであることが分かります。なお、data引数にDataFrameを指定した場合は、その行ラベル・列ラベルがそのままヒートマップの軸ラベルとなります。
ヒートマップの調整をする
heatmap関数の引数に各種パラメーターを指定することでスタイルの調整ができます。
数値をヒートマップに書き込む
heatmap関数のannot引数をTrueに設定することで、ヒートマップの中に値を書き込むことができます。
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# 乱数の発生
generator = np.random.default_rng(100)
rnd = generator.normal(size=(10,10))
# ヒートマップの作成
sns.heatmap(rnd, annot=True)
plt.show()

ヒートマップの色分けによって全体のイメージを素早くつかむことができますが、細かいところまで見ていくには具体的な数値が必要になります。上記のようにヒートマップに数値を書き込むことでそれも表現できるようになり有用です。
カラーマップを変更する
heatmap関数のcmap引数にカラーマップ名を文字列として指定することで、そのカラーマップに変更することができます。matplotlibに組み込まれているカラーマップは次のようなものがあります。
ここでは例としてカラーマップをcoolwarmに変更してみましょう。
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# 乱数の発生
generator = np.random.default_rng(100)
rnd = generator.normal(size=(10,10))
# ヒートマップの作成
sns.heatmap(rnd, cmap='coolwarm')
plt.show()

なお、カラーマップ名の最後に’_r’をつけるとカラーマップが反対になります。例えば上記の例では、
sns.heatmap(rnd, cmap='coolwarm_r')

となります。
カラーバーの範囲を指定する
heatmap関数のvmin, vmax引数を指定することでカラーバーの範囲の最小値・最大値を指定することができます。それでは、カラーバーを-5~5の範囲としてみましょう。
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# 乱数の発生
generator = np.random.default_rng(100)
rnd = generator.normal(size=(10,10))
# ヒートマップの作成
sns.heatmap(rnd, vmin=-5, vmax=5)
plt.show()

ヒートマップの各セルの間隔をあける
heatmap関数のlinewidths引数でセル同士の間隔を指定することができます。
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# 乱数の発生
generator = np.random.default_rng(100)
rnd = generator.normal(size=(10,10))
# ヒートマップの作成
sns.heatmap(rnd, linewidths=0.5)
plt.show()

ヒートマップをmatplotlibのオブジェクトとして扱う
heatmap関数を実行するとヒートマップを表すAxesSubplotオブジェクトが返され、これはAxesオブジェクトと同様に扱うことができます。
例えばヒートマップにタイトルを表示させる場合は、Axesクラスのset_titleメソッドを用いて次のようにします。
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# 乱数の発生
generator = np.random.default_rng(100)
rnd = generator.normal(size=(10,10))
# ヒートマップの作成
ax = sns.heatmap(rnd)
ax.set_title('Sample Heatmap')
plt.show()

また複数のグラフが配置してある場合は、heatmap関数のax引数でどのAxesにヒートマップを描画するのかを指定することも可能です。
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# 乱数の発生
generator = np.random.default_rng(100)
rnd = generator.normal(size=(10,10))
# ヒートマップの作成
fig, ax = plt.subplots(2,2)
sns.heatmap(rnd, ax=ax[0,0])
plt.show()

コメント