Python - Как получить одинаковый максимум на нескольких гистограммах - PullRequest
0 голосов
/ 28 июня 2018

У меня два распределения с разным спредом, скажем

a=N.random.normal(0,0.5,500)      
b=N.random.normal(1,3.,500)

Я хочу составить гистограмму из них, где максимум находится на том же уровне.

Если я сделаю нормализованные гистограммы с параметром density = True, это приведет к тому, что площадь обеих гистограмм будет равна 1, но это не изменит того факта, что максимумы отличаются.

P.hist(a, histtype='step', lw=2, cumulative=True)
P.hist(b, histtype='step', color='r', lw=2, density=True)

normalized histo

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

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Я не уверен, что я бы сделал это действительно, но если вы хотите, я думаю, что лучший способ - это добавить две оси (также, чтобы вы могли видеть, насколько они в действительности высокие). Например, см. Здесь: https://matplotlib.org/gallery/api/two_scales.html

import numpy as np
from matplotlib import pyplot as plt
fig, ax1 = plt.subplots()
ax1.hist(a, histtype='step', color='b', lw=2, density=True)
ax1.tick_params(axis='y', labelcolor='b')
ax2 = ax1.twinx()
ax2.hist(b, histtype='step', color='r', lw=2, density=True)
ax2.tick_params(axis='y', labelcolor='r')

Это дает следующий вывод (который, я думаю, выглядит хуже, чем тот, который вы получили; я также изменил кумулятивный = True на плотность = True на первом графике, чтобы соответствовать графику, который вы предоставили):

enter image description here

Кроме того, строго говоря, это не гарантирует, что максимумы действительно идентичны. Если вы хотите сделать это, вы можете форсировать это, например,

import numpy as np
from matplotlib import pyplot as plt
fig, ax1 = plt.subplots()
n1, _, _ = ax1.hist(a, histtype='step', color='b', lw=2, density=True)
ax1.tick_params(axis='y', labelcolor='b')
ax2 = ax1.twinx()
n2, _, _ = ax2.hist(b, histtype='step', color='r', lw=2, density=True)
ax2.tick_params(axis='y', labelcolor='r')
ax1.set_ylim([0, n1.max()*1.1])
ax2.set_ylim([0, n2.max()*1.1])
0 голосов
/ 28 июня 2018

Следующий код даст a то же значение, что и b:

a *= b.max()/a.max()

Кумулятивный флаг в a может нарушить это, и он должен быть размещен до генерации гистограмм.

...