2015-04-12 6 views
5

Ich versuche, ein einzelnes Bild mit Heatmaps zu erstellen, die die Korrelation von Features von Datenpunkten für jedes Label separat darstellen. Mit Seaborn kann ich eine Heatmap für eine einzelne Klasse erstellen, wie soZeichnen von Korrelation Heatmaps mit Seaborn FacetGrid

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

An ich das bekommen was Sinn macht:

Class_1 correlation heatmap

Aber dann versuche ich eine Liste aller Etiketten zu machen wie so:

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

Und leider bekomme ich es, was für mich keinen Sinn macht:

Failing attempt to plot all classes

+0

Sie möchten neun Heatmaps, von denen jedes die Korrelation innerhalb eines einzelnen Ziels zeigt? – cphlewis

+0

Ja, ich habe die Antwort von @cphlewis akzeptiert, weil es funktioniert, aber was ich an Seaborn so schätze, ist, dass du Sachen schnell und dreckig plotten kannst, in dem Sinne, dass du es ziemlich genau sagen kannst "plot this" und es wird kommen etwas. Mein Anwendungsfall ist so ziemlich das: Es ist mir nicht sehr wichtig, wie die Heatmaps angeordnet werden oder welche Achsen angezeigt werden, nur um diese Informationen in genau dem Format zu sehen, nach dem ich gefragt habe. Also das Lambda-Ding zu arbeiten wäre sehr hilfreich :) – fakedrake

+0

Yeah, ich stürzte es und nicht den Knopf richtig antippen thanx :) – fakedrake

Antwort

5

Stellt sich heraus, Sie können es ziemlich conciesely mit nur Seaborn tun, wenn Sie map_dataframe anstelle von map verwenden.

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

@mwaskom weist in seinem Kommentar darauf hin, dass es eine gute Idee sein, ausdrücklich die Grenzen des colormap zu setzen, so dass die verschiedenen Facetten mehr direkt miteinander verglichen werden können. Die documentation beschreibt relevante heatmap Parameter:

vmin, vmax: Schwimmer, optional

Werte der colormap zu verankern, da sie sich aus den Daten und andere Schlüsselwort Argumente abgeleitet werden. Wenn ein divergierender Datensatz abgeleitet wird, kann einer dieser Werte ignoriert werden.

4

Ohne FacetGrid, aber eine corr heatmap für jede Gruppe in einer Spalte zu machen:

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 Vielleicht gibt es eine Möglichkeit, eine Lambda einzurichten, um die Daten korrekt aus dem g.facet_data() Generator passieren corr bevor Sie zu heatmap gehen.