Python: 如何为双重直方图在区间边缘对齐柱子

3

我在使用pyplot.hist函数在同一图上绘制2个直方图时遇到了麻烦。 对于每个分bin区间,我希望两个条形图都居中于bin之间(Python 3.6用户)。 为了说明这一点,这里有一个例子:

import numpy as np
from matplotlib import pyplot as plt

bin_width=1

A=10*np.random.random(100)
B=10*np.random.random(100)

bins=np.arange(0,np.round(max(A.max(),B.max())/bin_width)*bin_width+2*bin_width,bin_width)

fig = plt.figure()
ax = fig.add_subplot(111)

ax.hist(A,bins,color='Orange',alpha=0.8,rwidth=0.4,align='mid',label='A')

ax.hist(B,bins,color='Orange',alpha=0.8,rwidth=0.4,align='mid',label='B')

ax.legend()
ax.set_ylabel('Count')

我理解为:

我得到了这个:

直方图_1

A和B系列重叠在一起,这不太好。我知道'align'只有三个选项(左侧bin居中、两个bin的中间、右侧bin居中),所以我认为除了修改bins之外别无选择,可以添加:

bins-=0.25*bin_width 

在绘制 A 并添加之前:
bins+=0.5*bin_width

在绘制B之前,我得到了这个:直方图。这样更好了!但是,我不得不修改分箱方式,所以A和B的分箱不同。我搜索了一种简单的方法来使用相同的分箱,并将第一个和第二个图形移动,使它们在分箱间隔中正确显示,但我没有找到。有什么建议吗?希望我已经清楚地解释了我的问题。

你不能期望像 plt.hist 这样的便利包装能够考虑到可能存在的每种异常情况。由于你有一个两步骤的过程,请将其分开处理。使用 np.histogram 使用任何设置计算直方图。然后使用 plt.bar 使用任何设置绘制结果。 - ImportanceOfBeingErnest
太棒了,现在它可以工作了 :) 谢谢! - Al Menia
1个回答

1
如上面的评论中所提到的,您不需要使用直方图函数。使用numpy的直方图函数,并使用matplotlib的条形图函数绘制结果。
根据bin计数和数据类型计数,您可以计算bin宽度。您可以使用xticks方法调整刻度。
import numpy as np
import matplotlib.pylab as plt

A=10*np.random.random(100)
B=10*np.random.random(100)

bins=20
# calculate heights and bins for both lists
ahist, abins = np.histogram(A, bins)
bhist, bbins = np.histogram(B, abins)

fig = plt.figure()
ax = fig.add_subplot(111)
# calc bin width for two lists
w = (bbins[1] - bbins[0])/3.
# plot bars
ax.bar(abins[:-1]-w/2.,ahist,width=w,color='r')
ax.bar(bbins[:-1]+w/2.,bhist,width=w,color='orange')
# adjsut xticks
plt.xticks(abins[:-1], np.arange(bins))

plt.show()

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接