2017-05-25 2 views
1

Ma question est comment est-ce que je corréler mes deux parcelles binned et produire un coefficient de corrélation de Pearson?Python (numpy) - corréler deux parcelles binned

Je ne suis pas sûr comment extraire correctement les tableaux binned nécessaires pour la fonction np.corrcoef. Voici mon script:

import numpy as np 
import matplotlib.pyplot as plt 

A = np.genfromtxt('data1.txt') 
x1 = A[:,1] 
y1 = A[:,2] 

B=np.genfromtxt('data2.txt') 
x2 = B[:,1] 
y2 = B[:,2] 

fig = plt.figure() 
plt.subplots_adjust(hspace=0.5) 
plt.subplot(121) 
AA = plt.hexbin(x1,y1,cmap='jet',gridsize=500,vmin=0,vmax=450,mincnt=1) 
plt.axis([-180,180,-180,180]) 
cb = plt.colorbar() 
plt.title('Data1') 

plt.subplot(122) 
BB = plt.hexbin(x2,y2,cmap='jet',gridsize=500,vmin=0,vmax=450,mincnt=1) 
plt.axis([-180,180,-180,180]) 
cb = plt.colorbar() 
plt.title('Data 2') 

array1 = np.ndarray.flatten(AA) 
array2 = np.ndarray.flatten(BB) 

print np.corrcoef(array1,array2) 

plt.show() 

Répondre

1

La réponse se trouve dans le documentation:

Renvoie: objet

une instance PolyCollection; Utilisez get_array() sur ce PolyCollection pour obtenir les comptes dans chaque hexagone.

est ici une version révisée de votre code:

A = np.genfromtxt('data1.txt') 
x1 = A[:,1] 
y1 = A[:,2] 

B = np.genfromtxt('data2.txt') 
x2 = B[:,1] 
y2 = B[:,2] 

# make figure and axes 
fig, (ax1, ax2) = plt.subplots(1, 2) 

# define common keyword arguments 
hex_params = dict(cmap='jet', gridsize=500, vmin=0, vmax=450, mincnt=1) 

# plot and set titles 
hex1 = ax1.hexbin(x1, y1, **hex_params) 
hex2 = ax2.hexbin(x2, y2, **hex_params) 
ax1.set_title('Data 1') 
ax2.set_title('Data 2') 

# set axes lims 
[ax.set_xlim(-180, 180) for ax in (ax1, ax2)] 
[ax.set_ylim(-180, 180) for ax in (ax1, ax2)] 

# add single colorbar 
fig.subplots_adjust(right=0.8, hspace=0.5) 
cbar_ax = fig.add_axes([0.85, 0.15, 0.05, 0.7]) 
fig.colorbar(hex2, cax=cbar_ax) 

# get binned data and corr coeff 
binned1 = hex1.get_array() 
binned2 = hex2.get_array()  
print np.corrcoef(binned1, binned2) 

plt.show() 

Deux commentaires si: êtes-vous sûr que vous voulez que le coefficient de corrélation pearson? Qu'est-ce que vous essayez réellement de montrer? Si vous souhaitez montrer que les distributions sont identiques/différentes, vous pouvez utiliser un test de Kolmogorov-Smirnov.

N'utilisez pas non plus jet comme palette de couleurs. Jet is bad.

+0

merci pour le script - aussi, merci d'avoir suggéré le test KS, vous avez raison, c'est une façon plus rigoureuse de comparer les distributions. – EA00