gStyle->SetOptStat(mode);
//移動 gStyle->SetStatX(0.2); //統計boxの右上角のX座標(左下を(0,0),右上を(1,1)) gStyle->SetStatY(0.9); //統計boxの右上角のY座標(左下を(0,0),右上を(1,1)) //サイズ変更 gStyle->SetStatH(3); //高さを変える gStyle->SetStatW(0.15); //幅を変える (Canvas?全体の長さを1とする) gStyle->SetStatFontSize(0.04); //フォントのサイズを変える
gStyle->SetStatFormat("6.6g");
とするか、またはTPaveStats *stに対して
st->SetStatFormat("6.6g");
などのようにして、フォーマットを指定する。 デフォルトは“6.4g”。 これらの意味するところはフォーマット指定子を参照。
h->Draw(); gPad->Update(); //マクロに書いて実行するときにはこれがないと h->FindObject("stats") が NULL ポインタを返してしまう //コマンドラインでやるときは多分必要ない TPaveStats *st = (TPaveStats*)h->FindObject("stats");
h0->SetLineColor(kBlack); h0->Draw(); h1->SetLineColor(kRed); h1->Draw("sames"); // "same" だとh0の統計boxが消えてしまう gPad->Update(); const Float_t st0_lower_left_x = 0.6; const Float_t st0_lower_left_y = 0.75; const Float_t st_Width = 0.39; const Float_t st_Height = 0.24; const Float_t st1_lower_left_x = st0_lower_left_x; const Float_t st1_lower_left_y = st0_lower_left_y - st_Height - 0.005; //-0.005 は2つのboxの隙間 //h0 の統計boxについて TPaveStats *st0 = (TPaveStats*)h0->FindObject("stats"); st0->SetX1NDC(st0_lower_left_x); st0->SetY1NDC(st0_lower_left_y); st0->SetX2NDC(st0_lower_left_x + st_Width); st0->SetY2NDC(st0_lower_left_y + st_Height); st0->SetLineColor(kBlack); //h1 の統計boxについて TPaveStats *st1 = (TPaveStats*)h1->FindObject("stats"); st1->SetX1NDC(st1_lower_left_x); st1->SetY1NDC(st1_lower_left_y); st1->SetX2NDC(st1_lower_left_x + st_Width); st1->SetY2NDC(st1_lower_left_y + st_Height); st1->SetLineColor(kRed); //反映させる c->Modified(); // ”変更した” というフラグを立ててやる c->Update(); // フラグが立っているものを変更、反映する
c->cd(1)->Modified(); c->cd(1)->Update();
公式のクラスリファレンスの” Statistics box editing”のところをみると良い。
参考コードを以下に。
void Stat() { TCanvas *c1 = new TCanvas("c1","c1",800,600); c1->SetGrid(0,0); TH1D *hist = new TH1D("hist","",60,-3,3); hist->FillRandom("gaus",1000); hist->SetLineWidth(3); hist->SetLineColor(kBlue); hist->Draw(); /////////////// ///// fit ///// /////////////// TF1 *gaus1 = new TF1("gaus1","gausn",-3,3);///// [0]*exp(-0.5*( (x-[1])/[2])**2 ) / (sqrt(2*pi)*[2]) gaus1->SetLineWidth(5); gaus1->SetLineColor(kRed); Double_t FitRangeMin = -2.5; Double_t FitRangeMax = 2.5; //hist->Fit("gaus1","","",FitRangeMin,FitRangeMax); hist->Fit("gaus1","0","",FitRangeMin,FitRangeMax);///// 0はfit関数を描かないようにするため gaus1->SetRange(FitRangeMin,FitRangeMax);///// fit rangeでだけ関数を表示するように gaus1->Draw("same"); Double_t Gaus1Mean = gaus1->GetParameter(1); Double_t Gaus1Sigma = gaus1->GetParameter(2); cout << "Gaus-1 : " << endl; cout << " Mean = " << Gaus1Mean << endl; cout << " Sigma = " << Gaus1Sigma << endl; cout << "Chisq/NDF = " << gaus1->GetChisquare() <<"/"<< gaus1->GetNDF() << endl; //////////////// ///// stat ///// //////////////// gPad->Modified();/////TPad::Modified()はいらないけどとりあえず呼んでおけばいいんでなかろうか。 gPad->Update();///// TPad::Update() is needed <---こちらは必要 TPaveStats *st1 = (TPaveStats*)hist->FindObject("stats"); //TPaveStats *st1 = (TPaveStats*)gPad->GetPrimitive("stats"); st1->SetName("mystats");///// <-- 名前を変更しておく必要あり(そうしないと、hist->SetStats(0)で消えてしまう) st1->SetOptFit(0); ///// TPad::Modified() and TPad::Update() are needed to reflect st1->SetOptFit(0) gPad->Modified(); gPad->Update(); ///// position and size of the stat. box st1->SetX1NDC(0.90-0.25); st1->SetY1NDC(0.90-0.25); st1->SetX2NDC(0.90); st1->SetY2NDC(0.90); //// frame of the stat. box st1->SetLineWidth(3); st1->SetLineStyle(2); st1->SetLineColor(kMagenta); ///// modify/remove lines TList *listOfLines = st1->GetListOfLines(); st1->GetLineWith("Entries")->SetTextColor(kBlue); st1->GetLineWith("Mean")->SetTextColor(kBlue); TText *tconst = st1->GetLineWith("RMS"); listOfLines->Remove(tconst); ///// Add new lines in the stat box. ///// Note that "=" is a control character TLatex *TextGaus1Mean = new TLatex(0,0,Form("Gaus Mean = %.2f",Gaus1Mean)); TextGaus1Mean->SetTextColor(kRed); TextGaus1Mean->SetTextSize(0);///// 0にしておくことで、フォントサイズを自動で調整してくれる listOfLines->Add(TextGaus1Mean); TLatex *TextGaus1Sigma = new TLatex(0,0,Form("Gaus Sigma = %.2f",Gaus1Sigma)); TextGaus1Sigma->SetTextColor(kRed); TextGaus1Sigma->SetTextSize(0);///// 0にしておくことで、フォントサイズを自動で調整してくれる listOfLines->Add(TextGaus1Sigma); ///// the following line is needed to avoid that the automatic redrawing of stats hist->SetStats(0); gPad->Modified();///// TPad::Modified() is needed gPad->Update(); }
ポイントは、