#python #matplotlib #normal-distribution
#python #matplotlib #normal-distribution
Вопрос:
Я хочу построить гистограмму для нормального распределения, а также нанести на нее соответствующее нормальное распределение. В Интернете доступно несколько примеров, касающихся нормальных распределений с осью y, нормализованной с помощью density=True
. В моем примере я пытаюсь сформировать кривую нормального распределения без нормализации типа плотности. Возможно, это может быть математический вопрос неявно, но я не мог понять, как «ненормализовать» кривую распределения. Ниже приведен мой код:
import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt
mu = 1e-3
std = 1.0e-4
nsize = 10000
ymax = 5000
# Generate some data for this demonstration.
data = norm.rvs(mu, std, size=nsize)
# Plot the histogram.
plt.hist(data, bins=20, color='b', edgecolor='black')
# Plot the PDF.
xmin, xmax = [0.5e-3, 1.5e-3] #plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = norm.pdf(x, mu, std) # something to do with this line
plt.plot(x, p, 'k', linewidth=2)
plt.axvline(mu, linestyle='dashed', color='black')
plt.ylim([0, ymax])
Это приводит к следующему графику.
Как можно видеть, область под гистограммой будет равна 10000 ( nsize
), что является количеством точек данных. Однако с «кривой распределения» это не так. Как добиться соответствия кривой гистограмме?
Ответ №1:
Похоже, что plt
возвращает hist
значение, равное nsize
. Итак, мы можем просто масштабировать p
:
# Plot the histogram.
hist, bins, _ = plt.hist(data, bins=20, color='b', edgecolor='black')
# Plot the PDF.
xmin, xmax = [0.5e-3, 1.5e-3] #plt.xlim()
# changes here
p = norm.pdf(bins, mu, std)
plt.plot(bins, p/p.sum() * nsize , 'r', linewidth=2)
Вывод:
Комментарии:
1. Нет, я не хочу устанавливать
density=True
. Это не суть этого вопроса. Я хочу, чтобы кривая соответствовалаdensity=False
случаю гистограммы2. @SKPS Извините, я неправильно понял вопрос. Смотрите обновленный ответ.
3. Большое спасибо. Не могли бы вы немного подробнее остановиться на
hist.sum()
части? Я знаю, что он вычисляет сумму гистограммы, но котораяhist
используется здесь?plt.hist
илиnumpy
? Не могли бы вы уточнить ответ с дополнительным кодом, пожалуйста?4. Или, если вы вставите полный код куда-нибудь, было бы полезно
5. Извините, в моем коде
hist, bins, _ = plt.hist(...)
. Как уже было сказано,hist.sum() == nsize
. Так что вы можете просто заменить его наnsize
.