Python 将直方图箱添加到一起并绘制图形

Python 将直方图箱添加到一起并绘制图形,python,plot,data-binding,histogram,data-fitting,Python,Plot,Data Binding,Histogram,Data Fitting,我有一个包含8192个箱子的直方图,每个箱子从文本文件的一行导入。简而言之,它非常适合,有人建议我可以通过添加相邻垃圾箱的计数来减少统计错误。e、 g.添加0-7个料仓,以制作新的第一个料仓,宽度为8倍,但高度为8倍(大致) 理想情况下,我们希望能够输出由代码中单个常量控制的二进制宽度的直方图。但是,我尝试这样做,而不是生成下面的第一个图像(这是我的代码版本生成的,它只能生成binwidth为1的图像),生成下面的第二个图像,缺少拟合线,并且在同一图像文件中有第二个空图(我尝试将代码概括为任何b

我有一个包含8192个箱子的直方图,每个箱子从文本文件的一行导入。简而言之,它非常适合,有人建议我可以通过添加相邻垃圾箱的计数来减少统计错误。e、 g.添加0-7个料仓,以制作新的第一个料仓,宽度为8倍,但高度为8倍(大致)

理想情况下,我们希望能够输出由代码中单个常量控制的二进制宽度的直方图。但是,我尝试这样做,而不是生成下面的第一个图像(这是我的代码版本生成的,它只能生成binwidth为1的图像),生成下面的第二个图像,缺少拟合线,并且在同一图像文件中有第二个空图(我尝试将代码概括为任何binwidth生成的图像)。 以下是直接根据原始数据绘制的直方图,即binwidth=1 原始代码输出,仅适用于binwidth 1

尝试使用come代码修改的箱子宽度8的示例

我还需要它来返回一个拟合报告,以及高斯曲线下的面积,因为这是在代码后面绘制的,呈指数衰减曲线

以下是我认为相关的代码部分:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from numpy import exp, loadtxt, pi, sqrt, random, linspace
from lmfit import Model
import glob, os

    ## Load text file
    x = np.linspace(0, 8191, 8192)
    finalprefix = str(n).zfill(3)
    fullprefix = folderToAnalyze + prefix + finalprefix
    y = loadtxt(fullprefix + ".Spe", skiprows= 12, max_rows = 8192) 

    ## Make figure and label
    fig, ax = plt.subplots(figsize=(15,8))
    fig.suptitle('Photon coincidence detections from $β^+$ + $β^-$ annhilation', fontsize=18)
    plt.xlabel('Bins', fontsize=14)
    plt.ylabel('Counts', fontsize=14)

    ## Plot data
    ax.bar(x, y)
    ax.set_xlim(600,960)
    
    ##  Adding Bins Together
    y = y.astype(int)
    x = x.astype(int)

    ## create the data
    data = np.repeat(x, y)

    ## determine the range of x
    x_range = range(min(data), max(data)+1)

    ## determine the length of x
    x_len = len(x_range)

    ## plot
    fig, (ax1, ax2) = plt.subplots(nrows=2, figsize=(10, 10))

    ax1.hist(data, bins=x_len)  # outliers are not plotted
    plt.show()
    
    ## given x_len determine how many bins for a given bin width
    width = 8
    bins = int(np.round(x_len / width))

    ## determine new x and y for the histogram
    y, x = np.histogram(data, bins=bins)

    ## Fit data to Gaussian
    gmodel = Model(gaussian)
    result = gmodel.fit(y, x=x[:-1], amp=8, cen=approxcen, wid=1)

    ## result
    print(result.fit_report())
    fig.savefig("abw_" + finalprefix + ".png")
        
    ## Append to list if error in amplitude and amplitude itself is within reasonable bounds
    if result.params['amp'].stderr < stderrThreshold and result.params['amp'] > minimumAmplitude:
        amps.append(result.params['amp'].value) 
        ampserr.append(result.params['amp'].stderr) 
        ts.append(MaestroT*n)

## Plot decay curve
fig, ax = plt.subplots()
ax.errorbar(ts, amps, yerr= 2*np.array(ampserr), fmt="ko-", capsize = 5, capthick= 2, elinewidth=3, markersize=5)
plt.xlabel('Time', fontsize=14)
plt.ylabel('Peak amplitude', fontsize=14)
plt.title("Decay curve of P-31 by $β^+$ emission", fontsize=14)
将numpy导入为np
将matplotlib.pyplot作为plt导入
从scipy.optimize导入曲线\u拟合
从numpy导入exp、loadtxt、pi、sqrt、random、linspace
从lmfit导入模型
导入全局操作系统
##加载文本文件
x=np.linspace(081918192)
finalprefix=str(n).zfill(3)
fullprefix=文件夹分析+前缀+最终引用
y=loadtxt(fullprefix+“.Spe”,skiprows=12,最大行数=8192)
##制作图形和标签
图,ax=plt.子批次(图尺寸=(15,8))
图suptitle($β^+$+$β^-$annhilation的光子符合检测,$fontsize=18)
plt.xlabel('bin',fontsize=14)
plt.ylabel('Counts',fontsize=14)
##绘图数据
轴杆(x,y)
ax.set_xlim(600960)
##将垃圾箱添加到一起
y=y.aType(int)
x=x.aType(int)
##创建数据
数据=np。重复(x,y)
##确定x的范围
x_范围=范围(最小值(数据)、最大值(数据)+1)
##确定x的长度
x_len=len(x_范围)
##密谋
图(ax1,ax2)=plt.子批次(nrows=2,figsize=(10,10))
ax1.hist(数据,bin=x_len)#未绘制异常值
plt.show()
##给定x_len确定给定料仓宽度的料仓数量
宽度=8
箱子=整数(np.圆形(x_长度/宽度))
##确定直方图的新x和y
y、 x=np.直方图(数据,箱=箱)
##将数据拟合到高斯分布
G模型=模型(高斯)
结果=gmodel.fit(y,x=x[:-1],amp=8,cen=approxcen,wid=1)
##结果
打印(result.fit_report())
图savefig(“abw_u“+finalprefix+”.png)
##若振幅和振幅本身的误差在合理范围内,则追加到列表中
如果result.params['amp'].stderr最小振幅:
amps.append(result.params['amp'].value)
amperr.append(result.params['amp'].stderr)
ts.append(大师*n)
##绘制衰减曲线
图,ax=plt.子批次()
最大误差条(ts,amp,yerr=2*np.array(amp),fmt=“ko-”,倾覆=5,capthick=2,elinewidth=3,markersize=5)
plt.xlabel('Time',fontsize=14)
plt.ylabel('峰值振幅',fontsize=14)
plt.title(“P-31通过$β^+$emission的衰减曲线”,fontsize=14)
1.0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,0,0,0} 我认为当箱子宽度为1和8时,这应该会创建两个形状截然不同的直方图。虽然我刚刚制作了它们,但拟合可能不好,值得一提的是,我遇到的一个问题与能够将从文本文件读取的信息相加有关

如果有用:

-这是原始代码


-这是柱状图的示例

对不起,您的示例太长太复杂,我无法理解。但为什么您会说您显示的第一个匹配(打印和嵌入输出文本)是不好的吗?也许一个合适的箱子会更好。这是一个更好的箱子,大约有500个。只是觉得这更容易看。chi^2值97通常并不表示适合。而且你可以看到箱子的数量经常与适合线有很大的不同-这主要是因为在18秒内,每个箱子的cou数量很少nts。有人建议我解决这个问题的一个方法是,将多个箱子的计数相加,比如说,将两个箱子相加,用两倍的计数表示136s窗口。这意味着统计波动会更小,拟合会更容易应用。问题是,当我尝试这样做时,遵循另一个问题中的示例,我不久前被问到,我得到的例子有两个数字——一个没有拟合,一个没有数据。什么能让它更容易理解呢?很高兴认识另一位加速器专家——我是英国pelletron的一名实验官员