библиотек matplotlib нормированных гистограмм

Я пытаюсь нарисовать часть гистограммы с помощью matplotlib.

вместо того, чтобы рисовать всю гистограмму, которая имеет много выбросов и больших значений, я хочу сосредоточиться только на небольшой части. Исходная гистограмма выглядит так:

hist(data, bins=arange(data.min(), data.max(), 1000), normed=1, cumulative=False)
plt.ylabel("PDF")

enter image description here

и после фокусировки это выглядит так:

hist(data, bins=arange(0, 121, 1), normed=1, cumulative=False)
plt.ylabel("PDF")

enter image description here

обратите внимание, что последний бункер растягивается и худший из всех ТИКов y масштабируется так, что сумма точно 1 (таким образом, точки из текущего диапазона вообще не учитываются)

Я знаю, что могу достичь того, что хочу, рисуя гистограмму по всему возможному диапазону, а затем ограничивая ось интересующей меня частью, но она тратит много времени на вычисление бункеров, которые я все равно не буду использовать/видеть.

hist(btsd-40, bins=arange(btsd.min(), btsd.max(), 1), normed=1, cumulative=False)
axis([0,120,0,0.0025])

enter image description here

есть ли быстрый и простой способ нарисовать только сфокусированную область, но все же получить шкалу Y правильно?

2 ответов


чтобы построить подмножество гистограммы, я не думаю, что вы можете обойти вычисление всей гистограммы.

вы пытались вычислить гистограмму с помощью numpy.histogram а затем построение области с помощью pylab.plot или что-то? Т. е.

import numpy as np
import pylab as plt

data = np.random.normal(size=10000)*10000

plt.figure(0)
plt.hist(data, bins=np.arange(data.min(), data.max(), 1000))

plt.figure(1)
hist1 = np.histogram(data, bins=np.arange(data.min(), data.max(), 1000))
plt.bar(hist1[1][:-1], hist1[0], width=1000)

plt.figure(2)
hist2 = np.histogram(data, bins=np.arange(data.min(), data.max(), 200))
mask = (hist2[1][:-1] < 20000) * (hist2[1][:-1] > 0)
plt.bar(hist2[1][mask], hist2[0][mask], width=200)

оригинальный гистограммы: Original histogram

гистограмма рассчитывается вручную: Histogram calculated manually

гистограмма рассчитана вручную, обрезана: Histogram calculated manually, cropped (Б. Н.: значения меньше, потому что бункеры уже)


Я думаю, вы можете нормализовать свои данные, используя заданный вес. (repeat является функцией numpy).

hist(data, bins=arange(0, 121, 1), weights=repeat(1.0/len(data), len(data)))