【问题标题】:How to locate the median in a (seaborn) KDE plot?如何在(seaborn)KDE图中定位中位数?
【发布时间】:2015-03-10 05:17:26
【问题描述】:

我正在尝试使用 seaborn 进行Kernel Density Estimation (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()

如您所见,我需要一个 magic_function() 来从 kdeplot 中获取 x 和 y 的中值。然后我想用例如绘制它们vlines。但是,我不知道该怎么做。结果应该是这样的(显然黑色的中值条在这里是错误的):

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

【问题讨论】:

  • 我对你的目标有点困惑。你为什么不只是绘制np.median(data)
  • @mwaskom:我想我试过了。但 KDE 中位数不一定与数据中位数一致。 y 值是多少?

标签: python matplotlib plot seaborn


【解决方案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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 2021-09-16
    • 2020-06-02
    • 2020-08-30
    • 2021-09-29
    • 2019-03-26
    相关资源
    最近更新 更多