直方图可以直观地显示测量结果,而且还是一种强大的数据缩减形式。 直方图是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。直方图是数值数据分布的精确图形表示。为了构建直方图,第一步是将值的范围分段,即将整个值的范围分成一系列间隔,然后计算每个间隔中有多少值。 这些值通常被指定为连续的,不重叠的变量间隔。 一般用横轴表示数据类型,纵轴表示分布情况。在核物理里面,横轴通常是物理量(能量,时间等),纵轴通常是计数。相比于存储所有的原始数据信息,直方图对数据进行了压缩。
参考
// TH1 数据填充
Int_t Fill(Double_t x); // 横坐标 X 所在的 bin 计数加 1。
下面我们以一个简单的例子来讲解 Fill 函数。
假设我们将 x 轴 [0,10] 分成 10 份,如下所示:
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 1 2 3 4 5 6 7 8 9 10
当我们 Fill 3.5 时,落在 3-4 这个 bin 区间,则这个区间的计数加 1
| 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
0 1 2 3 4 5 6 7 8 9 10
当我们 Fill 7.2 时,落在 7-8 这个 bin 区间,则这个区间的计数加 1
| 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
0 1 2 3 4 5 6 7 8 9 10
当我们 Fill 3.2 时,落在 3-4 这个 bin 区间,则这个区间的计数加 1
| 0 | 0 | 0 | 2 | 0 | 0 | 0 | 1 | 0 | 0 |
0 1 2 3 4 5 6 7 8 9 10
%jsroot on
TCanvas *c1 = new TCanvas;//创建一个新的画布(Canvas), ROOT中所有的图形对象都画在TCanvas上。
// 创建直方图
TH1I* h1 = new TH1I("h1",//每个直方图的唯一名称,在同一个内存空间中不能重复
"",//title
100, // x 轴区间分成的 bin 数。
-0.5, // x 轴的左边界
15.5); // x 轴的右边界
// 填充数据
for (int i=0; i<4000; i++)
h1->Fill(gRandom->Gaus(6.0,2));//gRandom->Gaus(),生成在mean=6.0,sigma=2的高斯分布的随机数。
// 画图
h1->SetTitle("Top title");
h1->GetXaxis()->SetTitle("X variable");//设置x轴名称
h1->GetYaxis()->SetTitle("Y variable");//设置y轴名称
h1->SetLineWidth(3);//设置线宽
h1->SetLineColor(kBlack);//将默认的蓝色线改成黑色, kBlue,kRed, kGreen, kYellow ...
h1->Draw();
c1->Draw();//画出TCanvas。
// 创建直方图
TH1I* h2 = new TH1I("h2",//每个直方图的唯一名称,在同一个内存空间中不能重复
"",//title
100, // x 轴区间分成的 bin 数。
-0.5, // x 轴的左边界
15.5); // x 轴的右边界
// 数据填充
// 直方图中共分成 100 个bin,则它实际有102 个bin。
// bin 0和 bin 101 分别用于填充小于x轴左边界、大于x轴右边界的数据。bin 1-100 为 [-0.5,15.5) 区间
for(int i=1; i<=100; i++)
h2->SetBinContent(i,100-i);//这里第一个变量为 bin 编号,第二个变量为该 bin 要填充的数值
// 画图
h2->Draw();
c1->Draw();//画出TCanvas。
// 获得每个 bin 的计数
for(int i =1; i <=100; i++)
cout<<h2->GetBinContent(i)<<" ";
cout<<endl;
// 寻找x值对应的bin数 对一维直方图,返回 x 值所在 bin
cout<<"FindBin: "<<h2->FindBin(6.0)<<endl;
// 返回该 bin 的中心坐标
cout<<"BinCenter: "<<h2->GetBinCenter(40)<<endl;
//返回该 bin 左侧边缘的坐标
cout<<"BinLowEdge: "<<h2->GetBinLowEdge(40)<<endl;
//返回 x 轴 bin 数
cout<<"bin N: "<<h2->GetNbinsX()<<endl;
99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 80 79 78 77 76 75 74 73 72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 FindBin: 41 BinCenter: 5.82 BinLowEdge: 5.74 bin N: 100
h1->Draw();
h2->Draw("same");
c1->Draw();
TH1I *h3 = new TH1I("h3","",1000,0,100);
TH1I *h4 = new TH1I("h4","",1000,0,100);
TH1I *h5 = new TH1I("h5","",1000,0,100);
for(int i=0; i <10000; i++)
{
h4->Fill(gRandom->Gaus(30,5));
h5->Fill(gRandom->Gaus(70,10));
}
h3->Add(h4,1); // 该函数是将h4直方图进行 1 倍的放大/缩小后加到当前h3直方图中。
h3->Add(h5,2);
h3->Draw();
c1->Draw();