二维直方图是数据处理中最常用的存储类型,二维直方图的绘制在ROOT中也有很多种类型,本文通过ROOT官方教程的draw2dopt.C示例,来具体讲述ROOT框架中二维直方图的绘制类型。
下面给出具体代码步骤:
设置不显示统计信息:
gStyle->SetOptStat(0);
设置画板背景颜色:
gStyle->SetCanvasColor(33);
设置画板框架填充颜色:
gStyle->SetFrameFillColor(18);
创建二维函数:
TF2 *f2 = new TF2("f2","xygaus + xygaus(5) + xylandau(10)",-4,4,-4,4);
向函数中的参数进行定值:
Double_t params[] = {130,-1.4,1.8,1.5,1, 150,2,0.5,-2,0.5, 3600,-2,0.7,-3,0.3};
f2->SetParameters(params);
创建二维直方图:
auto h2 = new TH2F("h2","xygaus + xygaus(5) + xylandau(10)",20,-4,4,20,-4,4);
设置直方图内填充颜色:
h2->SetFillColor(46);
生成随机数填充直方图:
h2->FillRandom("f2",40000);
新建小标签:
auto pl = new TPaveLabel();
绘制基本二维类型:
Float_t xMin=0.67, yMin=0.875, xMax=0.85, yMax=0.95; //设置标签绘制位置
Int_t cancolor = 17;
auto c2h = new TCanvas("c2h","2-d options",10,10,800,600); //创建画板
c2h->Divide(2,2); //将画板横纵分别分为2块
c2h->SetFillColor(cancolor); //设置填充颜色
c2h->cd(1); //定位到第一块区域
h2->Draw(); //绘制直方图(默认散点图)
pl->DrawPaveLabel(xMin,yMin,xMax,yMax,"SCAT","brNDC"); //绘制小标签,brNDC为字体类型
c2h->cd(2);
h2->Draw("box"); //方块类型
pl->DrawPaveLabel(xMin,yMin,xMax,yMax,"BOX","brNDC");
c2h->cd(3);
h2->Draw("arr"); //箭头类型
pl->DrawPaveLabel(xMin,yMin,xMax,yMax,"ARR","brNDC");
c2h->cd(4);
h2->Draw("colz"); //彩色类型
pl->DrawPaveLabel(xMin,yMin,xMax,yMax,"COLZ","brNDC");
c2h->Update();
绘制数字显示的直方图类型:
auto ctext = new TCanvas("ctext","text option",50,50,800,600); //创建新的画板
gPad->SetGrid(); //设置网格
ctext->SetFillColor(cancolor); //设置填充颜色
ctext->SetGrid(); //设置网格
h2->Draw("text"); //绘制数字类型
pl->DrawPaveLabel(xMin,yMin,xMax,yMax,"TEXT","brNDC"); //绘制小标签
ctext->Update();
绘制轮廓类型的二维直方图:
auto cont = new TCanvas("contours","contours",100,100,800,600); //创建画板
cont->Divide(2,2);
gPad->SetGrid();
cont->SetFillColor(cancolor);
cont->cd(1);
h2->Draw("contz"); //比较艳丽的类型
pl->DrawPaveLabel(xMin,yMin,xMax,yMax,"CONTZ","brNDC");
cont->cd(2);
gPad->SetGrid();
h2->Draw("cont1"); //彩色轮廓线
pl->DrawPaveLabel(xMin,yMin,xMax,yMax,"CONT1","brNDC");
cont->cd(3);
gPad->SetGrid();
h2->Draw("cont2"); //轮廓线(实线+虚线)
pl->DrawPaveLabel(xMin,yMin,xMax,yMax,"CONT2","brNDC");
cont->cd(4);
gPad->SetGrid();
h2->Draw("cont3"); //轮廓线(实线)
pl->DrawPaveLabel(xMin,yMin,xMax,yMax,"CONT3","brNDC");
cont->Update();
绘制lego类型(柱状)的二维直方图:
auto lego = new TCanvas("lego","lego options",150,150,800,600);
lego->Divide(2,2);
lego->SetFillColor(cancolor);
lego->cd(1);
h2->Draw("lego"); //普通柱状类型
pl->DrawPaveLabel(xMin,yMin,xMax,yMax,"LEGO","brNDC");
lego->cd(2);
h2->Draw("lego1"); //红色柱状类型
pl->DrawPaveLabel(xMin,yMin,xMax,yMax,"LEGO1","brNDC");
绘制柱坐标系的二维直方图:
lego->cd(3);
gPad->SetTheta(61); //设置角度偏离
gPad->SetPhi(-82); //设置长度偏离
h2->Draw("surf1pol");
pl->DrawPaveLabel(xMin,yMin,xMax+0.05,yMax,"SURF1POL","brNDC");
lego->cd(4);
gPad->SetTheta(21); gPad->SetPhi(-90);
h2->Draw("surf1cyl");
pl->DrawPaveLabel(xMin,yMin,xMax+0.05,yMax,"SURF1CYL","brNDC");
lego->Update();
绘制比较光滑的二维直方图:
auto surf = new TCanvas("surfopt","surface options",200,200,800,600);
surf->Divide(2,2);
surf->SetFillColor(cancolor);
surf->cd(1);
h2->Draw("surf1");
pl->DrawPaveLabel(xMin,yMin,xMax,yMax,"SURF1","brNDC");
surf->cd(2);
h2->Draw("surf2z");
pl->DrawPaveLabel(xMin,yMin,xMax,yMax,"SURF2Z","brNDC");
surf->cd(3);
h2->Draw("surf3");
pl->DrawPaveLabel(xMin,yMin,xMax,yMax,"SURF3","brNDC");
surf->cd(4);
h2->Draw("surf4");
pl->DrawPaveLabel(xMin,yMin,xMax,yMax,"SURF4","brNDC");
surf->Update();
代码地址:https://github.com/root-project/root/blob/master/tutorials/hist/draw2dopt.C