同じ質問heatmap-like plot, but for categorical variablesとしてではなく、RのPythonとseabornを使用して:ヒートマップのようなプロットが、seabornにおけるカテゴリ変数のための
私は、次のデータフレーム持っている想像してみて:
df = pd.DataFrame({"John":"No Yes Maybe".split(),
"Elly":"Yes Yes Yes".split(),
"George":"No Maybe No".split()},
index="Mon Tue Wed".split())
今、私がしたいのヒートマップをプロットし、各セルを対応する値で色付けします。 「はい」、「いいえ」、「たぶん」などです。たとえば、「緑」、「灰色」、「黄色」になります。伝説には、これらの3つの色と対応する値が必要です。
私は次のようにこの問題を自分で解決しました。私はseabornのヒートマップにカテゴリカル色マップを渡すように見えることはできませんので、代わりに私は数字で、すべてのテキストを置換し、内部その後すなわちseabornで使用されるカラーマップを再構築:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as mpatches
# create dictionary with value to integer mappings
value_to_int = {value: i for i, value in enumerate(sorted(pd.unique(df.values.ravel())))}
f, ax = plt.subplots()
hm = sns.heatmap(df.replace(value_to_int).T, cmap="Pastel2", ax=ax, cbar=False)
# add legend
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.7, box.height])
legend_ax = f.add_axes([.7, .5, 1, .1])
legend_ax.axis('off')
# reconstruct color map
colors = plt.cm.Pastel2(np.linspace(0, 1, len(value_to_int)))
# add color map to legend
patches = [mpatches.Patch(facecolor=c, edgecolor=c) for c in colors]
legend = legend_ax.legend(patches,
sorted(value_to_int.keys()),
handlelength=0.8, loc='lower left')
for t in legend.get_texts():
t.set_ha("left")
私の質問を:このヒートマップを作るもっと簡潔な方法はありますか?もしそうでなければ、これは実装する価値のある機能かもしれないが、その場合は海賊問題追跡システムに投稿する。
あなたが持っているフォーマットであるいくつかの例のデータを生成するトラブルに行けば、人々が答えることのために容易になります。 – mwaskom
クイック返信ありがとう!あなたのコードが動作しているので、いくつかのサンプルデータ – inodb
を追加しました。あなたの質問が何であるかを明確かつ明確にしてください。 – tom10