用Pylab绘制直方图
我在使用Python 2.7。
我想为我随机漫步生成的50次结果画一个直方图。但是当我用pylab.hist(batting_average, bins = 10)来绘图时,得到的直方图颜色很奇怪,柱子高度接近500,但我只有50次的结果,y轴的最大值应该是50。
这是我的代码:
a = ['Hit', 'Out']
b = [.3, .7]
def battingAverage(atBats, some_list=a, probabilities=b):
num_hits = 0
num_outs = 0
current_BA = []
for i in range(1,atBats):
if random_pick(a, b) == 'Hit':
num_hits += 1
else:
num_outs +=1
BA = float(num_hits)/(float(num_hits)+float(num_outs))
current_BA.append(BA)
return current_BA
def printBAs():
for i in range(50):
batting_average = battingAverage(501)
pylab.hist(batting_average, bins=10)
我的直方图怎么了!?
如果有什么地方需要解释,请告诉我,我会尽量说明清楚。
1 个回答
1
你传给 battingAverage
的参数是501,这个数字代表的是打击次数。你正在用500次打击的数据做50个直方图。
(哦,对了,你的代码格式需要修正一下……缩进有点乱。)
你的代码并没有按照你想的那样工作。
我觉得你是想让 battingAverage
返回最终的打击平均值,但它实际上返回的是一个打击平均值的列表,每次打击一个平均值。然后你把这个列表画成图。
我想你是想从 battingAverage
返回一个单一的数字,并且想在 printBAs() 函数中累积这个列表,把 pylab.hist 移出循环。
我想这不是作业吧?
换句话说,我觉得你想要的代码大概是这样的:
a = ['Hit', 'Out']
b = [.3, .7]
def battingAverage(atBats, results=a, probabilities=b):
num_hits = 0
num_outs = 0
for i in range(atBats):
if random_pick(results, probabilities) == 'Hit':
num_hits += 1
else:
num_outs +=1
BA = float(num_hits)/(float(num_hits)+float(num_outs))
return BA
def printBAs():
batting_averages = [battingAverage(500) for i in range(50)]
pylab.hist(batting_averages, bins=10)
不过那段代码还需要整理一下……