Python 如何在(seaborn)KDE图中定位中间带?

Python 如何在(seaborn)KDE图中定位中间带?,python,matplotlib,plot,seaborn,Python,Matplotlib,Plot,Seaborn,我正试着和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_m

我正试着和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_函数()
kdeplot
中获取中值x和y值。然后我想用例如
vlines
来绘制它们。然而,我不知道该怎么做。结果应该是这样的(很明显,黑色中间条是错误的):

我猜我的问题与seaborn没有严格的关系,也适用于其他类型的matplotlib地块。非常感谢您的任何想法。

您需要:

  • 提取kde行的数据
  • 将其积分以计算累积分布函数(CDF)
  • 找到使CDF等于1/2的值,即中值

  • 我对你的目标有点困惑。你为什么不画出
    np.中间值(数据)
    ?@mwaskom:我想我试过了。但KDE中位数不一定与数据中位数一致。y值是多少?
    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()