Корреляционная тепловая карта

Я хочу представить корреляционную матрицу с помощью тепловой карты. В 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, поэтому я хотел бы иметь карту, которая идет от синего (-1) до красного (1), или что-то в этом роде, но здесь значения ниже 0 не представлены адекватным образом.

введите описание изображения здесь

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

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

Ответ 1

Другой альтернативой является использование функции тепловой карты в морском дне для построения ковариации. В этом примере используется набор данных 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)

введите описание изображения здесь

Если вы хотите быть еще более причудливым, вы можете использовать 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())

введите описание изображения здесь

Ответ 2

Код ниже создаст этот график:

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 напоминает корреляционный график, основанный на seaborn heatmap. Вы также можете указать цветовой диапазон и указать, следует ли удалять дублирующиеся корреляции. Обратите внимание, что я использовал те же числа, что и вы, но поместил их в кадр данных pandas. Относительно выбора цветов вы можете взглянуть на документы для sns.diverging_palette. Вы запросили синий цвет, но он выходит за пределы этого конкретного диапазона цветовой шкалы с вашими образцами данных. Для обоих наблюдений 0,95173379 попробуйте изменить на -0.95173379, и вы получите это:

enter image description here

Ответ 3

Если данные в панде DataFrame, вы можете использовать Сиборн 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, прежде чем вы сможете использовать описанный выше шаг, вы можете поместить его в DataFrame Pandas, используя следующее:

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

Ответ 5

  • Используйте цветовой пакет "jet" для перехода между синим и красным.
  • Используйте pcolor() с параметрами vmin, vmax.

Подробно в этом ответе: fooobar.com/info/68118/...