如何找到(seaborn)KDE图中的中位数?

时间:2015-03-10 05:17:27

标签: python matplotlib plot seaborn

我正在尝试使用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。但是,我无法弄清楚如何做到这一点。结果看起来应该是这样的(显然黑色中间条在这里是错误的):

enter image description here

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

1 个答案:

答案 0 :(得分:19)

你需要:

  1. 提取kde行的数据
  2. 将其整合以计算累积分布函数(CDF)
  3. 找到使CDF等于1/2的值,即中位数
  4. 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