本篇文章具体介绍如何绘制出一张最简单的具备齐全要素的一维直方图,以及其各个要素最基本的绘制和修改方法。

一、创建直方图

1、直方图主体

(1)利用构造函数构造一维直方图

构建固定bin宽的直方图如下示语句和图所示,此处为了方便展示进行了一个高斯填充:

TH1* th1 = new TH1F("th1","Hist with constant bin width",100,-5.,5.);th1->FillRandom("gaus",10000);
th1->Draw();//or you can:
TH1F th1("th1","Hist with constant bin width",100,-5.,5.);th1.FillRandom("gaus",10000);
th1.Draw();

构建多种不同bin宽的直方图如下示语句和图所示:

const Int_t NBINS = 10;
Double_t edges[NBINS + 1] = {-5.0,-4.0,-3.5,-1.5,-0.5,0.0, 0.5, 1.5, 3.5, 4.0, 5.0};
// Bin 1 corresponds to range [-5.0, -4.0)
// Bin 2 corresponds to range [-4.0, -3.5) etc...
TH1* th2 = new TH1D("th2","Hist with variable bin width",NBINS,edges);th2->FillRandom("gaus",10000);
th2->Draw(); 

(2)利用克隆函数构造一维直方图

通过克隆构造出的直方图副本。对副本进行的操作并不会影响到被克隆直方图。

TH1* th1 = new TH1F("th1","Hist with constant bin width",100,-5.,5.);
th1->FillRandom("gaus",10000);TH1* hc = (TH1*)th1->Clone();hc->SetTitle("Clone of th1");
hc->Draw();

(3)通过高维直方图投影构造一维直方图

// projecting histograms
// the projections always contain double values !
TH1* hx = h2->ProjectionX(); // ! TH1D, not TH1F
TH1* hy = h2->ProjectionY(); // ! TH1D, not TH1F

(4)通过读取文件构造一维直方图

Int_t variable;//just a example
TFile* f = new TFile(“filename.root”);
TH1* th3 = (TH1F*)f->Get("thistogram");

2、直方图标题

(1)在创建直方图时赋予标题

TH1* th1 = new TH1F("th1","histogram title",100,0.,10.);

(2)利用SetTitle()函数赋予或更改标题

使用SetTitle()函数会覆盖在该函数之前设置的标题,如下所示:

TH1* th1 = new TH1F("th1","histogram title",100,0.,10.);
th1->SetTitle("different histogram title");

3、直方图坐标轴标题

(1)在创建直方图时赋予坐标轴标题

在其构造函数的第二个参数中,将主标题,X轴标题,Y轴标题依次输入,用英文分号隔开即可。

TH1* th1 = new TH1F("th1","histogram title;X_axias;Y_axias",100,0.,10.);

您也可以:

TH1* th1 = new TH1F("th1","histogram title;;Y_axias",100,0.,10.);
//or
TH1* th1 = new TH1F("th1","histogram title;X_axias;",100,0.,10.);
//or
TH1* th1 = new TH1F("th1",";X_axias;Y_axias",100,0.,10.);

缺少的对应标题将不被赋予直方图。

(2)利用SetTitle()函数赋予或更改坐标轴标题

同样地,运用该函数也会覆盖在该语句之前所设置的坐标轴标题。

TH1* th1 = new TH1F("th1","histogram title",100,0.,10.);
th1->GetXaxis()->SetTitle("X_Axis");
th1->GetYaxis()->SetTitle("Y_Axis");

4、直方图统计量

(1)删除统计框

TH1::SetStats(kFALSE);
//you can
th1->SetStats(kFALSE);

例如:

TH1* th1 = new TH1F("th1","normalization;X_Axis;Y_Axis",100,0.,10.);
for(int i=0;i<10000;++i)
{Double_t r=gRandom->Gaus(5,1);th1->Fill(r);
}th1->SetStats(kFALSE); th1->Draw();

(2)更改统计框内的信息显示

默认情况下,统计框内显示事例总数,均值和方差。可以通过调用SetOptStat()更改信息的详略程度。该函数具有数字参数和字符串参数两种模式。详见《ROOTUsersGuide》3.8.5节的内容。本处只列出字符串模式。

TStyle::SetOptStat(Option_t*option);
//you can
gStyle->SetOptStat("eMRSK");

• n for printing the name of histogram
• e the number of entries
• m the mean value
• M the mean and mean error values
• r the root mean square (RMS)
• R the RMS and RMS error
• u the number of underflows
• o the number of overflows
• i the integral of bins
• s the skewness
• S the skewness and the skewness error
• k the kurtosis
• K the kurtosis and the kurtosis error

例如:

TH1* th1 = new TH1F("th1","Statistics;X_Axis;Y_Axis",100,0.,10.);
for(int i=0;i<10000;++i)
{Double_t r=gRandom->Gaus(5,1);th1->Fill(r);
}gStyle->SetOptStat("eMRSK");th1->Draw();

二、填充直方图

1、利用FillRandom()进行填充

如前文所示,使用FillRandom()即可填充随机数进入直方图,随机数种类由ROOT预定义。第一个参数为随机数种类,只能使用默认值,第二个参数为填充总数。

TH1* th1 = new TH1F("th1","Hist with constant bin width",100,-5.,5.);th1->FillRandom("gaus",10000);

可以选择的预定义的随机数有:

gaus 高斯分布,默认值mean=0,sigma=1
expo 指数分布,f(x)=exp(p0+p1*x)
polN(N=0,1,2,3……) 多项式,f(x)=p0+p1*x+p2*x^2+……
landau 朗道分布

2、利用Fill()进行填充

通常利用Fill()结合循环结构进行填充,Fill()方法每次填充一个数据点。但也可以带有权重进行填充,可视为填充weight个相同的数据。

h1->Fill(x);
h1->Fill(x, w); //fill with weight

同样以填充随机数为例,你也可以选择其他的数据(比如仿真软件的输出数据)进行填充,此时结合gRandom全局变量,调用的随机数种类会更多:

TH1* th1 = new TH1F("th1","histogram title;X_Axis;Y_Axis",100,0.,10.);
for(int i=0;i<10000;++i)
{Double_t r=gRandom->Gaus(5,1);th1->Fill(r);
}
th1->Draw();

可以调用的随机数种类有:

Distributions Description
Double_t Uniform(Double_t x1,Double_t x2 ) Uniform random numbers between x1,x2
Double_t Gaus(Double_t mu,Double_t sigma ) Gaussian random numbers.
Default values: mu=0, sigma=1
Double_t Exp(Double_t tau) Exponential random numbers with mean tau.
Double_t Landau(Double_t mean,Double_t s igma)

Landau distributed random numbers.

Default values: mean=0, sigma=1

Double_t BreitWigner(Double_t mean,Double_t gamma) Breit-Wigner distributed random numbers.
Default values mean=0, gamma=1
Int_t Poisson(Double_t mean)
Double_t PoissonD(Double_t mean)
Poisson random numbers
Int_t Binomial(Int_t ntot,Double_t prob ) Binomial Random numbers
Circle(Double_t &x,Double_t &y,Double_t r) Generate a random 2D point (x,y) in a circle of radius r
Sphere(Double_t &x,Double_t &y,
Double_t &z,Double_t r)
Generate a random 3D point (x,y,z) in
a sphere of radius r
Rannor(Double_t &a,Double_t &b)

Generate a pair of Gaussian random
numbers with mu=0 and sigma=1

三、绘制直方图

1、直方图绘制

运用Draw()方法即可绘制直方图,在前文的很多例子中都已经出现过了。

TH1* th1 = new TH1F("th1","Hist with constant bin width",100,-5.,5.);
th1->FillRandom("gaus",10000);th1->Draw();

2、直方图样式

Draw()方法含有很多的参数,该参数影响直方图的线条,填充样式。之后单独更新一篇文章。

三、操作直方图

1、直方图的其他常用Get和Set方法列表

(1)获取直方图事例总数

利用GetEntries()函数,可以返回该一维直方图范围内的事例总数。

TH1::GetEntries();
//you can
th1->GetEntries();

(2)获取直方图事例平均值

TH1::GetMean();
//you can
th1->GetMean();

(3)获取直方图事例方差

TH1::GetStdDev();
//you can
th1->GetStdDev();

(4)直方图归一化

利用Scale()函数可以令直方图每个bin的值同时乘以该常数。其参数填写为总事例量的倒数既可以对直方图归一。归一直方图将使得直方图全积分为1。

TH1::Scale(const);
//you can
th1->Scale(1/th1->GetEntries());

(5)直方图积分

利用Integral()函数,可以得到某个范围内的bin内的事例总数。可以用该函数检查直方图是否成功归一。

TH1::Integral(Int_t binlow,Int_t binup);
//you can
th1->Integral(0,49);
//or to the all bins
th1->Integral();
//If you want to output the result
cout<<th1->Integral()<<ats::endl;

2、删除直方图(简单画图可以不调用删除)

如果采用指针形式,在保存直方图后调用Delete()方法释放堆空间内存,可以防止内存泄漏。但保存直方图的SaveAs()方法要与TCanvas类一并使用。采用如下语句即可。

th1->Delete();

【资料】

1、ROOT官网——ROOT: analyzing petabytes of data, scientifically. - ROOT

2、ROOT文档——ROOT: TH1 Class Reference

3、ROOT官方指导书——《ROOTUsersGuide》

如有错误请指正。

【ROOT from CERN】——TH1绘制一维直方图相关推荐

  1. Opencv一维直方图的绘制

    下面是我参考<opencv3编程入门>写的绘制一维直方图的代码 using namespace cv; using namespace std; #define byte uchar #d ...

  2. 如何用python绘制灰度直方图_Python Opencv任意形状目标检测并绘制框图实例

    Python Opencv检测并绘制框图 opencv 进行任意形状目标识别,供大家参考,具体内容如下 工作中有一次需要在简单的图上进行目标识别,目标的形状不固定,并且存在一定程度上的噪声影响,但是噪 ...

  3. 使用Opencv绘制灰度直方图/对比

    一.所需结构体 CvHistogram 结构体原型: typedef struct CvHistogram {int type; /* 直方图类型 */CvArr* bins; /* 直方图数据 */ ...

  4. R语言使用ggplot2包的快速可视化函数qplot绘制基础直方图实战

    R语言使用ggplot2包的快速可视化函数qplot绘制基础直方图实战 目录 R语言使用ggplot2包的快速可视化函数qplot绘制基础直方图实战 #仿真数据

  5. R语言使用ggplot2包的快速可视化函数qplot绘制分组直方图(分组颜色设置)实战

    R语言使用ggplot2包的快速可视化函数qplot绘制分组直方图(分组颜色设置)实战 目录 R语言使用ggplot2包的快速可视化函数qplot绘制分组直方图(分组颜色设置)实战

  6. R绘制边缘直方图、箱图(Marginal Histogram / Boxplot)

    R绘制边缘直方图.箱图(Marginal Histogram / Boxplot) 如果要在同一图表中显示关系和分布(relation and distribution),请使用边缘直方图.它在散点图 ...

  7. 频率分布直方图组距如何确定_小猿圈Python开发之绘制频率分布直方图示例

    现在人工智能越来越实用,甚至深入到千家万户,随之而来的就是python技术的火爆,今天小猿圈python讲师为你讲解一下绘制频率分布直方图示例,希望对于刚刚自学python的你有一定的帮助. 项目中在 ...

  8. 【python图像处理】python绘制灰度直方图

    灰度直方图在数据统计分析.图像处理中有着比较广泛的应用,下面就介绍一下如何使用python来绘制灰度直方图. 下面直接看代码: import matplotlib.pyplot as plt impo ...

  9. opencv python matplotlib.pyplot.hist() 如何绘制灰度直方图,如何根据灰度直方图确定最优二值化值

    什么是灰度直方图? 图像直方图(histogram)是图像的统计学特征,常用于了解图像的基本特征以便分析.不过图像的直方图不具有空间特征. 图像的灰度直方图(histogram),就是将图像转化成灰度 ...

最新文章

  1. fastq质量值_fastq格式文件处理大全(四)
  2. 从u盘设备启动arc-livecd
  3. oracle大量删除数据之后索引是否需要重建_oracle10g重建XDB
  4. 浅析Postgres中的并发控制(Concurrency Control)与事务特性(上)
  5. Codeforces937D Sleepy Game
  6. JS设计模式之Module(模块)模式、Revealing Module(揭示模块)模式
  7. 在 Excel 内使用 ODBC 消费 SAP ABAP CDS view
  8. 网络仿真中数据生成相关
  9. sqlserver调用msxml3.dll中的xmlhttp对象
  10. java语言数组实现栈的操作_基于自定义的动态数组实现一个栈(Java语言)
  11. zookeeper配置文件说明
  12. 富士通大数据架构解决方案闪耀存储峰会
  13. 用更少的钱看更清晰的视频——详谈阿里云窄带高清
  14. mysql mssql 性能对比_详解mysql分区实验测试--非分区表与分区表的性能对比
  15. NOI2014起床困难综合症
  16. 阿里云发布的数加是什么鬼
  17. 【FPGA】Verilog 编码实现:与非门 | 或非门 | 异或门 | NAND/NOR/XOR 行为验证
  18. C语言实现秒与时间的互相转换
  19. 基于java客户订单管理系统
  20. Comand+/不能使用

热门文章

  1. HTML5版切水果游戏 HTML5游戏极品源码下载
  2. matlab鸢尾花数据线性分析,Iris鸢尾花数据集可视化、线性回归、决策树分析、KMeans聚类分析...
  3. Unity3D ARPG C# Scripting 學習筆記-1 ( 基本移动, 攀爬动作 )
  4. 火狐 脱机文件位置不能更改_快速提示:更改Firefox下载文件的位置
  5. realloc 用法
  6. 当数学老师和软件测试,狸米老师app评测:小学数学老师布置作业的神器
  7. matlab泊松分布随机数和图像_浅谈可靠性理论中的常用概率分布
  8. 全球受攻击的IoT设备呈指数级增长
  9. windows服务器被黑快速排查
  10. 计算机组成原理知识框架梳理