2.2.1 图表

图表的概念

数据可视化的方法有很多,最基本的是使用由两个或三个数组(TGraph / TGraph2D)组成的坐标表示数据的大小或位置,称作 Graph 。这与直方图(Histogram)的表达方式不同。

ROOT 提供了许多图形类,如TGraph图表;TGraphErrors具有对称误差线的图表;TGraph2D由三个数组 X、Y 和 Z 组成的图表等。

图表的使用

TGraph支持批量创建和运算,TGraph的创建方法有:

// 创建了一个名字是name,标题是title,有n个坐标为x,y的点:
TGraph *gr = new TGraph("name", "title", number, x, y)
TGraph* gr = new TGraph("name", "title", number, x, y)
TGraph *gr = new TGraph(number, x, y)
auto gr = new TGraph(number, x, y)
auto gr = new TGraph()        // 使用AddPoint()函数添加坐标点
auto dt = new TGraph2D()      // 二维图表,其他形式同理

绘制图表前需要先定义坐标数组,然后使用TGraph构造图形。e.g.

   int n = 20;
   double x[n], y[n];
   for (int i=0; i<n; i++) {
      x[i] = i*0.1;
      y[i] = 10*sin(x[i]+0.2);
   }
   auto gr = new TGraph (n, x, y);

也支持使用AddPoint()函数添加点:

使用TGraph::Draw()绘制图形,且有多种绘图选项可选:

从文件中读取数据

数据的保存格式有很多,常见的是文本格式和 ROOT 格式:

  • 文本格式数据绘制 Graph

这里要求文件中的坐标中间是空格或者制表符,不可以是逗号。e.g.

从图表中读取数据

  • 数组模式

double *px = gr->GetX(); 将gr1图像中点数据以数组形式输出。

  • 指针模式

ToggleEventStatus()是 Canvas 的成员函数。用于展示指针处的数据状态,打开后,指针所在位置的数据信息会被呈现在面板下方。

  • 高亮模式

高亮模式适用于TGraph(和TH1)类。 当高亮模式打开时,鼠标在点上的移动将以图形表示。 点将突出显示为“点圆”(由标记对象表示)。 此外,任何高亮显示(点变化)都会发出信号TCanvas::Highlighted(),允许用户做出反应并调用自己的函数。 为了更好地理解,请参阅教程$ROOTSYS/tutorials/graphs/hlGraph*.C 文件。

属性设置

图表的轴、标题、颜色均可以进行设置,参见2.3 属性设置

绘图选项

使用以下选项绘制图表,在Draw()命令中它们不区分大小写,可不间隔的使用多个参数如Draw("APL")Draw("A p l"),均表示绘制包涵坐标轴和坐标点的图,并用直线相连:

Option
Description

"A"

绘制出坐标轴

"I"

Combine with option 'A' it draws invisible axis

"L"

在点之间使用直线相连,最终呈现的效果是折线

"F"

绘制填充区域(“CF”绘制平滑填充区域)

"C"

绘制平滑曲线

"*"

每数据点以星号显示

"P"

绘制出每个 marker

"B"

绘制柱状图/条形图/直方图

"1"

当使用柱状图B时,使柱状图从底部开始,否则从0开始

"X+"

X轴在上

"Y+"

Y轴在右

"PFC"

调色板填充颜色:图表的填充颜色取自当前调色板中

"PLC"

调色板线条颜色:图形的线条颜色取自当前调色板中

"PMC"

调色板标记颜色:图表的标记颜色取自当前调色板中

"RX"

X轴刻度反转

"RY"

Y轴刻度反转

"HIST"

以histogram格式绘制/亦或称作阶梯图

chevron-rightE.g. X轴在上Y轴反转和自动取色hashtag
X轴在上Y轴反转和自动取色

成果保存

ROOT 格式支持保存数据,也支持保存分析图片,而且图片保存为 ROOT 格式后还可以反复打开并进行进一步的美化工作,十分便捷。

TGraph::Save():将图表保存为.csv.tsv.txt和其他的图像格式。

TGraph::SaveAs():将图表保存任意图像格式。

TPad::Print()orTCanvas::Print():将画布保存为指定格式的文件。

chevron-righte.g. 将多个画布与图片连续保存到一个 PDF 文件中hashtag

TFile::Write():将TTree对象保存到ROOT文件中。e.g.

TFile::mkdir():在 ROOT 文件中创建目录并保存对象。

二维图表

使用符合标准的数据可以绘制二维图表。e.g.

绘图选项

参数
描述

"TRI"

填充Delaunay三角形,绘制表面和边。

"TRIW"

以线框模式绘制Delaunay三角形。

"TRI1"

使用颜色级别填充Delaunay三角形,绘制边。

"TRI2"

使用颜色级别填充Delaunay三角形,不绘制边。

"P"

在每个顶点绘制标记。

"P0"

在每个顶点绘制圆形标记,背景为白色。

"PCOL"

在每个顶点绘制标记,颜色根据Z值决定。

"LINE"

绘制3D折线。

"CONT5"

使用Delaunay三角形绘制等高线图。

极坐标 TGraphPolar

极坐标TGraphPolar()的绘图选项有:

Option
Description

"O"

极坐标标签与极坐标图半径正交绘制。

"P"

在每个点位置绘制多标记。

"E"

绘出误差棒

"F"

绘制填充区域(闭合多边形)

"A"

即使极坐标图已经存在,也强制重绘轴

"N"

禁止显示极坐标标签

chevron-righte.g. 极坐标例子hashtag

饼状图 TPie

chevron-righte.g. TPiecharthashtag

TGraphTime

Example of TGraphTimearrow-up-right showing how the class could be used to visualize a set of particles with their time stamp in a MonteCarlo program.

chevron-righte.g.hashtag

四维散点图

需要ROOT v.6.30版本以上支持。

chevron-righte.g.hashtag

多图绘法

ROOT 支持在一张 Canvas 上绘制多幅图表或者直方图。

独立绘制

使用TCanvas::Divide()函数将 Canvas 分割为不同的 Pad,例如将名为c1的 canvas 分为 2 列 3 行写作:c1->Divide(2,3),然后使用c1->cd()分别控制不同的 Pad,Pad 的名称从左向右,从上至下分别是1,2,……,例如可以在pad1上绘制 Histogram,在 pad2 上绘制 Graph。

共轴绘制

最简单的共轴画法是在TCanvas::Divide()函数中添加参数,例如c1->Divide(2,3,0),但当要进行一些美化工作的时候,就会发现它们的标题大小,marker 大小不再能通过统一的数值控制,这非常影响美观。

所以这里有一个稍微复杂的解决方法,能够使它们的大小保持一致,仅供参考:

chevron-rightCanvasPartition https://root.cern.ch/doc/master/canvas2_8C.htmlarrow-up-righthashtag
CanvasPartition

重叠绘制

将多个 Graph 绘制在一张 Pad 上,只需要在TGraph::Draw()函数中使用same参数即可。

合并绘制

TMultiGraph::TMultiGraph(),函数支持将一组图作为单个实体进行操作。且绘制时 X 轴和 Y 轴范围会自动计算,因此所有图形都将可见。TMultiGraph::Addarrow-up-right()用于将新图表添加到列表中。e.g.

标题、颜色、统计信息均可使用TMultiGraph类中的成员函数,用法与 Graph 一致。

单个 graph 通过mg->GetListOfGraphs()->GetEntries();方式检索。

使用c1.SetFrameBorderMode(0);函数让边界消失。

多页绘制

参见成果保存

图例

为你的图标增加图例可以使得图标更加清晰。图例函数是TLegend,使用AddEntry(TGraphName, "", "opt")增加介绍。option是式选项(如"l"表示线,"p"表示点,"f"表示填充等)。

x1, x2, y1, y2以百分比的形式限制图例位置。

在ROOT中,TLegend类用于在绘图中添加图例(Legend),以帮助解释图形中的不同元素(如曲线、直方图、标记等)。TLegend可以灵活地设置图例的位置、大小、内容、样式等。

  • SetHeader():设置图例的标题。

  • SetTextSize():设置图例中文本的大小。

  • SetBorderSize():设置图例边框的宽度。

  • SetFillColor():设置图例的背景填充颜色。

  • SetFillStyle():设置图例的背景填充样式。

  • SetLineColor():设置图例边框的颜色。

  • SetLineStyle():设置图例边框的样式。

  • SetTextColor():设置图例中文本的颜色。

chevron-righte.g.hashtag


参考

最后更新于