2016-03-25 66 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()) 

現在我想繪製一張熱圖併爲每個單元格對應的值着色。例如,「是」,「否」,「可能」變成「綠色」,「灰色」,「黃色」。圖例應該有這三種顏色和相應的值。

我自己用以下方式解決了這個問題。我似乎無法通過一個分級的色彩映射到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

我的問題:有沒有更簡潔的製作這張熱圖的方法?如果沒有,這可能是一個值得實施的功能,在這種情況下,我會將它發佈到seaborn問題跟蹤器上。

+2

這將是更容易,如果你去生成是在你的格式一些示例數據的麻煩的人來回答。 – mwaskom

+1

感謝您的快速回復!由於您的代碼有效,因此增加了一些示例數據 – inodb

+0

,您能否非常清楚明確地表明您的問題是什麼? – tom10

回答