2016-09-09 21 views
7

Tôi muốn biểu diễn ma trận tương quan bằng cách sử dụng bản đồ nhiệt. Có một cái gì đó gọi là correlogram trong R, nhưng tôi không nghĩ rằng có một điều như vậy trong Python.Bản đồ nhiệt tương quan

Tôi làm cách nào để thực hiện việc này? Các giá trị đi từ -1 đến 1, ví dụ:

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

tôi đã có thể tạo ra các bản đồ nhiệt sau đây dựa trên question khác, nhưng vấn đề là giá trị tôi nhận được 'cắt' tại 0, vì vậy tôi muốn để có một bản đồ chuyển từ màu xanh (-1) sang màu đỏ (1), hoặc một cái gì đó tương tự, nhưng ở đây các giá trị dưới 0 không được trình bày một cách đầy đủ.

enter image description here

Dưới đây là đoạn code cho rằng:

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

Tôi đã chỉnh sửa câu hỏi để bạn có thể kiểm tra. – Marko

Trả lời

11

Một lựa chọn khác là sử dụng các chức năng Heatmap trong sanh ở biển để mưu hiệp phương sai. Ví dụ này sử dụng tập dữ liệu Tự động từ gói ISLR trong R (giống như trong ví dụ bạn đã trình bày).

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

Nếu bạn muốn trở thành thậm chí ưa thích hơn, bạn có thể sử dụng Pandas Style, ví dụ:

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

Bạn có thể sử dụng matplotlib cho việc này. Có một câu hỏi tương tự cho thấy cách bạn có thể đạt được những gì bạn muốn: Plotting a 2D heatmap with Matplotlib

+0

Cảm ơn bạn đã trả lời, vui lòng xem câu hỏi đã chỉnh sửa. – Marko

0
  1. Sử dụng bản đồ 'phản lực' để chuyển đổi giữa màu xanh và đỏ.
  2. Sử dụng pcolor() với thông số vmin, vmax.

Nó được trình bày chi tiết trong câu trả lời này: https://stackoverflow.com/a/3376734/21974

+0

Bạn có thể đưa ra một ví dụ trong trường hợp của tôi, tôi không có kinh nghiệm với Python vì vậy tôi có vấn đề với điều này. Trong ví dụ bạn cho họ sử dụng X, Y = np.meshgrid (x, y), tôi không có nó? – Marko

+0

Lưới định vị chỉ ở đó để gán một cặp tọa độ cho mỗi điểm sao cho nó được vẽ như một bản đồ nhiệt. – ypnos

0

muộn để đảng, nhưng tôi có cảm giác như đóng góp một cái gì đó tôi đặt lại với nhau sau khi nó đã được thông báo rằng các corrplot seaborn nổi bật đã được deprecated. Đoạn mã sau tạo ra một âm mưu tương quan tương tự dựa trên bản đồ nhiệt seaborn. Bạn cũng có thể chỉ định phạm vi màu và chọn có hay không bỏ tương quan trùng lặp. Lưu ý rằng tôi đã sử dụng các số giống như bạn, nhưng tôi đã đặt chúng trong một khung dữ liệu gấu trúc. Về lựa chọn màu sắc, bạn có thể xem tài liệu cho 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) 

Dưới đây là cốt truyện kết quả:

enter image description here

Bạn hỏi cho màu xanh, nhưng điều đó rơi ra khỏi phạm vi trong dữ liệu mẫu của bạn. Thay đổi 0,95173379 thành -0.95173379 cho cả hai quan sát và bạn sẽ nhận được điều này:

enter image description here

Các vấn đề liên quan