Se seu objetivo principal é visualizar a matriz de correlação, em vez de criar um gráfico propriamente dito, as convenientes pandas
opções de estilo são uma solução interna viável:
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
Observe que isso precisa estar em um back-end que suporte a renderização HTML, como o Notebook JupyterLab. (O texto claro automático em fundos escuros é de um PR existente e não da versão mais recente lançada, pandas
0,23).
Styling
Você pode limitar facilmente a precisão dos dígitos:
corr.style.background_gradient(cmap='coolwarm').set_precision(2)
Ou se livrar dos dígitos completamente, se você preferir a matriz sem anotações:
corr.style.background_gradient(cmap='coolwarm').set_properties(**{'font-size': '0pt'})
A documentação de estilo também inclui instruções de estilos mais avançados, como alterar a exibição da célula sobre a qual o ponteiro do mouse está passando o mouse. Para salvar a saída, você pode retornar o HTML anexando o render()
método e depois gravá-lo em um arquivo (ou apenas fazer uma captura de tela para fins menos formais).
Comparação de tempo
Nos meus testes, style.background_gradient()
foi 4x mais rápido que plt.matshow()
e 120x mais rápido que sns.heatmap()
com uma matriz 10x10. Infelizmente, não é tão dimensionável quanto plt.matshow()
: os dois demoram quase o mesmo tempo para uma matriz 100x100 e plt.matshow()
são 10x mais rápidos para uma matriz 1000x1000.
Salvando
Existem algumas maneiras possíveis de salvar o quadro de dados estilizado:
- Retorne o HTML anexando o
render()
método e, em seguida, grave a saída em um arquivo.
- Salve como um
.xslx
arquivo com formatação condicional anexando o to_excel()
método
- Combine com imgkit para salvar um bitmap
- Faça uma captura de tela (para fins menos formais).
Atualização para pandas> = 0,24
Ao definir axis=None
, agora é possível calcular as cores com base em toda a matriz, e não por coluna ou linha:
corr.style.background_gradient(cmap='coolwarm', axis=None)