Как нормализовать гистограмму в 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()


Результат:



Введите описание изображения здесь



Что я делаю не так?



Спасибо

2650   5  

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

    Ничего не найдено.