如何在KDE图中定位中位数

21

我正试图使用seaborn绘制核密度估计(KDE)图并定位中位数。 代码大致如下:

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()来从kdeplot中获取中位数x和y值。然后我想用例如vlines绘制它们。但是,我无法弄清楚如何做到这一点。结果应该看起来像这样(显然,这里的黑色中位数条是错误的):

enter image description here

我想我的问题不仅仅与seaborn有关,也适用于其他类型的matplotlib图。非常感谢任何想法。


我有点困惑你的目标是什么。为什么不直接绘制 np.median(data) - mwaskom
1
@mwaskom:我想我试过了。但是KDE中位数不一定与数据中位数重合。那么y值会是多少呢? - n1000
1个回答

26

你需要:

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

结果


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接