web-dev-qa-db-ja.com

(海生の)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()
_

ご覧のとおり、kdeplotから中央値のx値とy値をフェッチするにはmagic_function()が必要です。それから私はそれらを例えばでプロットしたいと思います。 vlines。しかし、私はそれを行う方法を理解することはできません。結果は次のようになります(明らかに、黒い中央値のバーはここでは間違っています)。

enter image description here

私の質問は、seabornに厳密に関連しているわけではなく、他の種類のmatplotlibプロットにも当てはまると思います。どんなアイデアでも大歓迎です。

18
n1000

必要がある:

  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

22
agomcas