2016-09-09 37 views
7

Chcę reprezentować macierz korelacji za pomocą mapy termicznej. Jest coś, co nazywa się correlogram w R, ale nie sądzę, że jest coś takiego w Pythonie.Mapa korelacji ciepła

Jak mogę to zrobić? Wartości iść od -1 do 1, na przykład:

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

byłem w stanie wyprodukować następującą mapę cieplną w oparciu o inną question, ale problemem jest to, że moje wartości get „cut” na 0, więc chciałbym mieć mapę, która przechodzi od niebieskiego (-1) do czerwonego (1), lub coś podobnego, ale tutaj wartości poniżej 0 nie są przedstawione w odpowiedni sposób.

enter image description here

Oto kod na to:

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

Mam edytowane pytanie więc można sprawdzić. – Marko

Odpowiedz

11

Inną alternatywą jest skorzystanie z funkcji termiczna w Seaborn wykreślić kowariancji. W tym przykładzie użyto zestawu danych Auto z pakietu ISLR w R (taki sam, jak w przykładzie, który pokazano).

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

Jeśli chcesz być jeszcze bardziej wyszukane, można użyć Pandas Style, na przykład:

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
  1. Użyj "mapy" kolorów, aby przejść między niebieskim i czerwonym.
  2. Użyj parametrów pcolor() z parametrami vmin, vmax.

To jest szczegółowo w tej odpowiedzi: https://stackoverflow.com/a/3376734/21974

+0

Czy możesz podać przykład w moim przypadku, nie mam dużego doświadczenia z Pythonem, więc mam z tym problemy. W podanym przykładzie użyli X, Y = np.meshgrid (x, y), nie mam tego? – Marko

+0

Siatka jest właśnie tam, aby przypisać parę współrzędnych do każdego punktu, tak aby była wykreślona jako mapa termiczna. – ypnos

0

późno do partii, ale czułem się jak przyczyniłem się do czegoś, co złożyłem razem, gdy ogłoszono, że zaległy corrplot seaborn ma być przestarzały. Poniższy fragment tworzy przypominający wykres zależności oparty na mapie termicznej seaborn. Możesz także określić zakres kolorów i określić, czy chcesz usunąć powielone korelacje. Zwróć uwagę, że użyłem tych samych numerów co Ty, ale umieściłem je w ramce danych pandy. Jeśli chodzi o wybór kolorów, możesz przejrzeć dokumenty dla 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) 

Oto uzyskany działki:

enter image description here

Pytałeś na niebiesko, ale wypada w zakresie swoich danych przykładowych. Zmień 0.95173379 na -0.95173379 zarówno dla obserwacji i dostaniesz to:

enter image description here