Если вашей главной целью является визуализация матрицы корреляции, а не создание графика как такового, удобные 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. (Автоматический светлый текст на темном фоне взят из существующего 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()
с матрицей 10х10. К сожалению, она не масштабируется так же хорошо plt.matshow()
: обе матрицы занимают примерно одинаковое время для матрицы 100x100 и plt.matshow()
в 10 раз быстрее для матрицы 1000x1000.
Сохранение
Есть несколько возможных способов сохранить стилизованный фрейм данных:
Обновление для панд> = 0,24
Установив axis=None
, теперь можно вычислять цвета на основе всей матрицы, а не на столбец или на строку:
corr.style.background_gradient(cmap='coolwarm', axis=None)