2.2.2 直方图

直方图的概念

直方图(histogram)与图表(graph)的区别在于直方图使用 bin 分割数据。

bin 的原意是垃圾箱或小箱子,在 histogram 中,使用 bar 的大小(高低)反映数据,这些存放数据的 bar,称为 bin,也就是将整个数据范围划分为一系列统计区间。bin 的宽度取决于数据范围上 bin 的数量。

直方图的使用

直方图是一种对数据分布情况的图形表示方式,适合用来表现数量上的差异。直方图支持批量创建和运算。直方图的创建方法有很多:

TH1I *h1 = new TH1I("histogram name", "grapg title; x title; unit title", nbins, xmin, xmax)
TH1D* h1 = new TH1D("histogram name", "grapg title; x title; unit title", nbins, xmin, xmax)
TH1F *h1 = new TH1F("histogram name", "grapg title; x title; unit title", , , )
TH1I *h1 = new TH1I("histogram name", "grapg title", , , )
TH1I *h1 = new TH1I("histogram name", "grapg title", nbins, xmin, xmax)
auto *h1 = new TH1F
TH1F *h[n]    // 批量创建
TH1F h3 = h1*h2;
TH1F h3 = 8*h1;

TH1D是缩写,分别表示THistogram类、1维、Double型,同理TH1F表示整数型一维直方图,TH2D表示双精度浮点型二维直方图。

"histogram name"表示直方图名称,直方图存储在本地时,文件名默认使用直方图名称,"grapg title"作 histogram 的图表题,nbins, xmin, xmax分别表示分 bin 数量和轴范围,即将xmin-xmax的范围上分mbins个 bin。

建立histogram之后,必须向其中填充数据,否则不能正常绘制:

控制分 bin

当 canvas 和轴发生变化时,bin 宽(形式上而非数值上)也会发生变化。如SetLogx,表示将 x轴设置为对数坐标的形式,此时 bin 宽(形式上)会随 logx 而变化,若要求 bin 宽(形式上)不随 logx 变化,可以参考这里

对 bin 的控制能够更加科学和美观的呈现结论。控制 bin 的方法有:

  • 标准控制:e.g.

  • 自动控制:不指定 bin 及坐标范围(参数位置需要空出),ROOT 会自动匹配。e.g.

  • 精细控制:数组的大小应为nbins+1,因为它包含下范围和上范围的轴值。e.g.

  • 指定控制:通过符号>>控制。e.g.

二维使用>>(xnbins,xmin,xmax,ynbins,ymin,ymax)的语法控制。

  • 重新排列:通过函数Rebin( mergebin, newname, xbins 0 or !0) 重制。e.g.

  • 查看、获取和更改 bin 中的内容

GetBinEntries(i),用于获取 TProfile 对象中第i个 bin 的数据点数量;

GetBinContent(i),用于获取 TProfile 对象中第i个 bin 的内容,即该 bin 中的数据值;

GetXaxis()->GetBinCenter(i),获取 TProfile 对象中 X轴上第i个 bin 的中心值;

带有误差条的写入bin

GetBinError(i),用于获取 TProfile 对象中第i个 bin 的(上)误差;

GetBinErrorLow(i),用于获取 TProfile 对象中第i个 bin 的下误差;

GetBinWidth(i),用于获取直方图中第i个 bin 的宽度;

GetBinXYZ(i, j, k),这个函数用于获取多维直方图中(例如TH3)的第(i, j, k)个 bin 的内容。

gPad->GetUymax(), 获取坐标轴的最大值,在此之前需要运行c1->Update()

GetQuantiles(nq, yq, xq),分为函数,假设我们有一个包含 1000 个随机数的直方图,我们希望计算出它的四分位数(即分位数数量为 4)。以下是一个示例代码:

在这个例子中,我们首先创建了一个包含 100 个 bin 的一维直方图,然后生成了 1000 个 0 到 100 之间的随机数,并将它们填充到直方图中。接着,我们计算了四分位数,并将结果存储在数组 yq 中。最后,我们打印输出了计算得到的四分位数值。

通过这个例子可以更好地理解GetQuantiles函数的作用,以及如何使用它来计算直方图中指定分位数位置的数值。

数据填充

直方图也可以通过数据值/坐标来绘制。 e.g.

e.g. GRB221009A的光变曲线

这种方式绘制的直方图只是形式上的,不能反映真实的 bin 值,所以这种方法不适用于拟合等操作,所以建议使用TTree::SetBranchAddress("",&)函数绘制:

e.g. 拟合的坐标点填充

数据缩放

TH::Scale(,"")函数进行纵坐标缩放,如果选项包含“width”,则bin的内容和误差则除以 bin 宽。例如h1->Scale(1./12)表示缩小 12 倍。

E.g. 控制分 bin 并使用缩放归一

绘图选项

支持1D和2D直方图的选项

Option
Description

"E"

绘制误差棒。

"HIST"

绘制直方图。

"FUNC"

当直方图具有拟合函数时,此选项允许仅绘制拟合结果。

"SAME"

叠加在同一垫中的前一张图片上。

"SAMES"

与“SAME”相同,强制绘制统计框。

"PFC"

调色板填充颜色:直方图的填充颜色取当前调色板。

"PLC"

调色板线条颜色:直方图的线条颜色取当前调色板。

"PMC"

调色板标记颜色:直方图的标记颜色取当前调色板。

"LEGO"

绘制去除隐藏线的乐高图。

"LEGO1"

绘制隐藏表面移除的乐高图.

"LEGO2"

使用颜色绘制乐高图以显示单元格内容 当选项“0”与任何乐高选项一起使用时,不会绘制空箱。

"LEGO3"

绘制一个带有隐藏表面去除的乐高图,与乐高1类似,但不绘制每个乐高条的边界线。

"LEGO4"

绘制一个带有隐藏表面去除的乐高图,就像乐高1一样,但每个乐高条上没有阴影效果。

"TEXT"

将 bin 内容绘制为文本(通过 gStyle->SetPaintTextFormat 设置格式)。

"TEXTnn"

将 bin 内容绘制为角度 nn (0 < nn <= 90) 的文本.

"X+"

TX 轴绘制在图的顶部。

"Y+"

Y 轴绘制在图的右侧。

"MIN0"

将 Y 轴的最小值设置为 0,相当于 gStyle->SetHistMinimumZero()。

支持1D直方图的选项

Option
Description

"AH"

绘制无轴直方图。 “A”可以与任何绘图选项组合。 例如,“AC”将直方图绘制为无轴的平滑曲线。

"]["

选择此选项时,不会绘制直方图的第一条和最后一条垂直线。

"B"

条形图选项。

"BAR"

与选项“B”类似,但可以用 3D 效果绘制条形。

"HBAR"

“HBAR” 与选项“BAR”类似,但条形是水平绘制的。

"C"

通过直方图箱绘制平滑曲线。

"E0"

绘制误差线。 为内容为 0 的箱绘制标记。 与 E1 或 E2 结合使用可避免误差条剪切。

"E1"

在边缘处用垂直线绘制误差条。

"E2"

用矩形绘制误差线。

"E3"

通过垂直误差线的端点绘制填充区域。

"E4"

通过误差线的端点绘制平滑的填充区域。

"E5"

与 E3 类似,但忽略内容为 0 的bin。

"E6"

与 E4 类似,但忽略内容为 0 的bin。

"X0"

当与“E”选项之一一起使用时,它会像 gStyle->SetErrorX(0) 那样抑制沿 X 的误差条。

"L"

画一条线穿过bin。

"P"

在除空箱之外的每个箱处绘制当前标记。

"P*"

在除空垃圾箱之外的每个垃圾箱上画一个星形标记。

"P0"

在每个仓(包括空仓)处绘制当前标记。y bins.

"PIE"

将直方图绘制为饼图。

"*H"

在每个 bin 处绘制带有 * 的直方图。

"LF2"

像选项“L”一样绘制直方图,但有填充区域。 请注意,如果设置了直方填充颜色,但填充区域对应于直方图轮廓,则“L”也会绘制填充区域。

二维直方图

创建 2D histogram 的标准写法是(参数可以省略):

二维直方图方向投影

二维直方图的 x 轴、y 轴统计信息支持投影。将 Hist2 的 x 轴统计信息投影给 Hist1:

二维直方图区域剪切

修改二维直方图显示区域使用类TCutG

绘图选项

支持2D直方图的选项

Option
Description

"ARR"

箭头模式。 显示相邻单元格之间的梯度。

"BOX"

为每个单元格绘制一个盒子,其表面积与内容的绝对值成比例。 负内容用 X 标记。

"BOX1"

为每个单元格绘制一个按钮,其表面与内容的绝对值成比例。 凹陷的按钮表示负值,凸起的按钮表示正值。

"COLZ"

为bin绘制颜色与调色板,为0值填充颜色。

"COL2"

“COL”的替代渲染算法。 可以显着提高大型非稀疏二维直方图的渲染性能。

"COLZ2"

与“COL2”相同。 此外,还绘制了调色板。

"Z CJUST"

I与颜色选项“COL”、“CONT0”等结合使用:在颜色边界处对齐调色板中的标签。 有关更多详细信息,请参阅 TPaletteAxis

"CANDLE"

沿 X 轴绘蜡烛图。

"CANDLEX"

与“CANDLE”相同。

"CANDLEY"

沿 Y 轴绘制蜡烛图。

"CANDLEXn"

沿 X 轴绘制蜡烛图。 n 为 1 到 6 的不同蜡烛样式。

"CANDLEYn"

沿 Y 轴绘制蜡烛图。 n 为 1 到 6 的不同蜡烛样式。

"VIOLIN"

沿 X 轴绘制小提琴图。is.

"VIOLINX"

与“VIOLIN”相同。

"VIOLINY"

沿 Y 轴绘制小提琴图。

"VIOLINXn"

沿 X 轴绘制小提琴图。 n 为 1 或 2 的不同小提琴风格。

"VIOLINYn"

沿 Y 轴绘制小提琴图。 n 为 1 或 2 的不同小提琴风格。

"CONT"

D绘制等值线图/等高线图(与 CONT0 相同)。

"CONT0"

使用表面颜色绘制等高线图以区分等高线。

"CONT1"

使用线条样式绘制等高线图以区分等高线。

"CONT2"

对所有等高线使用相同的线条样式绘制等高线图。

"CONT3"

使用填充区域颜色绘制等高线图。cont3 colz 合用有奇效

"CONT4"

使用表面颜色绘制等高线图。

"LIST"

为每个轮廓生成 TGraph 对象的列表。

"SAME0"

与“SAME”相同,但不使用第一个图的 z 轴范围。

"SAMES0"

与“SAMES”相同,但不使用第一个图的 z 轴范围。

"CYL"

使用圆柱坐标。 X 坐标映射在角度上,Y 坐标映射在圆柱长度上。

"POL"

使用极坐标。 X 坐标映射在角度上,Y 坐标映射在半径上。

"SPH"

使用球坐标。 X 坐标映射在纬度上,Y 坐标映射在经度上。

"PSR"

使用 PseudoRapidity/Phi 坐标。 X 坐标映射在 Phi 上。

"SURF"

绘制去除隐藏线的曲面图。

"SURF1"

绘制去除隐藏曲面的曲面图。

"SURF2"

使用颜色绘制曲面图以显示单元内容。

"SURF3"

与 SURF 相同,但在顶部绘制了轮廓视图。

"SURFn"

使用 Gouraud 着色绘制表面,4,5,6,7。

"TRI1"

连线绘制各点

E.g. COLZ与COLZ1的区别在于是否为空bin上色

COLZ与COLZ1

E.g. POL

E.g. COUNTZ

E.g. LEGO2Z

E.g. SURF1

E.g. Cont3 and COLZ

直方图是通过THistPainter类绘制的。 每个直方图都有一个指向自己画家的指针(可用于多线程程序)。 支持许多绘图选项。 有关更多详细信息,请参阅THistPainter::Paint()。

可以在不同的垫子上用不同的选项绘制相同的直方图。 当在垫子上绘制的直方图被删除时,直方图会自动从绘制的垫子上删除。 如果在垫子上绘制直方图,然后再次填充,那么下次更新垫子时,直方图的新状态将自动显示在垫子中。 人们不需要重新绘制直方图。 要在垫子上绘制当前版本的直方图,可以使用

h->DrawCopy();

这使直方图成为克隆(见下面的克隆)。 一旦绘制了克隆,原始直方图可能会被修改或删除,而不会影响克隆的方面。

可以使用TH1::SetMaximum()和TH1::SetMinimum()强制绘制上最大或最小尺度的特定值。 (对于一维直方图,这意味着y轴,而对于二维直方图,这些函数会影响z轴)。

TH1::UseCurrentStyle()可用于更改所有直方图图形属性,以对应当前选择的样式。 必须为每个直方图调用此函数。 如果从文件中读取和绘制许多直方图,可以通过在gROOT->ForceStyle()之前调用来强制直方图自动继承当前的图形样式。

TProfile

TProfile可以看作是THistogram的一种特殊情况,用于处理两个变量之间的关系。在实际使用中,THistogram通常用于表示数据的分布情况,而TProfile用于表示两个变量之间的关系。

成果保存

TGraph

直方图运算

积分

E.g. 积分与双坐标

加减乘除

E.g. XY双高斯2维histogram
XY双高斯2维histogram
E.g. 1维高斯和2维高斯投影,及多种2维展示风格
1维高斯和2维高斯投影,及多种2维展示风格
为现有画布新建图像

命令行中也可以对画布进行操作,例如为现有画布新建图像

堆积和堆叠

THStackTH1TH2直方图的集合。 通过使用THStack::Draw(),根据指定的绘图选项一次性绘制整个直方图集合。

THStack::Add()允许向列表中添加新的直方图。

默认情况下,直方图显示为堆积。

Stack的绘图选项:

NOSTACK,直方图都画在同一个垫子上,以“堆叠”的形式展示。

NOSTACKB,以条形图形式绘制在一起。

PADS,将当前的垫子/画布细分为等于直方图数量的垫子数量,并将每个直方图绘制成一个单独的垫子。

NOCLEAR,默认情况下,在绘制直方图之前,会擦除直方图的背景。该选项避免了这种行为。这在另一个绘图上绘制 THStack 非常有用。 如果用于绘制堆栈中直方图的图案是透明的,那么后面的绘图将可见。

E.g. 多个绘图选项
E.g. 绘图选项“lego1”

平滑

直方图平滑(Histogram Smoothing)是一种数据处理技术,主要用于减少直方图中的噪声或波动,从而更好地揭示数据的整体趋势或分布特征。

e.g.

箱型图

箱形图,又称为盒须图、盒式图、盒状图或箱线图,是一种用作显示一组数据分散情况资料的统计图。它能显示出一组数据的最大值、最小值、中位数、及上下四分位数。离群值会有时会画成是个别的点。

e.g.
e.g.

柱状图

e.g.

绘制两个不同 root 文件中直方图

统计面板

统计面板会统计一些图形信息并展示在画布上,默认绘制,当不需要展示时,使用TH::SetStats(0)或TStyle::SetOptStat(0)函数关闭。

统计面板选项

直方图统计框中打印的信息类型可以通过参数模式选择。

参数模式可以是= ksiourmen和数字。

K = 1:峰度打印;K = 2:打印 kurtosis 和 kurtosis 错误,峰度是描述概率分布形状尖峭程度的统计量。

S = 1:偏度打印;S = 2:打印偏度和偏度错误,参考

I = 1:打印垃圾箱的积分;I = 2:打印选项“宽度”的垃圾箱积分。

O = 1:打印溢出数。

U = 1:打印下溢出数。

R = 1:rms 打印;R = 2:rms 和 rms 错误打印。

M = 1:打印的平均值;M = 2:打印平均值和平均误差值。

E = 1:打印事例数。

N = 1:打印直方图的名称。

示例:gStyle->SetOptStat(11),仅打印直方图名称和条目数量。gStyle->SetOptStat(1101),显示直方图名称、平均值和RMS。

备注:

切勿调用SetOptStat(000111),而应该使用SetOptStat(111)

SetOptStat(1)是允许设置最常见的情况的快捷方式,并被视为SetOptStat(1111)(用于与旧版本的向后兼容)。 如果只想打印直方图的名称,请调用SetOptStat(1000000001)

对于二维直方图,当仅选择下溢出(10000)或溢出(100000)时,统计框将显示下溢出 / 溢出的所有组合,而不仅仅是一个数字!

统计面板位置

当使用选项“SAME”绘制直方图时,root 不会绘制新的统计框。强制绘制必须使用参数“SAMES”。如果新的统计框隐藏了前一个统计框,则可以使用以下行更改其位置(“h”是指向直方图的指针):

TStyle::SetStatTextColor


参考

最后更新于