我有两套不同的尺寸,我想在同一直方图上绘制。然而,由于一组具有~330,000个值而另一组具有大约~16,000个值,因此它们的频率直方图难以比较。我想绘制比较两组的直方图,使得y轴是该区域中出现的百分比。我的代码接近于此,除了将各个bin值总和为1.0,而直方图的积分总和为1.0(这是因为normed = True参数)。
我如何实现目标?我已经尝试过手动计算%频率并使用plt.bar()但不是覆盖图,而是将图并排比较。我想保持alpha = 0.5
的效果unsigned long int
答案 0 :(得分:8)
在这种情况下,您似乎不想要normed
/ density
kwarg。您已使用weights
。如果你将权重乘以100并省略normed=True
选项,你应该得到你的想法。
例如:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1)
x = np.random.normal(5, 2, 10000)
y = np.random.normal(2, 1, 3000000)
xweights = 100 * np.ones_like(x) / x.size
yweights = 100 * np.ones_like(y) / y.size
fig, ax = plt.subplots()
ax.hist(x, weights=xweights, color='lightblue', alpha=0.5)
ax.hist(y, weights=yweights, color='salmon', alpha=0.5)
ax.set(title='Histogram Comparison', ylabel='% of Dataset in Bin')
ax.margins(0.05)
ax.set_ylim(bottom=0)
plt.show()
另一方面,您当前正在做的事情(weights
和normed
)会产生(请注意y轴上的单位):
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1)
x = np.random.normal(5, 2, 10000)
y = np.random.normal(2, 1, 3000000)
xweights = 100 * np.ones_like(x) / x.size
yweights = 100 * np.ones_like(y) / y.size
fig, ax = plt.subplots()
ax.hist(x, weights=xweights, color='lightblue', alpha=0.5, normed=True)
ax.hist(y, weights=yweights, color='salmon', alpha=0.5, normed=True)
ax.set(title='Histogram Comparison', ylabel='% of Dataset in Bin')
ax.margins(0.05)
ax.set_ylim(bottom=0)
plt.show()