【Python】seabornのヒートマップで特定の値だけ別の色にプロットする方法

seaborn

Pythonでヒートマップを作成する時にはseabornを使用することが多いでしょう。
ヒートマップを作成する時に特定の値だけ別の色で指定したいことってありませんか?

例えばデータの0だけ黒く塗り潰してわかりやすくしたいなどです。
幅が0から30などでしたらわざわざ黒く塗りつぶさなくてもどのマスが0なのか判別できますが、
幅が10000とかあると0と10などは同じ色になって判別できなくなります。

今回はそんな時に便利な特定の値だけ別の色で表示する方法を紹介します!!

とりあえず方法だけ見たい人は目次で「指定の数値を別の色でプロットする」まで飛んでください。

[スポンサーリンク]


普通にプロットした場合

例えば以下のような3行3列のDataがあるとしましょう。

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt

df =pd.DataFrame([[10000,10,0],[10,0,1000],[0,10,1]],index=["A","B","C"],columns=["a","b","c"])
print(df)

#print表示
#      a b  c
#A 10000  10  0
#B        10  0  1000
#C         0  10  1

これを以下のコードを追加してヒートマップにするとこう表示されます。

fig = plt.figure()
sns.heatmap(df, linewidths = 1,cmap = "jet")
plt.show()

普通にヒートマップとして表示したいなら別にこれでいいんですけど、
例えばヒートマップ上で0の場合はぱっと見でわかりやすくしたいとしたらどうでしょう。

0と1,10あたりは同じ暗い青色になってしまっているのでどれが0かわかりません。

 

指定の数値を別の色でプロットする

指定の数値だけ別の色でプロットする時に使うのがmask機能です!

具体的に普通のプロットと違う部分の流れとしては

①指定の数値がTrueのdf_maskを作成、今回は0の場合がTrue(df = (df == 0))
②普通にヒートマップ作成(カラーバー表示なし:cbar = False)
③別の色(今回はjet)でヒートマップ作成(maskをdf_maskで指定:mask = df_mask)

という感じです。
②のプロットでは普通にプロット、③のプロットではmaskがFalseの所だけ色が上書きされます。
そのためmaskがTrueの指定の値のマスは②の色が残ります。
このようにして特定の値とそれ以外で色の差別化が行えるのです。

注意点は②と③のプロット色を違うようにすることですね。
同じだと判別できないので意味ありません。

では文字だけではわかりずらいので実際に例を見てみましょう!
使用するデータは先ほどの3行3列のdfで0の時だけ黒塗りにしてみます。

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt

#df作成
df =pd.DataFrame([[10000,10,0],[10,0,1000],[0,10,1]],index=["A","B","C"],columns=["a","b","c"])
print(df)

#dfの内容
#      a  b  c
#A 10000  10 0
#B    10  0  1000
#C     0  10 1

#①マスクを作成する(0はTrue)
df_mask = (df == 0)
print(df_mask)

#df_maskの内容
#     a   b     c
#A False False True
#B False True False
#C True False False

#ヒートマップ作製
fig = plt.figure()

#②普通にプロット(カラーバーなし)
sns.heatmap(df, linewidths = 1 , cbar = False)

#③別の色でプロット(マスク適用)
sns.heatmap(df, linewidths = 1,cmap = "jet", mask = df_mask)
plt.show()

実際に0の部分だけ黒塗りで表示されました!!
これで0のマスがわかりやすくなったでしょう!!

[スポンサーリンク]


コメント

タイトルとURLをコピーしました