Установка относительной частоты в гистограмме matplotlib - PullRequest
22 голосов
/ 19 марта 2012

У меня есть данные в виде списка с плавающей точкой, и я хочу построить их в виде гистограммы.Функция Hist () отлично подходит для построения абсолютной гистограммы.Тем не менее, я не могу понять, как представить его в формате относительной частоты - я бы хотел, чтобы он был в виде дроби или в идеале в виде процента на оси Y.

Вот код:

fig = plt.figure()
ax = fig.add_subplot(111)
n, bins, patches = ax.hist(mydata, bins=100, normed=1, cumulative=0)
ax.set_xlabel('Bins', size=20)
ax.set_ylabel('Frequency', size=20)
ax.legend

plt.show()

Я думал, что аргумент normed = 1 сделает это, но он дает дроби, которые слишком велики, а иногда и больше 1. Они также, похоже, зависят от размера ячейки, как если бы они не были нормализованы ячейкойразмер или что-то.Тем не менее, когда я устанавливаю кумулятивный = 1, он приятно суммирует до 1. Итак, где же подвох?Кстати, когда я передаю те же данные в Origin и строю их, они дают мне совершенно правильные дроби.Спасибо!

Ответы [ 2 ]

33 голосов
/ 19 марта 2012

Поскольку нормированная опция исторических возвращает плотность точек, например, dN / dx

Вам нужно что-то вроде этого:

 # assuming that mydata is an numpy array
 ax.hist(mydata, weights=np.zeros_like(data) + 1. / data.size)
 # this will give you fractions
4 голосов
/ 19 марта 2012

Или вы можете использовать set_major_formatter для настройки масштаба оси y следующим образом:

from matplotlib import ticker as tick

def adjust_y_axis(x, pos):
    return x / (len(mydata) * 1.0)

ax.yaxis.set_major_formatter(tick.FuncFormatter(adjust_y_axis))

просто позвоните adjust_y_axis, как указано выше plt.show().

...