2015-03-10 5 views
6

Ich versuche, eine Kernel Density Estimation (KDE) plot mit Seaborn zu tun und den Median zu finden. Der Code sieht etwa so aus:Wie finde ich den Median in einem (Seaborn) KDE-Plot?

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() 

Wie Sie kann ich eine magic_function() benötigen finden Sie in der Median-x und y-Werte aus der kdeplot zu holen. Dann würde ich sie gerne mit z. vlines. Allerdings kann ich nicht herausfinden, wie das geht. Das Ergebnis sollte in etwa so aussehen (natürlich die schwarze mittlere Bar ist hier falsch):

enter image description here

ich meine Frage erraten ist nicht streng auf Seaborn und gilt auch für andere Arten von matplotlib Parzellen zusammen. Irgendwelche Ideen werden sehr geschätzt.

+0

Ich bin ein wenig verwirrt über Ihr Ziel. Warum machst du nicht gerade 'np.median (data)'? – mwaskom

+1

@mwaskom: Ich denke, ich habe das versucht. aber der KDE-Median stimmt nicht unbedingt mit dem Datenmedian überein. Und was wäre der y-Wert? – n1000

Antwort

12

Sie müssen:

  1. die Daten der kde Linie Extract
  2. es Integrieren Sie die kumulative Verteilungsfunktion (CDF)
  3. Finden Sie den Wert, der CDF macht gleich 1/2 zu berechnen, dass ist der Median
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

ausgezeichnete Lösung! – n1000

+1

Wie können Sie diese Lösung verwenden, um das gleiche zu tun? – Tminer