2016-03-25 15 views
5

stessa domanda heatmap-like plot, but for categorical variables ma utilizzando Python e Seaborn invece di R:heatmap simile, ma per le variabili categoriali in Seaborn

Immaginate Ho il seguente dataframe:

df = pd.DataFrame({"John":"No Yes Maybe".split(), 
        "Elly":"Yes Yes Yes".split(), 
        "George":"No Maybe No".split()}, 
        index="Mon Tue Wed".split()) 

Ora vorrei traccia una heatmap e colora ciascuna cella con il suo valore corrispondente. Questo è "Sì", "No", "Forse", ad esempio diventa "Verde", "Grigio", "Giallo". La legenda dovrebbe avere quei tre colori e i valori corrispondenti.

Ho risolto io stesso questo problema nel modo seguente. Non riesco a passare una mappa a colori categorica alla heatmap di Seaborn, così invece ho sostituire tutto il testo da numeri e ricostruire la mappa dei colori usati per Seaborn internamente dopo cioè:

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

La mia domanda: c'è un modo più succinto di fare questa heatmap? In caso contrario, questa potrebbe essere una caratteristica che vale la pena implementare, nel qual caso la pubblicherò sul tracker dei problemi Seaborn.

+2

Sarà più facile per le persone a rispondere se si va alla difficoltà di generare alcuni dati di esempio che è nel formato che avete. – mwaskom

+1

Grazie per la rapida risposta! Aggiunti alcuni dati di esempio – inodb

+0

poiché il codice funziona, potresti essere molto chiaro ed esplicito su quale sia la tua domanda? – tom10

risposta

Problemi correlati