Matplotlib: Как сделать две гистограммы одинаковой ширины?

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

В любом случае, я пытаюсь построить две гистограммы на той же фигуре в Matplotlib. Мои два источника данных - это списки из 500 элементов. Чтобы представить иллюстрацию проблемы, с которой я столкнулся, см. Следующее изображение:

Uneven histograms

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

Спасибо заранее!

Ответы

Ответ 1

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

a=np.random.random(100)*0.5 #a uniform distribution
b=1-np.random.normal(size=100)*0.1 #a normal distribution 
bins=np.histogram(np.hstack((a,b)), bins=40)[1] #get the bin edges
plt.hist(a, bins)
plt.hist(b, bins)

enter image description here

Ответ 2

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

plt.hist(x, bins=n, range=(a,b))

где, если вы сохраняете соотношение (b-a)/n одинаково, вы должны иметь те же размеры бункера.

Ответ 3

Вы должны использовать возвращаемые значения hist.

foo = np.random.normal(loc=1, size=100) # a normal distribution
bar = np.random.normal(loc=-1, size=10000) # a normal distribution 
n, bins, patches = plt.hist(foo, bins=50, range=[-6, 6], normed=True)
n, bins, patches = plt.hist(bar, bins=bins, alpha=0.5, normed=True)

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