ROOT叠加TH1并保留所有statistics box

    科技2025-10-27  6

    详见ROOT官方文档https://root.cern/doc/master/classTPaveStats.html 以及论坛帖子:https://root-forum.cern.ch/t/how-to-move-statistics-box-when-using-draw-sames/5139

    在调用TH1::Draw()方法时,可以使用“same”选项将两个TH1叠加在同一个TCanvas上,但这样做会导致图中只保留一个直方图的统计信息。例如:

    { TH1D* h1 = new TH1D("h1","h1",100,-5,5); TH1D* h2 = new TH1D("h2","h2",100,-5,5); h1->FillRandom("gaus",60000); h2->FillRandom("gaus",20000); TCanvas* c = new TCanvas(); h1->SetLineColor(kRed); h2->SetLineColor(kBlue); h1->Draw(); h2->Draw("same"); c->Draw(); }

    要同时保留两个直方图的统计信息栏,就需要:

    使用“sames”选项保证两个statistics box的名称不一样: TPaveStats::SetName(const char* name = "")保证两个statistcs box的位置不同: TPaveStats::SetY1NDC(Double_t y1); TPaveStats::SetY2NDC(Double_t y2),我想它们分别控制statistics box的上下边框 到整个canvas低端距离占整个canvas高度的比例。

    这个box对应的类是TPaveStats,而获取它的方法是:

    TCanvas *se = new TCanvas(); TPaveStats *ps = (TPaveStats*)se->GetPrimitive("stats");

    完整的例子:

    { TH1D* h1 = new TH1D("h1","h1",100,-5,5); TH1D* h2 = new TH1D("h2","h2",100,-5,5); h1->FillRandom("gaus",60000); h2->FillRandom("gaus",20000); TCanvas* c = new TCanvas(); h1->SetLineColor(kRed); h2->SetLineColor(kBlue); h1->Draw(); c->Update(); TPaveStats* s1 = (TPaveStats*)c->GetPrimitive("stats"); s1->SetName("h1"); s1->SetY1NDC(1); s1->SetY2NDC(1-0.1); h2->Draw("sames"); c->Update(); TPaveStats* s2 = (TPaveStats*)c->GetPrimitive("stats"); s2->SetName("h2"); s2->SetY1NDC(1-0.6); s2->SetY2NDC(1-0.5); c->Draw(); }

    可以看到,两个box一个顶在最上面,一个恰好在最中间。

    Processed: 0.009, SQL: 8