【问题标题】:Python histograms: Manually normalising counts and re-plotting as histogramPython 直方图:手动归一化计数并重新绘制为直方图
【发布时间】:2016-05-04 06:48:09
【问题描述】:

我尝试搜索类似的东西,我能找到的最接近的东西是this,它帮助我提取和操作数据,但现在我不知道如何重新绘制直方图。我有一些电压数组,我首先绘制了这些电压出现的直方图。我想改为制作每小时事件的直方图(因此正常直方图的 y 轴除以我获取数据的小时数),然后使用操纵的 y 数据。

我有一个数组,其中包含每小时的事件数(由来自 pyplot.hist 的原始 y 轴除以获取数据的小时数组成)和直方图中的 bin。我使用以下代码(取自上面链接的答案)组成了该数组:

import numpy
import matplotlib.pyplot as pyplot
mydata = numpy.random.normal(-15, 1, 500)      # this seems to have to be 'uneven' on either side of 0, otherwise the code looks fine. FYI, my actual data is all positive
pyplot.figure(1)
hist1 = pyplot.hist(mydata, bins=50, alpha=0.5, label='set 1', color='red')
hist1_flux = [hist1[0]/5.0, 0.5*(hist1[1][1:]+hist1[1][:-1])]
pyplot.figure(2)
pyplot.bar(hist1_flux[1], hist1_flux[0])

此代码与我的代码中发生的不完全匹配;我的数据由 1000 个阵列组成,每个阵列有 1000 个数据点(电压)。我已经制作了直方图,它给出了给定电压范围(或 bin 宽度)的出现次数。我想要做的就是用相同的原始 bin 宽度重新绘制每小时事件数的直方图(所以 yaxis 直方图 / 5 小时) ,但是当我将 hist1[0]/5 分割并以上述方式重新绘制时,'bin width' 全部错误。

我觉得必须有一种更简单的方法来做到这一点,而不是手动重新绘制我自己的直方图。

提前致谢,如果我遗漏了一些明显的东西,我真的很抱歉。

问题,在我的示例代码和我的原始数据的输出中说明如下:

上图:代码 sn-p 输出。
下图:我的实际数据。

【问题讨论】:

    标签: python numpy matplotlib histogram


    【解决方案1】:

    这是因为bar函数带了一个参数width,默认是0.8plt.bar(left, height, width=0.8, bottom=None, hold=None, **kwargs)),所以你需要把它改成两根柱子之间的距离:

    pyplot.bar(hist1_flux[1], hist1_flux[0],
               width=hist1_flux[1][1] - hist1_flux[1][0])
    

    【讨论】:

    • 太棒了,这完美地解决了它,我知道我错过了一些东西,但我不知道它是什么。太感谢了。我很惊讶没有更简单的方法来手动操作 pyplot.hist 中的所有 y 值;这似乎是很自然的添加。
    猜你喜欢
    • 2018-10-30
    • 1970-01-01
    • 2013-06-20
    • 2018-05-23
    • 2017-08-21
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多