Python:绘制直方图,其中y值小于1

2024-06-01 07:30:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个任务,我必须在同一个图中显示瑞利分布的绘图和直方图 (在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

Tags: importplotasnpargplt数组直方图
1条回答
网友
1楼 · 发布于 2024-06-01 07:30:20

我想你是想展示瑞利分布的直方图,在它上面叠加一条代表分布的线。 如果是这样,您需要为直方图生成一些值,因为linspace只是x值的范围。“linspace”对于直方图并没有直接的用处。 要生成对直方图有用的值,可以使用以下Montecarlo方法(必须将其附加到代码中,因为例如“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)

结果图如下所示:

enter image description here

请记住,这是一个近似值

当发电机可用时,另一个可能的解决方案(我刚刚查看了手册)是调用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)

相关问题 更多 >