簡體   English   中英

相關熱圖

[英]Correlation heatmap

我想使用熱圖表示相關矩陣。 R 中有一種叫做相關圖的東西,但我認為 Python 中沒有這種東西。

我怎樣才能做到這一點? 值從 -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.        ]]

我能夠根據另一個問題生成以下熱圖,但問題是我的值在 0 處被“切割”,所以我想要一張從藍色(-1)到紅色(1)的地圖,或者類似的東西,但這里低於 0 的值沒有以適當的方式呈現。

在此處輸入圖片說明

這是代碼:

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

另一種選擇是使用 seaborn 中的熱圖函數來繪制協方差。 此示例使用 R 中 ISLR 包中的 Auto 數據集(與您展示的示例相同)。

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)

在此處輸入圖片說明

如果你想更花哨,你可以使用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())

在此處輸入圖片說明

如果您的數據在 Pandas DataFrame 中,您可以使用 Seaborn 的heatmap功能來創建您想要的圖。

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)

Correlation plot

從問題來看,數據看起來像是在 NumPy 數組中。 如果該數組的名稱為numpy_data ,則在使用上述步驟之前,您需要使用以下命令將其放入 Pandas DataFrame 中:

import pandas as pd
df = pd.DataFrame(numpy_data)

下面的代碼將產生這個圖:

在此處輸入圖片說明

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)

在宣布要棄用出色的seaborn corrplot之后,我將其放在一起。 上面的代碼片段基於seaborn heatmap制作了一個類似的相關seaborn heatmap 您還可以指定顏色范圍並選擇是否刪除重復的相關性。 請注意,我使用了與您相同的數字,但我將它們放入了一個 Pandas 數據框中。 關於顏色的選擇,您可以查看sns.diverging_palette的文檔。 您要求使用藍色,但這超出了您的樣本數據的色標的特定范圍。 對於 0.95173379 的兩個觀測值,嘗試更改為 -0.95173379,您將得到:

在此處輸入圖片說明

這個怎么樣?

import seaborn as sb
corr = df.corr()
sb.heatmap(corr, cmap="Blues", annot=True)

繪圖結果

  1. 使用“jet”顏色圖實現藍色和紅色之間的過渡。
  2. pcolor()vminvmax參數一起使用。

在這個答案中有詳細說明: https : //stackoverflow.com/a/3376734/21974

你可以使用matplotlib 有一個類似的問題,展示了如何實現你想要的: 用Matplotlib繪制2D熱圖

import seaborn as sns
# label to make it neater
labels = {
's1':'vibration sensor',  
'temp':'outer temperature', 
'actPump':'flow rate', 
'pressIn':'input pressure', 
'pressOut':'output pressure', 
'DrvActual':'acutal RPM',
'DrvSetPoint':'desired RPM',
'DrvVolt':'input voltage',
'DrvTemp':'inside temperature',
'DrvTorque':'motor torque'}

corr = corr.rename(labels)

# remove the top right triange - duplicate information
mask = np.zeros_like(corr, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True

# Colors
cmap = sns.diverging_palette(500, 10, as_cmap=True)

# uncomment this if you want only the lower triangle matrix 
# ans=sns.heatmap(corr, mask=mask,  linewidths=1, cmap=cmap, center=0)

ans=sns.heatmap(corr,  linewidths=1, cmap=cmap, center=0)

#save image 
figure = ans.get_figure()    
figure.savefig('correlations.png', dpi=800)

這些都是合理的答案,似乎問題已基本解決,但我想我會添加一個不使用 matplotlib/seaborn 的答案。 特別是這個解決方案使用基於圖形語法的altair (對於來自 ggplot 的人來說可能更熟悉一些)。

# import libraries
import pandas as pd
import altair as alt

# download dataset and create correlation
df = pd.read_json("https://raw.githubusercontent.com/vega/vega-datasets/master/data/penguins.json")
corr_df = df.corr()

# data preparation
pivot_cols = list(corr_df.columns)
corr_df['cat'] = corr_df.index

# actual chart
alt.Chart(corr_df).mark_rect(tooltip=True)\
   .transform_fold(pivot_cols)\
   .encode(
       x="cat:N", 
       y='key:N', 
       color=alt.Color("value:Q", scale=alt.Scale(scheme="redyellowblue"))
   )

這產生

在此處輸入圖片說明

如果您發現自己需要在這些單元格中添加標簽,您可以將#actual 圖表部分換成類似的內容

base = alt.Chart(corr_df).transform_fold(pivot_cols).encode(x="cat:N",  y='key:N').properties(height=300, width=300)
boxes = base.mark_rect().encode(color=alt.Color("value:Q", scale=alt.Scale(scheme="redyellowblue")))
labels = base.mark_text(size=30, color="white").encode(text=alt.Text("value:Q", format="0.1f"))
boxes + labels

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM