Python: гистограмма графика, где значения y меньше 1 - PullRequest
2 голосов
/ 24 февраля 2020

У меня есть задача, где я должен отображать график и гистограмму на одном графике для распределения Рэлея (который никогда не достигает 1 на оси Y, для меня самая высокая точка равна 0,30).

У меня есть массив x (линейное пространство от 0 до 10) и вычисленный массив y (рассчитанный по функции Рэлея с двумя аргументами 1,5 и 2).

Я могу легко построить это. Но не может отобразить гистограмму, так как гистограмма никогда не принимает значения меньше 1 (так как x для гистограммы - это то, как часто значение некоторого диапазона x присутствует в масштабе 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

1 Ответ

2 голосов
/ 24 февраля 2020

Я думаю, что вы пытаетесь показать гистограммы распределения Рэлея, на которые вы накладываете линию, представляющую распределение. Если это так, вам нужно сгенерировать некоторые значения для гистограмм, поскольку linspace - это просто диапазон значений x. «гистограмма» не является чем-то полезным для гистограммы. Чтобы сгенерировать значения, полезные для гистограммы, вы можете использовать следующий подход Монте-Карло (который вы ДОЛЖНЫ добавить в свой код, потому что, например, «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)
...