2015-04-12 5 views
5

Sto tentando di creare una singola immagine con heatmap che rappresentano la correlazione delle caratteristiche dei punti di dati per ciascuna etichetta separatamente. Con Seaborn posso creare una mappa termica per una singola classe in questo modoPianificazione delle heatmap di correlazione con Seaborn FacetGrid

grouped = df.groupby('target') 
sns.heatmap(grouped.get_group('Class_1').corr()) 

Un ottengo questo che ha senso:

Class_1 correlation heatmap

Ma poi ho provare a fare una lista di tutte le etichette come così:

g = sns.FacetGrid(df, col='target') 
g.map(lambda grp: sns.heatmap(grp.corr())) 

E purtroppo ho questo che non ha senso per me:

Failing attempt to plot all classes

+0

Vuoi nove heatmap, ciascuna delle quali mostra una correlazione all'interno di un singolo target? – cphlewis

+0

Sì, ho accettato la risposta di @cphlewis perché funziona, ma quello che mi piace di Seaborn finora è che puoi tracciare cose veloci e sporche, nel senso che puoi praticamente dire "trama questo" e verrà fuori con qualcosa. Il mio caso è più o meno quello: non è molto importante per me come saranno organizzate le heatmap o quali assi saranno visualizzati, solo per vedere quell'informazione in più o meno il formato che ho chiesto. Quindi far funzionare la cosa lambda sarebbe molto utile :) – fakedrake

+0

Sì, mi sono affrettato e non ho toccato il pulsante correttamente grazie :) – fakedrake

risposta

5

Si scopre che si può fare abbastanza bene con appena il mare se si utilizza map_dataframe anziché map.

g = sns.FacetGrid(df, col='target') 
g.map_dataframe(lambda data, color: sns.heatmap(data.corr(), linewidths=0)) 

@mwaskom sottolinea nel suo commento che potrebbe essere una buona idea per impostare in modo esplicito i limiti della mappa dei colori in modo che le diverse sfaccettature possono essere confrontati in modo più diretto. Il documentation descrive rilevanti parametri heatmap:

Vmin, Vmax: carri, opzionale

Valori per ancorare la mappa dei colori, altrimenti vengono desunti dai dati e altri argomenti a parola chiave. Quando un set di dati divergente è dedotto, uno di questi valori può essere ignorato.

4

Senza FacetGrid, ma fare un heatmap corr per ogni gruppo in una colonna:

import pandas as pd 
import seaborn as sns 
from numpy.random import randint 
import matplotlib.pyplot as plt 


df = pd.DataFrame(randint(0,10,(200,12)),columns=list('abcdefghijkl')) 
grouped = df.groupby('a') 
rowlength = grouped.ngroups/2 # fix up if odd number of groups 
fig, axs = plt.subplots(figsize=(9,4), nrows=2, ncols=rowlength) 

targets = zip(grouped.groups.keys(), axs.flatten()) 
for i, (key, ax) in enumerate(targets): 
    sns.heatmap(grouped.get_group(key).corr(), ax=ax, 
       xticklabels=(i >= rowlength), 
       yticklabels=(i%rowlength==0), 
       cbar=False) # Use cbar_ax into single side axis 
    ax.set_title('a=%d'%key) 
plt.show() 

enter image description here Forse c'è un modo per impostare un lambda per passare correttamente i dati dal generatore g.facet_data() attraverso corr prima di andare a heatmap.