2015-04-12 9 views
5

Próbuję utworzyć pojedynczy obraz z mapami ciepła reprezentującymi korelację cech punktów danych dla każdej etykiety osobno. Z Seaborn mogę stworzyć mapę cieplną dla jednej klasy podobnie jakSporządzanie map korelacji korelacji z Seaborn FacetGrid

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

An uzyskać to co ma sens:

Class_1 correlation heatmap

Ale wtedy staram się zrobić listę wszystkich etykiet, takich jak tak:

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

I niestety mam ten, który nie ma sensu do mnie:

Failing attempt to plot all classes

+0

Potrzebujesz dziewięciu map termicznych, z których każda wykazuje korelację w obrębie jednego celu? – cphlewis

+0

Tak, zaakceptowałem odpowiedź @cphlewis, ponieważ działa, ale jak dotąd podoba mi się to, że seaborn jest w stanie fabułować rzeczy szybkie i brudne, w tym sensie, że można powiedzieć "spiskuj to" i wymyśli coś. Moja użyteczność jest taka, że: nie jest dla mnie ważne, w jaki sposób zostaną rozmieszczone mapy termiczne lub jakie osie będą wyświetlane, tylko po to, aby zobaczyć te informacje w dokładnie takim formacie, o jaki prosiłem. Tak więc praca z lambdą do pracy byłaby bardzo pomocna :) – fakedrake

+0

Tak, rzuciłem to i nie dotknąłem przycisku poprawnie thanx :) – fakedrake

Odpowiedz

5

Okazało się, że można to zrobić całkiem nieźle z seabornem, jeśli użyjesz map_dataframe zamiast map.

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

@mwaskom wskazuje w swoim komentarzu, że to może być dobry pomysł, aby wyraźnie określone granice colormap tak, że różne aspekty mogą być bardziej bezpośrednio porównywane. documentation opisuje odpowiednich heatmap parametry:

Vmin, vmax: pływaki, opcjonalnie

wartości do zakotwiczenia colormap, w przeciwnym razie są one wynikać z danych i innych argumentów kluczowych. Gdy rozbieżny zbiór danych zostanie oszacowany na podstawie , jedna z tych wartości może zostać zignorowana.

4

Bez FacetGrid, ale dokonując mapę cieplną corr dla każdej grupy w kolumnie:

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 Może istnieje sposób, aby ustawić lambda poprawnie przekazać dane z generatora g.facet_data() przez corr przed udaniem się na heatmap.