SeabornをPythonで使用してヒートマップを作成します。渡された値でセルに注釈を付けることができますが、セルの意味を示す注釈を追加したいと思います。たとえば、単に_0.000000
_を表示する代わりに、対応するラベル、たとえば「Foo」または0.000000 (Foo)
を表示したいと思います。
ヒートマップ関数の Seabornドキュメンテーション は、ここで重要だと思われるパラメーターを使用して、少し暗号化されています:
_annot_kws : dict of key, value mappings, optional
Keyword arguments for ax.text when annot is True.
_
_annot_kws
_を値へのエイリアスの辞書、つまり_{'Foo' : -0.231049060187, 'Bar' : 0.000000}
_などに設定しようとしましたが、AttributeErrorが発生しています。
これが私のコードです(再現性のためにここでデータ配列を手動で作成しました):
_data = np.array([[0.000000,0.000000],[-0.231049,0.000000],[-0.231049,0.000000]])
axs = sns.heatmap(data, vmin=-0.231049, vmax=0, annot=True, fmt='f', linewidths=0.25)
_
_annot_kws
_パラメーターを使用しない場合の(動作する)出力は次のとおりです。
そして、ここでIdoが_annot_kws
_パラメーターを含む場合のスタックトレース:
_---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-57-38f91f1bb4b8> in <module>()
12
13
---> 14 axs = sns.heatmap(data, vmin=min(uv), vmax=max(uv), annot=True, annot_kws=kws, linewidths=0.25)
15 concepts
/opt/anaconda/2.3.0/lib/python2.7/site-packages/seaborn/matrix.pyc in heatmap(data, vmin, vmax, cmap, center, robust, annot, fmt, annot_kws, linewidths, linecolor, cbar, cbar_kws, cbar_ax, square, ax, xticklabels, yticklabels, mask, **kwargs)
272 if square:
273 ax.set_aspect("equal")
--> 274 plotter.plot(ax, cbar_ax, kwargs)
275 return ax
276
/opt/anaconda/2.3.0/lib/python2.7/site-packages/seaborn/matrix.pyc in plot(self, ax, cax, kws)
170 # Annotate the cells with the formatted values
171 if self.annot:
--> 172 self._annotate_heatmap(ax, mesh)
173
174 # Possibly add a colorbar
/opt/anaconda/2.3.0/lib/python2.7/site-packages/seaborn/matrix.pyc in _annotate_heatmap(self, ax, mesh)
138 val = ("{:" + self.fmt + "}").format(val)
139 ax.text(x, y, val, color=text_color,
--> 140 ha="center", va="center", **self.annot_kws)
141
142 def plot(self, ax, cax, kws):
/opt/anaconda/2.3.0/lib/python2.7/site-packages/matplotlib/axes/_axes.pyc in text(self, x, y, s, fontdict, withdash, **kwargs)
590 if fontdict is not None:
591 t.update(fontdict)
--> 592 t.update(kwargs)
593 self.texts.append(t)
594 t._remove_method = lambda h: self.texts.remove(h)
/opt/anaconda/2.3.0/lib/python2.7/site-packages/matplotlib/artist.pyc in update(self, props)
755 func = getattr(self, 'set_' + k, None)
756 if func is None or not six.callable(func):
--> 757 raise AttributeError('Unknown property %s' % k)
758 func(v)
759 changed = True
AttributeError: Unknown property tokenized
_
最後に、スタックトレースの行に渡す属性kws
は辞書であり、基本的には次のようになります。
_kws = {'Foo': -0.231049060187, 'Bar': 0.0}
_
すべてが理にかなっていることを望み、誰でもできる助けを感謝します。
この機能は、Seaborn 0.7.1の最新バージョンに追加されたばかりです。
Seaborn更新履歴 :から
Heatmap()のannotパラメーターは、ブール値に加えて長方形のデータセットを受け入れるようになりました。データセットが渡された場合、その値は注釈に使用され、メインデータセットはヒートマップセルの色に使用されます
ここに例があります
data = np.array([[0.000000,0.000000],[-0.231049,0.000000],[-0.231049,0.000000]])
labels = np.array([['A','B'],['C','D'],['E','F']])
fig, ax = plt.subplots()
ax = sns.heatmap(data, annot = labels, fmt = '')
非数値ラベルを使用している場合、fmt = ''が必要です。デフォルト値はfmt = '。2g'であり、これは数値に対してのみ意味があり、テキストラベルに対してエラーが発生するためです。
aanot_kws
Seabornの目的は異なります。つまり、whatではなく、howアノテーションへのアクセスを提供します
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
fig, ax = plt.subplots(1,2)
ata = np.array([[0.000000,0.000000],[-0.231049,0.000000],[-0.231049,0.000000]])
sns.heatmap(data, vmin=-0.231049, vmax=0, annot=True, fmt='f', annot_kws={"size": 15}, ax=ax[0])
sns.heatmap(data, vmin=-0.231049, vmax=0, annot=True, fmt='f', annot_kws={"size": 10}, ax=ax[1]);
現在のバージョンではこれが可能だとは思わない。あなたがハック-yの回避策を実行している場合、次のことができます...
# Create the 1st heatmap without labels
sns.heatmap(data=df1, annot=False,)
# create the second heatmap, which contains the labels,
# turn the annotation on,
# and make it transparent
sns.heatmap(data=df2, annot=True, alpha=0.0)
テキストラベルの色付けに問題がある可能性があることに注意してください。ここでは、すべてのラベルを均一に黒にするカスタムcmap
を作成しました。