2015-06-19 19 views
9

Czy istnieje wykres matplotlib lub seaborn, którego mogłem użyć z g.map_lower lub g.map_upper, aby uzyskać współczynnik korelacji wyświetlany dla każdego dwuwymiarowego wykresu, jak pokazano poniżej? Narzędzie plt.text zostało ręcznie odwzorowane, aby uzyskać poniższy przykład, który jest żmudnym procesem.Współczynnik korelacji Seaborn na PairGrid

enter image description here

Odpowiedz

18

Możesz przekazać dowolną funkcję z metodami map_* tak długo, jak wynika kilka zasad: 1) powinna narysowania na „bieżący” osi, 2) powinno zająć dwa wektory jako pozycyjnych argumentów i 3) powinien zaakceptować argument słowa kluczowego color (opcjonalnie używając go, jeśli chcesz być kompatybilny z opcją hue).

Więc w twoim przypadku po prostu trzeba zdefiniować trochę corrfunc funkcję, a następnie map go w poprzek osi chcesz mieć adnotacją:

import numpy as np 
from scipy import stats 
import pandas as pd 
import seaborn as sns 
import matplotlib.pyplot as plt 
sns.set(style="white") 

mean = np.zeros(3) 
cov = np.random.uniform(.2, .4, (3, 3)) 
cov += cov.T 
cov[np.diag_indices(3)] = 1 
data = np.random.multivariate_normal(mean, cov, 100) 
df = pd.DataFrame(data, columns=["X", "Y", "Z"]) 

def corrfunc(x, y, **kws): 
    r, _ = stats.pearsonr(x, y) 
    ax = plt.gca() 
    ax.annotate("r = {:.2f}".format(r), 
       xy=(.1, .9), xycoords=ax.transAxes) 

g = sns.PairGrid(df, palette=["red"]) 
g.map_upper(plt.scatter, s=10) 
g.map_diag(sns.distplot, kde=False) 
g.map_lower(sns.kdeplot, cmap="Blues_d") 
g.map_lower(corrfunc) 

enter image description here

+0

To działało idealnie dziękuję! – wblack