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")
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.
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
Grazie per la rapida risposta! Aggiunti alcuni dati di esempio – inodb
poiché il codice funziona, potresti essere molto chiaro ed esplicito su quale sia la tua domanda? – tom10