2016-09-09 30 views
7

Bir ısı haritası kullanarak korelasyon matrisini temsil etmek istiyorum. R'de correlogram diye bir şey var, ama Python'da böyle bir şey olduğunu sanmıyorum.Korelasyon ısı haritası

Bunu nasıl yapabilirim? değerler, örneğin -1 ila 1 gidin:

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

başka question dayalı olarak aşağıdaki ısı haritası üretmek mümkün, ama sorun benim değerleri 0 kısmındaki 'cut' olsun yani, o yüzden istiyorum mavi (-1) 'den kırmızıya (1) veya buna benzer bir şeye sahip olan bir haritaya sahip olmak için, ancak burada 0'ın altındaki değerler yeterli bir şekilde sunulmamıştır.

enter image description here

İşte bunun için kod:

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

Soruyu kaydetmiştiniz. – Marko

cevap

11

diğer alternatif kovaryansını çizmek Seaborn içinde ısı haritası işlevini kullanmaktır. Bu örnek, R'de ISLR paketinden (gösterdiğiniz örnekte olduğu gibi) Otomatik veri kümesini kullanır. Geç partiye

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
  1. mavi ve kırmızı arasında bir geçiş için 'jet' renk haritası kullanın: İstediğinizi elde edebilirsiniz gösterir benzer bir soru var.
  2. pcolor(), vmin, vmax parametreleriyle kullanın.

yanıtında ayrıntılı: https://stackoverflow.com/a/3376734/21974

+0

Lütfen benim durumumla ilgili bir örnek verebilir misiniz, Python ile çok tecrübeli değilim, bu yüzden bununla ilgili sorunlarım var. Verdiğiniz örnekte X, Y = np.meshgrid (x, y) kullanıyorsunuz, buna sahip değil miyim? – Marko

+0

Meshgrid, her noktaya bir koordinat çifti atamak için oradadır, böylece bir ısı haritası olarak çizilir. – ypnos

0

ama gibi hissettim: Eğer daha süslü olmasını isteseydim

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

, örneğin, Pandas Style kullanabilirsiniz Öte yandan, olağanüstü denizanası düzeltmesinin yerine kullanılmayacağını duyurduktan sonra bir araya getirdiğim bir şeye katkıda bulunmak. Aşağıdaki snippet, deniz ısısı ısı haritasına dayalı benzer bir korelasyon çizimi yapar. Renk aralığını da belirtebilir ve yinelenen korelasyonları bırakıp bırakmayacağınızı seçebilirsiniz. Sizinle aynı sayıları kullandığımı fark ettim, ama onları bir pandalar veri karesine koydum. Renk seçimi ile ilgili olarak sns.diverging_palette belgelerine göz atabilirsiniz.

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) 

İşte çıkan arsa var: Mavi istedi

enter image description here

ama bu senin örnek verilerinde aralığının dışında düşer. 0,95173379'u -0 olarak değiştirin.Her iki gözlemler için 95173379 ve bu alırsınız: Eğer kontrol edebilirsiniz

enter image description here

İlgili konular