Python と matploblib によるデータ可視化についてはすでに pandas + matplotlib による多彩なデータプロッティングや pandas を利用してデータセットの可視化を素早く試行する、 matplotlib (+ pandas) によるデータ可視化の方法などでさまざまな方法を説明してきました。
今回はヒートマップを描くわけですが、その前にあらためで可視化の方法についておさらいしましょう。
配列からのデータ可視化方法のまとめ
ここでのデータ可視化とは配列からなるポピュラーな図示をさしています。配列とは、複数の属性値を持ち、 1 つのデータが 1 つの行で表されるデータの形式です。 いろいろなバリエーションがありますが、主軸となる代表的な可視化方法をまとめます。
棒グラフ (bar)
データの大きさの比較に適したグラフです。縦や横に描画する方法、積み上げる方法、複数の系列を並べる方法といったバリエーションがあります。
折れ線グラフ (line)
matplotlib で plot 関数を利用したときの既定値です。データは点と点を結ぶ線で描かれ、ひとつの系列が一本の線になります。特に時間の経過にともなうデータの変化を可視化するのに最適な表現方法です。
面グラフ (area)
エリアチャートとも言います。これも折れ線グラフと同じく時系列のデータの変化を追いやすいですが、データの割合や総計の変化を追うのに特に向いています。
散布図 (scatter)
2 つのデータ系列の相関を見るときに適した可視化方法です。 X と Y 軸の関係性をデータ点の位置で図示します。関係が明らかな場合、わざわざ計算するまでもなくひと目で相関関係が把握できることもあります。
ヒートマップを描く
ヒートマップは度数を色の主に濃淡などで示し、どの位置でデータが多いかといったことを可視化することができます。地理情報のどの場所で人が多いあるいは気温が高い、ウェブサイトのどの場所がアクセスやクリック数が多い、といったことを可視化することができます。
多次元配列からヒートマップを描く
matplotlib の pcolor 関数でヒートマップが使えます。以下のメソッドは n x m 行列と X および Y 軸のラベルを行列で渡すことにより、シンプルなヒートマップを描きます。
# 正方行列と X および Y のラベルの行列を渡す
def draw_heatmap(data, row_labels, column_labels):
# 描画する
fig, ax = plt.subplots()
heatmap = ax.pcolor(data, cmap=plt.cm.Blues)
ax.set_xticks(np.arange(data.shape[0]) + 0.5, minor=False)
ax.set_yticks(np.arange(data.shape[1]) + 0.5, minor=False)
ax.invert_yaxis()
ax.xaxis.tick_top()
ax.set_xticklabels(row_labels, minor=False)
ax.set_yticklabels(column_labels, minor=False)
plt.show()
plt.savefig('image.png')
return heatmap
30 x 30 の 900 個のデータを乱数生成してみました。次のように描画されます。
値の高低によって色の濃淡が決定しています。
ヒストグラムを使う
次に NumPy の histgram2d を利用します。
x と y にそれぞれ数百の適当な数の配列を渡すと画像の対応する点に着色されます。
def draw_heatmap(x, y):
heatmap, xedges, yedges = np.histogram2d(x, y, bins=50)
extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]
plt.figure()
plt.imshow(heatmap, extent=extent)
plt.show()
plt.savefig('image.png')
以下の図は X と Y にそれぞれ 500 個ほど正規分布の乱数を生成し描画した例です。
まとめ
ヒートマップは 2 次元の空間に色という次元を加えてデータの可視化をおこないます。これも応用次第では強力な可視化方法として活用することができます。