TH2* h2 = new TH2F("h2", "h2 title; x title; y title", x bins, x min, x max, y bins, y min, y max);
二维直方图方向投影
二维直方图的 x 轴、y 轴统计信息支持投影。将 Hist2 的 x 轴统计信息投影给 Hist1:
aotu Hist1 = new TH1D;
Hist1 = Hist2->ProjectionX();
二维直方图区域剪切
修改二维直方图显示区域使用类TCutG。
void h2_cut() {
const int n = 6;
Float_t x[6] = { 1, 2, 1, -1, -2, -1 };
Float_t y[6] = { 2, 0, -2, -2, 0, 2 };
TCutG *cut = new TCutG("cut", 6, x, y);
TH2F *hist = new TH2F("hist", "Histogram with cut", 40, -10., 10., 40, -10., 10.);
for (int i = 0; i < 100000; i++)
hist->Fill(gRandom->Gaus(0., 3.), gRandom->Gaus(0., 3.));
TCanvas *c1 = new TCanvas("c1", "Histogram draw with TCutG", 600, 900);
hist->Draw("col [cut]");
cut->Draw("l");
}
绘图选项
支持2D直方图的选项
Option
Description
"ARR"
箭头模式。 显示相邻单元格之间的梯度。
"BOX"
为每个单元格绘制一个盒子,其表面积与内容的绝对值成比例。 负内容用 X 标记。
"BOX1"
为每个单元格绘制一个按钮,其表面与内容的绝对值成比例。 凹陷的按钮表示负值,凸起的按钮表示正值。
"COLZ"
为bin绘制颜色与调色板,为0值填充颜色。
"COL2"
“COL”的替代渲染算法。 可以显着提高大型非稀疏二维直方图的渲染性能。
"COLZ2"
与“COL2”相同。 此外,还绘制了调色板。
"Z CJUST"
"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上色
{
auto c1 = new TCanvas("c1","c1",600,600);
c1->Divide(1,2);
auto hcol23 = new TH2F("hcol23","Option COLZ example ",40,-4,4,40,-20,20);
auto hcol24 = new TH2F("hcol24","Option COLZ1 example ",40,-4,4,40,-20,20);
float px, py;
for (Int_t i = 0; i < 25000; i++) {
gRandom->Rannor(px,py);
hcol23->Fill(px,5*py);
hcol24->Fill(px,5*py);
}
hcol23->Fill(0.,0.,-200.);
hcol24->Fill(0.,0.,-200.);
c1->cd(1); hcol23->Draw("COLZ");
c1->cd(2); hcol24->Draw("COLZ1");
}
E.g. POL
{
auto c1 = new TCanvas("c1","c1",600,400);
auto hcol1 = new TH2F("hcol1","Option COLor combined with POL",40,-4,4,40,-4,4);
float px, py;
for (Int_t i = 0; i < 25000; i++) {
gRandom->Rannor(px,py);
hcol1->Fill(px,py);
}
hcol1->Draw("COLZPOL");
}
E.g. COUNTZ
{
auto c1 = new TCanvas("c1","c1",600,400);
auto hcontz = new TH2F("hcontz","Option CONTZ example ",40,-4,4,40,-20,20);
float px, py;
for (Int_t i = 0; i < 25000; i++) {
gRandom->Rannor(px,py);
hcontz->Fill(px-1,5*py);
hcontz->Fill(2+0.5*px,2*py-10.,0.1);
}
hcontz->Draw("CONTZ");
}
E.g. LEGO2Z
{
auto c2 = new TCanvas("c2","c2",600,400);
auto hlego2 = new TH2F("hlego2","Option LEGO2Z example ",40,-4,4,40,-20,20);
float px, py;
for (Int_t i = 0; i < 25000; i++) {
gRandom->Rannor(px,py);
hlego2->Fill(px-1,5*py);
hlego2->Fill(2+0.5*px,2*py-10.,0.1);
}
hlego2->Draw("LEGO2Z");
}
E.g. SURF1
{
auto c2 = new TCanvas("c2","c2",600,400);
auto hsurf1 = new TH2F("hsurf1","Option SURF1 example ",30,-4,4,30,-20,20);
float px, py;
for (Int_t i = 0; i < 25000; i++) {
gRandom->Rannor(px,py);
hsurf1->Fill(px-1,5*py);
hsurf1->Fill(2+0.5*px,2*py-10.,0.1);
}
hsurf1->Draw("SURF1");
}
E.g. Cont3 and COLZ
{
TCanvas *c1 = new TCanvas();
gStyle->SetOptStat(0);
TH2F *h1 = new TH2F("h1","h1",50,-4,4,50,-4,4);
Double_t a,b;
for (Int_t i=0;i<306500;i++) {gRandom->Rannor(a,b);h1->Fill(a-1.5,b-1.5);}
for (Int_t i=0;i<550;i++) {h1->Fill(3.5,3);}
for (Int_t i=0;i<450;i++) {h1->Fill(3.5,2);}
for (Int_t i=0;i<350;i++) {h1->Fill(3.5,1);}
for (Int_t i=0;i<250;i++) {h1->Fill(3.5,0);}
for (Int_t i=0;i<150;i++) {h1->Fill(3.5,-1);}
for (Int_t i=0;i< 50;i++) {h1->Fill(3.5,-2);}
for (Int_t i=0;i< 5;i++) {h1->Fill(3.5,-3);}
double contours[4];
contours[0] = 3;
contours[1] = 100;
contours[2] = 900;
contours[3] = 1500;
h1->DrawCopy("colz");
h1->SetContour(4,contours);
h1->Draw("cont3 same");
h1->SetLineColor(kRed);
}
{
TH2D h2("h2","Histogram filled with random numbers",40,-4,4,40,-20,20);
float px, py;
for (int i = 0; i < 25000; i++) {
gRandom->Rannor(px,py);
h2.Fill(px,5*py);
}
h2.DrawCopy("LEGO1");
}
E.g. 1维高斯和2维高斯投影,及多种2维展示风格
void histogram2D(){
TCanvas *c = new TCanvas("c","c",800,1200);
c->Divide(2,3);
//新建画布800*1200,布局为2*3,横*高,主函数名需与文件名一致,即该文件名为"histogram3D.c"
float x,y;
TH1F *h1 = new TH1F("h1","1D histogram",50,-10,10);
TH2F *h2 = new TH2F("h2","2D histogram",50,-10,10,50,-10,10);
TH2F *h3 = new TH2F("h3","2D histogram",50,-10,10,50,-10,10);
TH1D *ph; //一维投影
for (int i=0;i<30000;i++){
x=gRandom->Gaus(0,0.5);
y=gRandom->Gaus(0,1);
h1->Fill(3*x);
h2->Fill(x,y);
h3->Fill(x,y);
}
c->cd(1);
h1->Draw();
c->cd(2);
h2->Draw("lego");
c->cd(3);
h3->Draw("lego2");
c->cd(4);
ph = h2->ProjectionX();
ph->SetTitle("The projection of n2 on X");
ph->Draw();
}