нормализовать гистограмму с размером бункера [дубликат]

Имейте в виду, что независимо от сценария причина всегда одинакова в .NET:

Вы пытаетесь использовать ссылочную переменную, значение которой Nothing / null. Если для ссылочной переменной значение Nothing / null, это означает, что на самом деле оно не содержит ссылку на экземпляр любого объекта, который существует в куче.

Вы либо никогда не присваивали какую-либо переменную, никогда не создавали экземпляр значения, присвоенного переменной, или вы вручную устанавливали переменную, равную Nothing / null, или вы вызывали функцию, которая установите для этой переменной значение Nothing / null.

58
задан user248237dfsf 5 October 2010 в 19:21
поделиться

4 ответа

Было бы более полезно, если бы вы представили более полный рабочий (или в этом случае нерабочий) пример.

Я попробовал следующее:

import numpy as np
import matplotlib.pyplot as plt

x = np.random.randn(1000)

fig = plt.figure()
ax = fig.add_subplot(111)
n, bins, rectangles = ax.hist(x, 50, density=True)
fig.canvas.draw()
plt.show()

Это будет действительно выводит гистограмму гистограммы с осью y, которая идет от [0,1].

Далее, согласно документации hist (т.е. ax.hist? из ipython), я думаю, что сумма тоже отлично:

*normed*:
If *True*, the first element of the return tuple will
be the counts normalized to form a probability density, i.e.,
``n/(len(x)*dbin)``.  In a probability density, the integral of
the histogram should be 1; you can verify that with a
trapezoidal integration of the probability density function::

    pdf, bins, patches = ax.hist(...)
    print np.sum(pdf * np.diff(bins))

Предоставляя эту попытку после приведенных выше команд:

np.sum(n * np.diff(bins))

Я получаю возвращаемое значение 1.0, как и ожидалось. Помните, что normed=True не означает, что сумма значения на каждом баре будет равна единице, а интеграл по барам равен единице. В моем случае np.sum(n) вернулся приблизительно 7.2767.

40
ответ дан InLaw 27 August 2018 в 15:43
поделиться

Я знаю, что этот ответ слишком поздний, учитывая, что вопрос датирован 2010 годом, но я столкнулся с этим вопросом, поскольку сам столкнулся с подобной проблемой. Как уже было сказано в ответе, normed = True означает, что общая площадь под гистограммой равна 1, но сумма высот не равна 1. Однако я хотел, для удобства физической интерпретации гистограммы, сделать один с суммой высот, равной 1.

Я нашел подсказку в следующем вопросе - Python: гистограмма с областью, нормированной на что-то отличное от 1

Но Я не смог найти способ сделать бары, имитирующие histtype = "step" feature hist (). Это отвлекло меня от: Matplotlib - ступенчатая гистограмма с уже закодированными данными

Если сообщество сочтет это приемлемым, я хотел бы предложить решение, которое синтезирует идеи из обоих вышеперечисленных сообщений.

import matplotlib.pyplot as plt

# Let X be the array whose histogram needs to be plotted.
nx, xbins, ptchs = plt.hist(X, bins=20)
plt.clf() # Get rid of this histogram since not the one we want.

nx_frac = nx/float(len(nx)) # Each bin divided by total number of objects.
width = xbins[1] - xbins[0] # Width of each bin.
x = np.ravel(zip(xbins[:-1], xbins[:-1]+width))
y = np.ravel(zip(nx_frac,nx_frac))

plt.plot(x,y,linestyle="dashed",label="MyLabel")
#... Further formatting.

Это чудесно работало для меня, хотя в некоторых случаях я заметил, что левый самый «бар» или правый «бар» гистограммы не закрывается, касаясь нижней точки ось Y. В таком случае добавление элемента 0 в попрошайничество или конец y достигло необходимого результата.

Просто подумал, что поделюсь своим опытом. Спасибо.

16
ответ дан Community 27 August 2018 в 15:43
поделиться

Если вы хотите, чтобы сумма всех баров была равна единице, вес каждого бункера по общему количеству значений:

weights = np.ones_like(myarray)/float(len(myarray))
plt.hist(myarray, weights=weights)

Надеюсь, что это помогает, хотя поток довольно старый ...

161
ответ дан Moot 27 August 2018 в 15:43
поделиться

Вот еще одно простое решение с использованием метода np.histogram().

myarray = np.random.random(100)
results, edges = np.histogram(myarray, normed=True)
binWidth = edges[1] - edges[0]
plt.bar(edges[:-1], results*binWidth, binWidth)

Вы действительно можете проверить, что суммарные суммы до 1 с помощью:

> print sum(results*binWidth)
1.0
9
ответ дан Yuri Brovman 27 August 2018 в 15:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: