2016-09-09 6 views
7

Я хочу представить корреляционную матрицу с использованием тепловой карты. В R есть что-то под названием correlogram, но я не думаю, что в Python есть такая вещь.Correlation heatmap

Как это сделать? Значения идут от -1 до 1, например:

[[ 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.  ]] 

Я был в состоянии произвести следующие Heatmap на основе другого question, но проблема в том, что мои ценности получить «вырезать» 0, так что я хотел бы иметь карту, которая идет от синего (-1) до красного (1), или что-то в этом роде, но здесь значения ниже 0 не представлены адекватным образом.

enter image description here

Вот код для этого:

plt.imshow(correlation_matrix,cmap='hot',interpolation='nearest') 
+0

Я редактировал вопрос, так что вы можете проверить. – Marko

ответ

11

Другой альтернативой является использование функции Heatmap в Сиборн для построения ковариации. В этом примере используется набор данных Auto из пакета ISLR в R (то же, что и в примере, который вы указали).

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) 

enter image description here

Если вы хотите еще больше фантазии, вы можете использовать Pandas Style, например:

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()) 

enter image description here

0

Вы можете использовать matplotlib для этого. Существует аналогичный вопрос, который показывает, как вы можете достичь того, чего вы хотите: Plotting a 2D heatmap with Matplotlib

+0

Благодарим вас за ответ, см. Отредактированный вопрос. – Marko

0
  1. Используйте «струйную» колокольню для перехода между синим и красным.
  2. Используйте pcolor() с параметрами vmin, vmax.

Это подробно описано в этом ответе: https://stackoverflow.com/a/3376734/21974

+0

Можете ли вы привести пример в моем случае, я не очень опытен с Python, поэтому у меня есть проблемы с этим. В примере, который вы дали, они используют X, Y = np.meshgrid (x, y), у меня этого нет? – Marko

+0

Meshgrid просто там, чтобы назначить координатную пару для каждой точки, чтобы она была построена как тепловая карта. – ypnos

0

Late к партии, но я чувствовал, внося что-то, что я собрал после того, как было объявлено о том, что выдающийся морской корнер должен быть устаревшим. Следующий фрагмент делает похожий корреляционный сюжет, основанный на морской тепловой карте. Вы также можете указать диапазон цветов и выбрать, следует ли удалять дублирующие корреляции. Обратите внимание, что я использовал те же номера, что и вы, но я поместил их в рамку данных pandas. Что касается выбора цветов, вы можете посмотреть документы на 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) 

Вот полученный участок:

enter image description here

Вы просили синий, но выпадает из диапазона в данных образцов. Изменить 0.95173379 до -0.95173379 для обоих наблюдений и вы получите это:

enter image description here