график кривой и гистограмма на одном кадре с matplotlib - PullRequest
0 голосов
/ 16 июня 2019

Я хочу, чтобы кривая и гистограмма сосуществовали на одном графике с matplotlib.Кривая является нормальной кривой, а гистограмма составлена ​​из набора данных.Я хочу сравнить гистограмму (реальное перераспределение моего образца) с кривой (каким должно быть перераспределение моего образца, если у меня была тонна данных).Цель состоит в том, чтобы проверить, есть ли другой фактор, кроме опасности.

Вот код:

def testHistogram(arr, mean, variance):
    from matplotlib import pyplot as plt
    import numpy as np
    import scipy.stats as stats
    import math

    # histogram
    num_bins = 100
    plt.hist(arr, num_bins, facecolor='yellow', alpha=0.5)

    # plot
    mu = mean
    sigma = math.sqrt(variance)
    x = np.linspace(mu - 3*sigma, mu + 3*sigma, 100)
    plt.plot(x, stats.norm.pdf(x, mu, sigma))

    plt.grid(True)
    plt.show()

Моя проблема в том, что кривая не появляется.(Гистограмма работает нормально).

параметры:

  • arr: список значений (пример, который я хочу сравнить с кривой)
  • mean: среднее значение выборки, для построения соответствующей кривой
  • variance: дисперсия выборки, для построения соответствующей кривой

РЕДАКТИРОВАТЬ: Как спросили в комментарии, вот как создать параметры:

#create a dataset for testing - i am getting it from a database 
import random
myList = []
while (i<100):
    randomnumber = random.randint(1,100)
    myList.append(randomnumber)
    i = i+1
#get the mean and variance of the dataset
count = 0
sum = 0
squaresSum = 0
theMean = 0
for onedata in dataset:
    count = count+1
    sum = sum + onedata
    squaressum = squaresSum + onedata*onedata
theMean = sum/count
theVariance = squaresSum/count - theMean*theMean

# launch the function
testHistogram(myList, theMean, theVariance)

1 Ответ

1 голос
/ 16 июня 2019

На самом деле ваш код почти работает, вам просто нужно нормализовать гистограмму. scipy.stats.norm возвращает нормализованную кривую, то есть интеграл кривой равен 1.
В вашем случае вы, вероятно, имеете очень низкую кривую, почти сплющенную на оси x, которую вы не можете видеть.

Чтобы нормализовать гистограмму, просто передайте параметр density = True в функцию hist:

plt.hist(arr, num_bins, density=True, facecolor='yellow', alpha=0.5)

Например, следующий код (небольшая переделка вашего):

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

def testHistogram(arr, mean, variance):
    # histogram
    num_bins = 100
    plt.hist(arr, num_bins, density=True, facecolor='yellow', alpha=0.5)

    # plot
    mu = mean
    sigma = math.sqrt(variance)
    x = np.linspace(mu - 3*sigma, mu + 3*sigma, 100)
    plt.plot(x, stats.norm.pdf(x, mu, sigma))

    plt.grid(True)
    plt.show()


mm = 100  #norm mean valu
vv = 40   #norm variance
#x is an array of 100 random numbers from the normal distribution
x = np.random.normal(mm, math.sqrt(vv), 100)
testHistogram(x, mm, vv)

рисует следующую фигуру:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...