2016-03-25 14 views
5

同じ質問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") 

Categorical heatmap in seaborn

私の質問を:このヒートマップを作るもっと簡潔な方法はありますか?もしそうでなければ、これは実装する価値のある機能かもしれないが、その場合は海賊問題追跡システムに投稿する。

+2

あなたが持っているフォーマットであるいくつかの例のデータを生成するトラブルに行けば、人々が答えることのために容易になります。 – mwaskom

+1

クイック返信ありがとう!あなたのコードが動作しているので、いくつかのサンプルデータ – inodb

+0

を追加しました。あなたの質問が何であるかを明確かつ明確にしてください。 – tom10

答えて

関連する問題