蛇使いな彼女BLOG
【第35回】 グラフ描画編③ーSeabornを使った可視化(heatmap)
2021.05.21
こんにちは、今日の話題はSeabornのグラフについてです。
Matplotlibの構文がある程度分かっていればSeabornのグラフも同じ要領で作成できます。
今日はSeabornのheatmapについてザックリ説明しつつ、特に躓きやすい(?)時系列データの軸ラベルの表示の調整方法をメインにお話します。
また、データの可視化について、中級以上の内容を知っている方向けに、関連情報としてカラーバーの設置位置の調整に関するリンクを張っているので興味がある人はそちらのチェックをお願いします。
モトハシが躓いた箇所でもあるので、もしかすると参考になるかもしれません…。
■Seabornの特徴
モトハシが考えるSeabornの特徴は、
●pandasとデータのやり取りができる分簡単に可視化できる!
が、デフォルトの見た目から自分で調整したい場合はMatplotlibの構文が必要になる点がネック。
●統計データの可視化に向いていて、グラフの見た目が美しい
■Seaborn.heatmapによる可視化
私の中ではheatmapが最もよく使うSeabornの可視化ツールです。
ヒートマップとはいわゆるコンター図ですが、Matplotlibのimshow、pcolor、pcolormeshもこれと似たコンター図を描画する事ができ、色や高等線によって密度や高度などを持つ3次元データを2次元で表すことができる便利な機能もあります。
私の知るところ、同じコンター図でもどの可視化ツールを使うかによって指定できるパラメータの種類や構文の書き方も変わってくる面があるので一概に言えませんが、今日はSeaborn.heatmapグラフの軸目盛の調整をメインに説明します。
…さて、まずはこちらをインストールしてください。
import seaborn as sns
(インストール後に警告のようなものが出てくる場合もありますが、動作に問題はありません。)
Seabornのグラフは見た目が美しいと言われますが、ハッキリ言ってデフォルトの軸の見た目はちょっと難ありです(笑)
現にモトハシ自身時系列データの日付(x軸)に対する調整にはこれまでかなりの時間を費やしました。
まずは以下の簡単なコードでグラフを作ってみます。
※データは前回と同じく、S湖の水温データを使用
シンプルな描画コード
df=pd.DataFrame(temp[:,1:])
df.columns=date
fig,ax=plt.subplots(figsize=(8, 5))
sns.heatmap(df,ax=ax,cmap='jet',vmin=0,vmax=30)
plt.show()
sns.heatmap(df,ax=ax,cmap='jet',vmin=0,vmax=30)
パラメータの意味ですが、左からデータ、座標軸、カラーマップの色、カラーマップ上での最小値、最大値を指定しています。
軸に対してパラメータの指定はしていないのでこれがデフォルトです。
y軸は回転している上にx軸が詳しすぎて気持ち悪いですね(笑)
早速y軸、x軸を見やすく調整したいのですが、
Seabornを使って時間を含むデータを描画した場合、詳しい理由は分かりませんがset_major_locator(mdates.DayLocator())、
set_major_formatter(mdates.DateFormatter()) など一部のツールを使った軸の調整が効かない事があります。(下図↓のように空白になります。)
(上のグラフ、heatmapのx軸の主目盛ラベルを見るとMatplotlibとSeabornでは時間データの表示形式が異なるようにも見えますがこれも何か関係があるのでしょうか??)
ではどうすればいいかというと、モトハシ流の書き方で申し訳ないのですが…
x軸、y軸の調整に有効なコード
df=pd.DataFrame(temp[:,1:])
df.columns=date
fig,ax=plt.subplots(figsize=(8, 5))
sns.heatmap(df,ax=ax,cmap='jet',vmin=0,vmax=30)
# (1)と(3)、もしくは (2)と(3) の組み合わせで指定可能
# set_major_locaterで目盛位置を指定
(1) ax.xaxis.set_major_locator(ticker.LinearLocator(numticks=5))
# 又はxticksで目盛位置を指定
(2) ax.set_xticks(np.linspace(1,len(df.columns),5, endpoint=True))
# (1)または(2)で決定した目盛位置にラベルを付与
(3) ax.set_xticklabels([dt.datetime.strftime(d,"%m/%d") for d in df.columns][::48],
rotation=0) # [::48]= len(df.columns) //5
# y軸の目盛数を5に
# y軸目盛ラベルを水平に回転
ax.yaxis.set_major_locator(ticker.LinearLocator(numticks=5))
ax.tick_params(axis='y',rotation=0)
plt.show()
↓
こうすれば軸がスッキリして見やすくできます!
注意点としては、目盛位置とラベル名のリストを自分ですり合わせる作業が必要になることです。
(やっぱりデータ数の問題でx軸ラベルの”05/26”は飛んでますね…)
このようにグラフの種類とツールで相性的なものがあるのも分かりましたが、それ以上にMatplotlib、Seabornに共通しているfigure/axesという構造や、これらのオブジェクト指向な書き方で柔軟に軸の設定や配置設定、更には細かな見た目の調整ができるという事が重要なので、この2点だけ抑えてくれればモトハシは満足です(‘ω’)
オマケといってはなんですが、最後にヒートマップの右横にくっ付いているカラーバーの位置調整に関する情報をリンクで掲載しておきます。
カラーバーはheatmap以外にも散布図等に設置することが可能で、図をカラフルに見やすくできるのが魅力ですが、配置場所を指定するのには少しコツが要ります。
私を含め、悩まされている人が多いかとかと思うので…}
■ cbar(カラーバー) の調整
☆ヒートマップのサイズに合わせてカラーバーの位置を調整する方法
公式ガイド:
https://matplotlib.org/3.1.1/gallery/axes_grid1/demo_colorbar_with_axes_divider.html
☆自由な位置にカラーバーを設置する方法
参考元:『サボテンパイソン』様>https://sabopy.com/py/matplotlib-79/#toc9
長くなりましたが以上です♬
[参考書籍]
※Pythonデータサイエンスハンドブック―Jupyter,Numpy,pandas,Matplotlib,scikit-learnを使ったデータ分析、機械学習 /
(株)オーム社