lenguaje - python tutorial
Mapa de calor de correlaciĆ³n (5)
Quiero representar la matriz de correlación utilizando un mapa de calor. Hay algo llamado correlogram en R, pero no creo que haya algo así en Python.
¿Cómo puedo hacer esto? Los valores van de -1 a 1, por ejemplo:
[[ 1. 0.00279981 0.95173379 0.02486161 -0.00324926 -0.00432099]
[ 0.00279981 1. 0.17728303 0.64425774 0.30735071 0.37379443]
[ 0.95173379 0.17728303 1. 0.27072266 0.02549031 0.03324756]
[ 0.02486161 0.64425774 0.27072266 1. 0.18336236 0.18913512]
[-0.00324926 0.30735071 0.02549031 0.18336236 1. 0.77678274]
[-0.00432099 0.37379443 0.03324756 0.18913512 0.77678274 1. ]]
Pude producir el siguiente mapa de calor basado en otra question , pero el problema es que mis valores se "cortan" en 0, por lo que me gustaría tener un mapa que pase de azul (-1) a rojo (1), o algo así, pero aquí los valores por debajo de 0 no se presentan de manera adecuada.
Aquí está el código para eso:
plt.imshow(correlation_matrix,cmap=''hot'',interpolation=''nearest'')
- Use el mapa de colores ''jet'' para una transición entre azul y rojo.
- Use
pcolor()
con los parámetrosvmin
,vmax
.
Se detalla en esta respuesta: https://.com/a/3376734/21974
Otra alternativa es usar la función de mapa de calor en el mar para trazar la covarianza. Este ejemplo utiliza el conjunto de datos Automático del paquete ISLR en R (igual que en el ejemplo que mostró).
import pandas.rpy.common as com
import seaborn as sns
%matplotlib inline
# load the R package ISLR
infert = com.importr("ISLR")
# load the Auto dataset
auto_df = com.load_data(''Auto'')
# calculate the correlation matrix
corr = auto_df.corr()
# plot the heatmap
sns.heatmap(corr,
xticklabels=corr.columns,
yticklabels=corr.columns)
Si quieres ser aún más elegante, puedes usar Pandas Style , por ejemplo:
cmap = cmap=sns.diverging_palette(5, 250, as_cmap=True)
def magnify():
return [dict(selector="th",
props=[("font-size", "7pt")]),
dict(selector="td",
props=[(''padding'', "0em 0em")]),
dict(selector="th:hover",
props=[("font-size", "12pt")]),
dict(selector="tr:hover td:hover",
props=[(''max-width'', ''200px''),
(''font-size'', ''12pt'')])
]
corr.style.background_gradient(cmap, axis=1)/
.set_properties(**{''max-width'': ''80px'', ''font-size'': ''10pt''})/
.set_caption("Hover to magify")/
.set_precision(2)/
.set_table_styles(magnify())
Puedes usar matplotlib para esto. Hay una pregunta similar que muestra cómo puede lograr lo que quiere: question
Si sus datos están en un Data Frame de Pandas, puede usar la función de heatmap
de heatmap
de Seaborn para crear la trama deseada.
import seaborn as sns
Var_Corr = df.corr()
# plot the heatmap and annotation on it
sns.heatmap(Var_Corr, xticklabels=Var_Corr.columns, yticklabels=Var_Corr.columns, annot=True)
De la pregunta, parece que los datos están en una matriz NumPy. Si esa matriz tiene el nombre numpy_data
, antes de que puedas usar el paso anterior, querrías ponerlo en un Data Frame de Pandas usando lo siguiente:
import pandas as pd
df = pd.DataFrame(numpy_data)
Tarde en la fiesta, pero tuve ganas de contribuir con algo que armé después de que se anunció que el destacado corrplot marítimo iba a ser desaprobado. El siguiente fragmento de código hace una gráfica de correlación parecida a la de un mapa de calor marino. También puede especificar el rango de colores y seleccionar si desea eliminar o no las correlaciones duplicadas. Observe que he usado los mismos números que usted, pero que los he puesto en un marco de datos de pandas. En cuanto a la elección de colores, puede consultar los documentos de sns.diverging_palette .
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# A list with your data slightly edited
l = [1.0,0.00279981,0.95173379,0.02486161,-0.00324926,-0.00432099,
0.00279981,1.0,0.17728303,0.64425774,0.30735071,0.37379443,
0.95173379,0.17728303,1.0,0.27072266,0.02549031,0.03324756,
0.02486161,0.64425774,0.27072266,1.0,0.18336236,0.18913512,
-0.00324926,0.30735071,0.02549031,0.18336236,1.0,0.77678274,
-0.00432099,0.37379443,0.03324756,0.18913512,0.77678274,1.00]
# Split list
n = 6
data = [l[i:i + n] for i in range(0, len(l), n)]
# A dataframe
df = pd.DataFrame(data)
def CorrMtx(df, dropDuplicates = True):
# Your dataset is already a correlation matrix.
# If you have a dateset where you need to include the calculation
# of a correlation matrix, just uncomment the line below:
# df = df.corr()
# Exclude duplicate correlations by masking uper right values
if dropDuplicates:
mask = np.zeros_like(df, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True
# Set background color / chart style
sns.set_style(style = ''white'')
# Set up matplotlib figure
f, ax = plt.subplots(figsize=(11, 9))
# Add diverging colormap from red to blue
cmap = sns.diverging_palette(250, 10, as_cmap=True)
# Draw correlation plot with or without duplicates
if dropDuplicates:
sns.heatmap(df, mask=mask, cmap=cmap,
square=True,
linewidth=.5, cbar_kws={"shrink": .5}, ax=ax)
else:
sns.heatmap(df, cmap=cmap,
square=True,
linewidth=.5, cbar_kws={"shrink": .5}, ax=ax)
CorrMtx(df, dropDuplicates = False)
Aquí está la trama resultante:
Pidió azul, pero eso queda fuera del rango en sus datos de muestra. Cambie 0.95173379 a -0.95173379 para ambas observaciones y obtendrá esto: