Python中的手动直方图绘制

4
我正在使用matplotlib制作直方图。
基本上,我想知道是否有办法手动设置箱子以及它们的值,并且仍然可以得到像使用matplotlin直方图制作的结果。以下是我的箱子及其相应的值。
0-7     0.9375
7-13    0.9490740741
13-18   0.8285714286 
18-28   0.880952381
28-37   0.92164903
37-48   0.9345357019
48-112  0.9400368773

这是我实现的条形码

import matplotlib.pyplot as plt
plt.bar(maxlist, mean)
plt.show()

maxlist = [7.0, 13.0, 18.0, 28.0, 37.0, 48.0, 112.0]
mean = [0.9375, 0.94907407407777766, 0.82857142858571442, 0.88095238094999995, 0.92164902996666676, 0.93453570191250002, 0.94003687729000018]

这是上述代码的条形图样式。 histwithoutwidth 我还尝试使用宽度参数进行操作,但在该情况下,条形似乎会重叠,而直方图则不会。
import matplotlib.pyplot as plt
plt.bar(maxlist, mean,width = 6)
plt.show()

enter image description here

我希望柱形图看起来像下面展示的直方图,没有任何重叠。有没有人有任何想法如何在Python / iPython笔记本中实现这一点。enter image description here

你想让条形图的宽度相等,但它们的底部宽度不相等吗?或者你想让一些条更宽以填补空隙吗? - maxymoo
Bins允许您通过传递列表来提供非常特定的箱子。显示不受影响。要了解更多信息,请查看优秀文档中的histtypealignrwidth:http://matplotlib.org/api/pyplot_api.html。 - roadrunner66
@maxymoo 我想要等长的条形图,而不是它们彼此重叠。由于每个箱子的范围不同,因此基础长度不能相等。希望这能澄清你的疑虑。 - piyush
1个回答

5

根据@roadrunner66提供的文档,

matplotlib.pyplot.bar(left, height, width=0.8, bottom=None, hold=None, data=None, **kwargs)

创建一个条形图,其矩形边界为:

leftleft + widthbottombottom + height

(左、右、下和上边缘)

传递给 bar 的第一个参数实际上是“bin”的左边缘。看起来你正在将 maxlist 作为 left 传递,实际上它是你的 bin 的右边缘,这会导致一切都变得奇怪。

import matplotlib.pyplot as plt
import numpy as np
x1 = [0, 7, 13, 18, 28, 37, 48] #left edge
x2 = x1[1::] + [112] #right edge
y = [0.9375, 0.94907407407777766, 0.82857142858571442, 0.88095238094999995, 0.92164902996666676, 0.93453570191250002, 0.94003687729000018]
w = np.array(x2) - np.array(x1) #variable width, can set this as a scalar also
plt.bar(x1, y, width=w, align='edge')
plt.show()

变宽度条形图

条形图的宽度代表左右边缘之间的距离,x1x2。如果您想要恒定的宽度,请将width=w_scalar传递给plt.bar(),其中w_scalar是您的常数bin宽度。如果你想让条形图之间更远,请使width变小。


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