Корреляционная тепловая карта
Я хочу представить корреляционную матрицу с помощью тепловой карты. В 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)
Ответ 4
Вы можете использовать matplotlib для этого. Там есть аналогичный вопрос, который показывает, как вы можете достичь того, чего хотите: Нанесение 2D-карты тепла с помощью Matplotlib
Ответ 5
- Используйте цветовой пакет "jet" для перехода между синим и красным.
- Используйте
pcolor()
с параметрами vmin
, vmax
.
Подробно в этом ответе:
fooobar.com/info/68118/...