我有一个任务,我必须在同一图中显示瑞利分布的绘图和直方图 (Y 轴永远不会达到 1,对我来说最高点是 0.30)。
我有一个 x 数组(从 0 到 10 的线性空间)和 y 计算数组(通过具有两个参数 1,5 和 2 的瑞利函数计算)。
我可以轻松绘制它。但无法显示直方图,因为直方图永远不会采用小于 1 的值(因为直方图的 x 是某个 x 范围的值在 y 刻度上出现的频率)。
您能提供一些建议吗?
这里是代码示例: (我想我必须以某种方式计算 y 上的 x 次机会,对吧?这就是我想念的?)
使用瑞利分布:https://en.wikipedia.org/wiki/Rayleigh_distribution
import math
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import rayleigh
RAYLEIGH_LOW_LIMIT = 0
RAYLEIGH_HIGH_LIMIT = 10
RAYLEIGH_ARG_1 = 0.7
RAYLEIGH_ARG_2 = 2
# Part 1: Make selection of size 1000
# Build histogramm and theoretical density
selection = np.linspace(RAYLEIGH_LOW_LIMIT, RAYLEIGH_HIGH_LIMIT, num=1000)
y = rayleigh.pdf(selection, RAYLEIGH_ARG_1, RAYLEIGH_ARG_2)
plt.plot(selection, y, "r-", label="Density")
plt.hist(selection, bins=10, density=True, label="Histogram", rwidth=0.1)
plt.show() # to display plot
最佳答案
我认为您正在尝试显示瑞利分布的直方图,在该直方图上叠加一条代表分布的线。 如果是这样,您需要为直方图生成一些值,因为 linspace 只是 x 值的范围。 “linspace”并不是直接对直方图有用的东西。 要生成对直方图有用的值,您可以使用以下蒙特卡洛方法(您必须附加到代码中,因为例如“y”是在代码中定义的)。
import random
maxy=max(y)
lval=[]
for i in range(10000):
## pick a random y belonging to selection
xv=random.choice(selection)
yv=random.random()*maxy
yral=rayleigh.pdf(xv, RAYLEIGH_ARG_1, RAYLEIGH_ARG_2)
if(yv<=yral):
lval.append(xv)
plt.plot(selection, y, "r-", label="Density")
plt.hist(lval, bins=10, density=True, label="Histogram", rwidth=0.1)
结果图如下:
请记住,这是一个近似值。
当生成器可用时,另一个可能的解决方案(我刚刚查看了手册)是调用 rvs。
r=rayleigh.rvs(loc=RAYLEIGH_ARG_1, scale=RAYLEIGH_ARG_2, size=1000)
plt.plot(selection, y, "r-", label="Density")
plt.hist(r, bins=10, density=True, label="Histogram", rwidth=0.1)
关于Python:绘制直方图,其中 y 值小于 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60377459/