Как нормализовать гистограмму в python?
Я пытаюсь построить нормированную гистограмму, но вместо того, чтобы получить 1 как максимальное значение по оси y, я получаю разные числа.
Для массива k=(1,4,3,1)
import numpy as np
def plotGraph():
import matplotlib.pyplot as plt
k=(1,4,3,1)
plt.hist(k, normed=1)
from numpy import *
plt.xticks( arange(10) ) # 10 ticks on x axis
plt.show()
plotGraph()
Я получаю эту гистограмму, которая не выглядит как нормированная.

Для другого массива k=(3,3,3,3)
import numpy as np
def plotGraph():
import matplotlib.pyplot as plt
k=(3,3,3,3)
plt.hist(k, normed=1)
from numpy import *
plt.xticks( arange(10) ) # 10 ticks on x axis
plt.show()
plotGraph()
Я получаю эту гистограмму с максимальным значением y-10.

Для разных k я получаю разное максимальное значение y, даже если normed=1 или normed=True.
Почему нормализация (если она работает) изменяется на основе данных, и как я могу сделать максимальное значение y равным 1?
Обновление:
Я пытаюсь реализовать Ответ Карстена Кенига из построения гистограмм, высота бара которых равна 1 в matplotlib и получаю очень странный результат:
import numpy as np
def plotGraph():
import matplotlib.pyplot as plt
k=(1,4,3,1)
weights = np.ones_like(k)/len(k)
plt.hist(k, weights=weights)
from numpy import *
plt.xticks( arange(10) ) # 10 ticks on x axis
plt.show()
plotGraph()
Результат:

Что я делаю не так?
Спасибо
5 ответов:
Когда вы строите нормализованную гистограмму, это не высота, которая должна суммироваться до единицы, а область под кривой должна суммироваться до единицы:
In [44]: import matplotlib.pyplot as plt k=(3,3,3,3) x,bins,p=plt.hist(k, normed=1) from numpy import * plt.xticks( arange(10) ) # 10 ticks on x axis plt.show() In [45]: print bins [ 2.5 2.6 2.7 2.8 2.9 3. 3.1 3.2 3.3 3.4 3.5]Здесь, в этом примере, ширина ячейки равна 0,1, площадь под кривой равна единице (0,1*10).
Чтобы сумма высот равнялась 1, Перед
plt.show()добавьте следующее:for item in p: item.set_height(item.get_height()/sum(x))
Один из способов-получить вероятности самостоятельно, а затем построить график с
plt.bar:In [91]: from collections import Counter ...: c=Counter(k) ...: print c Counter({1: 2, 3: 1, 4: 1}) In [92]: plt.bar(prob.keys(), prob.values()) ...: plt.show()Результат:
Нормированная гистограмма определяется таким образом, что сумма произведений ширины и высоты каждого столбца равна общему счету. Вот почему вы не получаете свой Макс равным единице.
Однако, если вы все еще хотите заставить его быть 1, Вы можете использовать numpy и matplotlib.pyplot.бар следующим образом
sample = np.random.normal(0,10,100) #generate bins boundaries and heights bin_height,bin_boundary = np.histogram(sample,bins=10) #define width of each column width = bin_boundary[1]-bin_boundary[0] #standardize each column by dividing with the maximum height bin_height = bin_height/float(max(bin_height)) #plot plt.bar(bin_boundary[:-1],bin_height,width = width) plt.show()
Вы можете использовать решение, описанное здесь:
weights = np.ones_like(myarray)/float(len(myarray)) plt.hist(myarray, weights=weights)
Как строчки выше:
weights = np.ones_like(myarray)/float(len(myarray)) plt.hist(myarray, weights=weights)Должно ли работать, когда у меня есть такая сложенная гистограмма?-
n, bins, patches = plt.hist([from6to10, from10to14, from14to18, from18to22, from22to6], label= ['06:00-10:00','10:00-14:00','14:00-18:00','18:00- 22:00','22:00-06:00'], stacked=True,edgecolor='black', alpha=0.8, linewidth=0.5, range=(np.nanmin(ref1arr), stacked=True,edgecolor='black', alpha=0.8, linewidth=0.5, range=(np.nanmin(ref1arr), np.nanmax(ref1arr)), bins=10)


Comments