Якщо ваша головна мета - візуалізація матриці кореляції, а не створення сюжету як такого, зручні pandas
варіанти стилю - це життєздатне вбудоване рішення:
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
Зауважте, що це повинно бути в бекенді, який підтримує HTML-рендерінг, наприклад, JupyterLab Notebook. (Автоматичний світлий текст на темному тлі походить від існуючого PR, а не останньої випущеної версії, pandas
0,23).
Стилізація
Ви можете легко обмежити точність цифр:
corr.style.background_gradient(cmap='coolwarm').set_precision(2)
Або позбудьтесь цифр зовсім, якщо ви віддаєте перевагу матриці без приміток:
corr.style.background_gradient(cmap='coolwarm').set_properties(**{'font-size': '0pt'})
Документація щодо стилізації включає також інструкції більш вдосконалених стилів, наприклад, як змінити відображення комірки, на якій вказівник миші наводиться. Щоб зберегти вихід, ви можете повернути HTML, додавши render()
метод, а потім записати його у файл (або просто зробити знімок екрана для менш формальних цілей).
Порівняння часу
У моєму тестуванні style.background_gradient()
було в 4 рази швидше plt.matshow()
і на 120 разів швидше, ніж sns.heatmap()
з матрицею 10x10. На жаль, він не масштабується так plt.matshow()
: двоє займають приблизно один і той же час для матриці 100x100, і plt.matshow()
на 10 разів швидше для матриці 1000x1000.
Збереження
Існує кілька можливих способів збереження стилізованого кадру даних:
- Поверніть HTML, додавши
render()
метод, а потім запишіть вихід у файл.
- Збережіть як
.xslx
файл із умовним форматуванням, додавши to_excel()
метод.
- Поєднайте з imgkit, щоб зберегти растрову карту
- Зробіть знімок екрана (для менш формальних цілей).
Оновлення для панд> = 0,24
Встановивши axis=None
, тепер можна обчислити кольори на основі всієї матриці, а не на стовпчику чи рядку:
corr.style.background_gradient(cmap='coolwarm', axis=None)