2015-03-10 4 views
6

Sto provando a fare un Kernel Density Estimation (KDE) plot con il marino e individuare la mediana. Il codice simile a questa:Come localizzare la mediana in un complotto KDE (nato in mare)?

import seaborn as sns 
import numpy as np 
import matplotlib.pyplot as plt 

sns.set_palette("hls", 1) 
data = np.random.randn(30) 
sns.kdeplot(data, shade=True) 

# x_median, y_median = magic_function() 
# plt.vlines(x_median, 0, y_median) 

plt.show() 

Come potete vedere ho bisogno di un magic_function() per andare a prendere la mediana valori xey dal kdeplot. Quindi mi piacerebbe tracciarli con ad es. vlines. Tuttavia, non riesco a capire come farlo. Il risultato dovrebbe essere simile a questo (ovviamente la barra mediana nero è sbagliato qui):

enter image description here

Credo che la mia domanda non è strettamente correlata alla Seaborn e vale anche per altri tipi di trame matplotlib. Qualsiasi idea è molto apprezzata.

+0

Sono un po 'confuso sul tuo obiettivo. Perché non stai semplicemente tracciando 'np.median (data)'? – mwaskom

+1

@mwaskom: Penso di averlo provato. ma la mediana di KDE non coincide necessariamente con la mediana dei dati. E quale sarebbe il valore y? – n1000

risposta

12

è necessario:

  1. estrarre i dati della linea di KDE
  2. integrarlo per calcolare la funzione di distribuzione cumulativa (CDF)
  3. Trova il valore che fa CDF uguali 1/2, che è la mediana
import numpy as np 
import scipy 
import seaborn as sns 
import matplotlib.pyplot as plt 

sns.set_palette("hls", 1) 
data = np.random.randn(30) 
p=sns.kdeplot(data, shade=True) 

x,y = p.get_lines()[0].get_data() 

#care with the order, it is first y 
#initial fills a 0 so the result has same length than x 
cdf = scipy.integrate.cumtrapz(y, x, initial=0) 

nearest_05 = np.abs(cdf-0.5).argmin() 

x_median = x[nearest_05] 
y_median = y[nearest_05] 

plt.vlines(x_median, 0, y_median) 
plt.show() 

Result

+0

soluzione eccellente! – n1000

+1

Come si può usare questa soluzione per fare lo stesso per la media? – Tminer