Как найти медиану на участке (seaborn) KDE?

Я пытаюсь сделать оценка плотности ядра (KDE) участок С seaborn и найдите медиану. Код выглядит примерно так:

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

как вы можете видеть, мне нужно magic_function() чтобы получить медианные значения x и y из kdeplot. Тогда я хотел бы построить их с помощью, например,vlines. Однако я не могу понять, как это сделать. Результат должен выглядеть примерно так (очевидно, что черная медиана неправильна здесь):

enter image description here

Я думаю, что мой вопрос не связан строго с seaborn, а также относится к другим видам сюжетов matplotlib. Любые идеи очень ценятся.

1 ответов


вам нужно:

  1. извлечение данных из строки kde
  2. интегрируйте его для вычисления кумулятивной функции распределения (CDF)
  3. найти значение, которое делает CDF равным 1/2, то есть медиана
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