2015-01-16 5 views
6

Stworzyłem bardzo prosty wykres mapy cieplnej z Seabornem wyświetlającym kwadratową macierz podobieństwa. Oto jeden wiersz kodu użyłem:Jak wyrażać klasy na osi mapy cieplnej w Seaborn

sns.heatmap(sim_mat, linewidths=0, square=True, robust=True) 
sns.plt.show() 

i to jest wyjście uzyskać:

enter image description here

Co chciałbym zrobić, to do reprezentowania na osi X i Y nie etykiety moich instancji, ale kolorowy wskaźnik (wyobraź sobie coś w rodzaju małego palplota na każdej osi), gdzie każdy kolor reprezentuje inną zmienną związaną z każdą instancją (powiedzmy, że mam tę informację zapisaną listę o nazwie labels) plus inną legendę tego rodzaju informacji obok tej określającej kolory mapy cieplnej (takiej jak ta dla lmplot). Ważne jest, aby obie informacje miały różne palety kolorów.

Czy to możliwe w Seaborn?

UPDATE

Co szukam jest clustermap jak słusznie sugeruje.

sns.clustermap(sim_mat, row_colors=label_cols, col_colors=label_cols 
    row_cluster=False, col_cluster=False) 

Oto co ja dostaję btw, kropki i linie są zbyt małe i nie widzę sposobu, aby je powiększyć w dokumentacji. Chciałbym

Plus, jak dodać legendę i umieścić dwa obok siebie w tej samej pozycji?

enter image description here

+0

Brzmi jak możesz skorzystać z 'clusterplot' bocznych kolorach i grupowanie wyłączony. Zobacz ten przykład http://stanford.edu/~mwaskom/software/seaborn/examples/structured_heatmap.html. – mwaskom

+0

dziękuję, masz rację, mogę przyjąć to jako właściwą odpowiedź. Jednak nie jestem w stanie uzyskać ładnej fabuły, zaktualizuję moje pytanie. – rano

Odpowiedz

14

Istnieją dwie opcje:

Pierwsze, heatmap jest poziom figura Osie, więc można założyć główny duża główna mapa termiczna osie dla macierzy korelacji i otoczyć ją z mapy cieplne, które następnie przekazać sobie klasowe kolory. To będzie trochę pracy, ale daje ci dużo kontroli nad tym, jak wszystko działa.

Jest to jednak mniej więcej opcja w clustermap, więc zamierzam pokazać, jak to zrobić w ten sposób. To trochę hack, ale zadziała.

Najpierw załadujemy przykładowe dane i wykonamy trochę transformacji okrężnych, aby uzyskać kolory dla etykiet klas.

networks = sns.load_dataset("brain_networks", index_col=0, header=[0, 1, 2]) 
network_labels = networks.columns.get_level_values("network") 
network_pal = sns.cubehelix_palette(network_labels.unique().size, 
            light=.9, dark=.1, reverse=True, 
            start=1, rot=-2) 
network_lut = dict(zip(map(str, network_labels.unique()), network_pal)) 

network_colors = pd.Series(network_labels).map(network_lut) 

Następnie wywołujemy clustermap, aby utworzyć główną fabułę.

g = sns.clustermap(networks.corr(), 

        # Turn off the clustering 
        row_cluster=False, col_cluster=False, 

        # Add colored class labels 
        row_colors=network_colors, col_colors=network_colors, 

        # Make the plot look better when many rows/cols 
        linewidths=0, xticklabels=False, yticklabels=False) 

Bok kolory są rysowane z matplotlib mapę cieplną, która myśli o danych ilościowych, jak i dlatego, że nie jest to prosty sposób, aby uzyskać legendę bezpośrednio od niego. Zamiast tego dodamy niewidoczny barplot z odpowiednimi kolorami i etykietami, a następnie dodamy legendę dla , która jest.

for label in network_labels.unique(): 
    g.ax_col_dendrogram.bar(0, 0, color=network_lut[label], 
          label=label, linewidth=0) 
g.ax_col_dendrogram.legend(loc="center", ncol=6) 

Wreszcie, przejdźmy do colorbar podjąć pustą przestrzeń, w której dendrogramie rząd normalnie i zapisać figurę.

g.cax.set_position([.15, .2, .03, .45]) 
g.savefig("clustermap.png") 

enter image description here

+1

dziękuję za poświęcenie tego czasu. – rano

+0

Jakiekolwiek możliwości przeniesienia legendy na dół figury? ... – Botond

Powiązane problemy