Jeśli Twoim głównym celem jest wizualizacja matrycy korelacji, a nie tworzenie wykresu per se, wygodne pandas
opcje stylizacji to realne wbudowane rozwiązanie:
import pandas as pd
import numpy as np
rs = np.random.RandomState(0)
df = pd.DataFrame(rs.rand(10, 10))
corr = df.corr()
corr.style.background_gradient(cmap='coolwarm')
# 'RdBu_r' & 'BrBG' are other good diverging colormaps
Zauważ, że musi to być backend obsługujący renderowanie HTML, taki jak Notatnik JupyterLab. (Automatyczny jasny tekst na ciemnym tle pochodzi z istniejącego PR, a nie z najnowszej wydanej wersji, pandas
0.23).
Stylizacja
Możesz łatwo ograniczyć precyzję cyfr:
corr.style.background_gradient(cmap='coolwarm').set_precision(2)
Lub pozbądź się cyfr, jeśli wolisz matrycę bez adnotacji:
corr.style.background_gradient(cmap='coolwarm').set_properties(**{'font-size': '0pt'})
Dokumentacja stylów zawiera także instrukcje dotyczące bardziej zaawansowanych stylów, takich jak zmiana sposobu wyświetlania komórki, nad którą wskaźnik myszy najeżdża. Aby zapisać wynik, możesz zwrócić kod HTML, dodając render()
metodę, a następnie zapisując go do pliku (lub po prostu zrób zrzut ekranu dla mniej formalnych celów).
Porównanie czasu
W moich testach style.background_gradient()
był 4x szybszy plt.matshow()
i 120x szybszy niż sns.heatmap()
przy matrycy 10x10. Niestety nie skaluje się tak dobrze, jak plt.matshow()
: oba zajmują mniej więcej tyle samo czasu dla matrycy 100 plt.matshow()
x 100 i są 10 razy szybsze dla matrycy 1000 x 1000.
Oszczędność
Istnieje kilka możliwych sposobów zapisania stylizowanej ramki danych:
- Zwróć kod HTML, dodając
render()
metodę, a następnie zapisz wynik w pliku.
- Zapisz jako
.xslx
plik z formatowaniem warunkowym, dodając to_excel()
metodę.
- Połącz z imgkit, aby zapisać bitmapę
- Zrób zrzut ekranu (do mniej formalnych celów).
Aktualizacja dla pand> = 0,24
Po ustawieniu axis=None
możliwe jest teraz obliczanie kolorów na podstawie całej macierzy, a nie według kolumny lub wiersza:
corr.style.background_gradient(cmap='coolwarm', axis=None)