用Pylab绘制直方图

0 投票
1 回答
7632 浏览
提问于 2025-04-17 04:20

我在使用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)

不过那段代码还需要整理一下……

撰写回答