Matplotlib.pyplot.bar似乎产生不正确的结果

时间:2019-05-16 13:56:27

标签: python matplotlib

我正在尝试在matplotlib中制作一个条形图,但是看起来有些不正确:

import numpy as np
import matplotlib.pyplot as plt

bins = np.linspace(0, 1, 10) 

print(bins) # = [0. 0.11 0.22 0.33 0.44 0.55 0.66 0.77 0.88 1.]

plt.bar(bins, bins)

enter image description here

我希望两个轴上的楼梯从0:1开始-我错过了什么吗?任何建议都会有所帮助!

我正在使用matplotlib 3.0.3:

pip freeze | grep matplotlib
# returns matplotlib==3.0.3

2 个答案:

答案 0 :(得分:3)

当您执行plt.bar时,条形宽度默认为 1 0.8(感谢@Cohan),所以条形彼此重叠可以在您的图片中看到最后一个栏。

更改为plt.bar(bins, bins, width=0.1)会产生:

enter image description here

答案 1 :(得分:1)

虽然其他答案指出了问题,但您可能会很感兴趣,因为您知道可以根据以下数据点的数量来调整宽度,而不是手动指定宽度。

P。 S:尤其是,当您的数据范围介于0到1之间时,width = 1.0/(len(bins) + 1)是一个更好的选择。有关通用公式,请参见下文。计算宽度时分母中的常量+1是一个选择问题。您也可以选择2、3等,以使宽度变薄。

import numpy as np
import matplotlib.pyplot as plt

bins = np.linspace(0, 1, 10) 
width = 1.0/(len(bins) + 1)

plt.bar(bins, bins, width=width)
plt.show()

enter image description here

为了使它更笼统,我想出了这个公式。即使您的数据超出0和1,这也将起作用

width = (max(bins) - min(bins)) * 1.0/(len(bins) + 1)