温馨提示:本文翻译自stackoverflow.com,查看原文请点击:python - rayleigh distribution curve on histogram
matplotlib python scipy

python - 直方图上的瑞利分布曲线

发布于 2020-04-18 13:04:05

我有一个在V_x和V_y方向上的速度数据数组。我使用以下代码绘制了速度范数的直方图,

plt.hist(V_norm_hist, bins=60, density=True, rwidth=0.95)

如下图所示: 速度范式直方图

现在,我还想在此之上添加瑞利分布曲线,但是我无法使其正常工作。我一直在尝试使用scipy.stats.rayleigh进行不同的组合,但是scipy主页并不是很直观,因此我无法使其正常运行...这些行的确切含义

mean, var, skew, kurt = rayleigh.stats(moments='mvsk')

x = np.linspace(rayleigh.ppf(0.01),rayleigh.ppf(0.99), 100)
ax.plot(x, rayleigh.pdf(x),'r-', lw=5, alpha=0.6, label='rayleigh pdf')

做?

查看更多

提问者
Birks
被浏览
21
JohanC 2020-02-05 03:09

您可能需要先点击到的链接rv_continuous该链接rayleigh是的子类。然后从那里ppf找出ppf“百分比点函数”。x0 = ppf(0.01)告诉所有小于该点的所有东西x0累积在其总“权重”的1%处,类似地,x1 = ppf(0.99)也是该点累积 99%的“权重”的地方。np.linspace(x0, x1, 100)以100个短间隔将x0到x1的空间划分。由于连续分布可以是无限的,因此需要这些x0和x1限制来仅显示有趣的间隔。

rayleigh.pdf(x)在x处给出pdf因此,表明每个x的可能性。

rayleigh.stats(moments='mvsk')力矩由字母['mvsk']组成,其中定义了要计算的力矩:'m'= 均值,'v'= 方差,'s'= (费舍尔)偏斜,'k'= (费舍尔)峰度

要在同一图上绘制直方图和分布图,我们需要知道与样本(locscale相对应的Raleigh参数此外,pdf和直方图都需要相同x和相同y对于x我们,我们可以采用直方图箱的极限。对于y,我们可以放大pdf,知道pdf的总面积应为1。直方图bin与条目数成正比。

如果你知道的loc0,但不知道scale维基百科的文章给出了连接一个公式scale来样的意思是:

estimated_rayleigh_scale = samples.mean() / np.sqrt(np.pi / 2)

假设一个loc0scale0.08代码将如下所示:

from matplotlib import pyplot as plt
import numpy as np
from scipy.stats import rayleigh

N = 1000
# V = np.random.uniform(0, 0.1, 2*N).reshape((N,2))
# V_norm = (np.linalg.norm(V, axis=1))
scale = 0.08
V_norm_hist = scale * np.sqrt( -2* np.log (np.random.uniform(0, 1, N)))
fig, ax = plt.subplots(1, 1)

num_bins = 60
_binvalues, bins, _patches = plt.hist(V_norm_hist, bins=num_bins, density=False, rwidth=1, ec='white', label='Histogram')
x = np.linspace(bins[0], bins[-1], 100)
binwidth = (bins[-1] - bins[0]) / num_bins

scale = V_norm_hist.mean() / np.sqrt(np.pi / 2)

plt.plot(x, rayleigh(loc=0, scale=scale).pdf(x)*len(V_norm_hist)*binwidth, lw=5, alpha=0.6, label=f'Rayleigh pdf (s={scale:.3f})')
plt.legend()
plt.show()

样例