Установка относительной частоты в гистограмме matplotlib

У меня есть данные в виде списка поплавков, и я хочу построить его как гистограмму. Функция 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. Они также зависят от размера ячейки, как будто они не нормализованы размером ячейки или чем-то еще. Тем не менее, когда я устанавливаю cumulative=1, он красиво суммируется до 1. Так в чем же подвох? Кстати, когда я загружаю те же данные в Origin и строю его, он дает мне совершенно правильные дроби. Спасибо!

2 ответов


поскольку нормированная опция hist возвращает плотность точек, e.g 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

или вы можете использовать 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().