web-dev-qa-db-ja.com

相関ヒートマップ

ヒートマップを使用して相関行列を表現したい。 Rには correlogram と呼ばれるものがありますが、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.        ]]

別の question に基づいて次のヒートマップを作成できましたが、問題は、値が0で「カット」されるため、blue(-1)からマップを作成したいことです。 red(1)、またはそのようなものですが、ここでは0未満の値は適切な方法で表示されません。

enter image description here

そのためのコードは次のとおりです。

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

もう1つの方法は、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)

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

48
mrandrewandrade

データが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)
7
fati heidari

以下のコードはこのプロットを生成します:

enter image description here

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に基づいて類似の相関プロットを作成します。また、色の範囲を指定して、重複した相関を削除するかどうかを選択できます。私はあなたと同じ番号を使用しましたが、pandasデータフレームに入れたことに注意してください。色の選択に関しては、 sns.diverging_palette のドキュメントをご覧ください。あなたは青を要求しましたが、それはサンプルデータのカラースケールのこの特定の範囲から外れています。 0.95173379の両方の観測値については、-0.95173379に変更してみてください。これが得られます。

enter image description here

5
vestland

これには matplotlib を使用できます。あなたが望むものを達成する方法を示す同様の質問があります: Matplotlibで2Dヒートマップをプロットする

0
Bernhard
  1. 青と赤の間の遷移には、「ジェット」カラーマップを使用します。
  2. vminvmaxパラメーターとともにpcolor()を使用します。

この回答で詳しく説明されています: https://stackoverflow.com/a/3376734/21974

0
ypnos