如何在(seaborn)KDE 图中找到中位数?
How to locate the median in a (seaborn) KDE plot?
我正在尝试用 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 图。非常感谢任何想法。
您需要:
- 提取kde行的数据
- 对其进行积分以计算累积分布函数 (CDF)
- 求出使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()
我正在尝试用 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 图。非常感谢任何想法。
您需要:
- 提取kde行的数据
- 对其进行积分以计算累积分布函数 (CDF)
- 求出使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()