matplotlib的直方图`hist`中存在空白

3

我正在学习一门关于Python的在线课程。以下是代码,未经修改。它执行了100次随机步行的Monte Carlo重复,每次10步。

import numpy as np
import matplotlib.pyplot as plt
np.random.seed(123)
final_tails = []
for x in range(100) :
   tails = [0]
   for x in range(10) :
      coin = np.random.randint(0, 2)
      tails.append(tails[x] + coin)
   final_tails.append(tails[-1])
plt.hist(final_tails, bins = 10)
plt.show()

这个课程说我应该得到没有间隙的图表。我的柱状图高度完全相同,顺序也完全相同,但它们之间有一些奇怪的间距。

有人能证实这个结果或解释一下吗?

enter image description hereenter image description here

我正在使用:
  • Python 3.7.1 64位
  • Windows 7 64位
  • Spyder 3.3.2
谢谢。 附言 我注意到,与课程中的相邻条形图不同,我的箱边缘与整数对齐。这不好,因为数据将是整数,但整数是否落在箱边缘的左侧或右侧应保持一致。因此,它似乎不能解释间隙。然而,它可能意味着matplotlib的自动生成箱边缘在演化过程中发生了变化。我不知道课程使用的版本。 附言:以下内容表明问题在于箱边缘没有跨越数据值范围内的所有整数:
print( np.unique( np.array( final_tails ) ) )
print( np.unique( final_tails ) ) # data values
hist, bin_edges = np.histogram( final_tails )
print(bin_edges) # bin edges
print(hist) # bar heights
  • 数据值为:[2 3 4 5 6 7 8 9]

  • 分组边界为:[2. 2.7 3.4 4.1 4.8 5.5 6.2 6.9 7.6 8.3 9. ]

  • 柱高度为:[ 2 10 23 0 21 27 0 10 6 1]

我使用以下代码获得了课程的漂亮靠拢条形图:

plt.hist( final_tails ,
   bins = np.arange( min( final_tails ) - 0.5 ,
                     max( final_tails ) + 1.5 , 1.0 ) ,
   edgecolor="k" )
plt.show()

我没有将这个作为答案发布,因为功劳归于saibhaskar和ImportanceOfBeingErnest,他们提供了详细信息。

但我想知道是否需要自定义bin边缘是因为自动bin边缘的方案在课程材料创建和现在之间发生了变化。


在创建https://wiki.bitplan.com/index.php/ConferenceCorpus/statistics时遇到了同样的问题。 bins = np.arange( min( final_tails ) - 0.5 , max( final_tails ) + 1.5 , 1.0 ) 是重要的部分。 - Wolfgang Fahl
2个回答

1
您得到了每个数字的频率作为输出。因此,没有出现某些数字(如1、2和9)的原因是空白的。

您的列表(final_tails)中有数据[3, 6, 4, 5, 4, 5, 3, 5, 4, 6, 6, 8, 6, 4, 7, 5, 7, 4, 3, 3, 4, 5, 8, 5, 6, 5, 7, 6, 4, 5, 8, 5, 8, 4, 6, 6, 3, 4, 5, 4, 7, 8, 9, 4, 3, 4, 5, 6, 4, 2, 6, 6, 5, 7, 5, 4, 5, 5, 6, 7, 6, 6, 6, 3, 6, 3, 6, 5, 6, 5, 6, 4, 6, 6, 3, 4, 4, 2, 4, 5, 4, 6, 6, 6, 8, 4, 6, 5, 7, 4, 6, 5, 4, 6, 7, 3, 7, 4, 5, 7]


1
您的数据的最小值和最大值分别为2和9。将这个范围分成10个箱子,意味着每个箱子宽度为0.7。我们可以计算出边缘,它们是2、2.7、3.4、4.1、4.8等。
print(min(final_tails), max(final_tails))
# 2 9
step = (max(final_tails)-min(final_tails))/10
print(step)
# 0.7
edges = np.linspace(min(final_tails), max(final_tails), 10+1)
print(edges)
# [2.0 2.7 3.4 4.1 4.8 5.5 6.2 6.9 7.6 8.3 9.0 ]

由于您的数据只包含整数,例如在4.1和4.8之间的bin中没有数据,因此图表中缺少该bin的条形。

我怀疑您展示的来自课程的图像是由不同于您在此处展示的代码生成的。


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