この文書の現在のバージョンと選択したバージョンの差分を表示します。
| 両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
|
ja:root:stat [2017/03/31 02:28] kota [2つのヒストグラムの統計情報を並べて書く] |
ja:root:stat [2019/04/18 16:23] (現在) kota [Statistics box内のtextの編集] |
||
|---|---|---|---|
| ライン 32: | ライン 32: | ||
| gStyle->SetStatH(3); //高さを変える | gStyle->SetStatH(3); //高さを変える | ||
| gStyle->SetStatW(0.15); //幅を変える (Canvas?全体の長さを1とする) | gStyle->SetStatW(0.15); //幅を変える (Canvas?全体の長さを1とする) | ||
| - | gStyle->SetStatFontSize(30); //フォントのサイズを変える | + | gStyle->SetStatFontSize(0.04); //フォントのサイズを変える |
| </code> | </code> | ||
| ライン 67: | ライン 67: | ||
| * 2つのヒストグラムの統計情報を縦に並べるには、例えば以下のようにすればよい | * 2つのヒストグラムの統計情報を縦に並べるには、例えば以下のようにすればよい | ||
| <code c_mac> | <code c_mac> | ||
| + | h0->SetLineColor(kBlack); | ||
| h0->Draw(); | h0->Draw(); | ||
| + | h1->SetLineColor(kRed); | ||
| h1->Draw("sames"); // "same" だとh0の統計boxが消えてしまう | h1->Draw("sames"); // "same" だとh0の統計boxが消えてしまう | ||
| - | |||
| gPad->Update(); | gPad->Update(); | ||
| | | ||
| - | Float_t st0_lower_left_x = 0.6; | + | const Float_t st0_lower_left_x = 0.6; |
| - | Float_t st0_lower_left_y = 0.75; | + | const Float_t st0_lower_left_y = 0.75; |
| - | Float_t st_Width = 0.39; | + | const Float_t st_Width = 0.39; |
| - | Float_t st_Height = 0.24; | + | const Float_t st_Height = 0.24; |
| - | Float_t st1_lower_left_x = st0_lower_left_x; | + | const Float_t st1_lower_left_x = st0_lower_left_x; |
| - | Float_t st1_lower_left_y = st0_lower_left_y - st_Height - 0.005; //-0.005 は2つのboxの隙間 | + | const Float_t st1_lower_left_y = st0_lower_left_y - st_Height - 0.005; //-0.005 は2つのboxの隙間 |
| //h0 の統計boxについて | //h0 の統計boxについて | ||
| - | TPaveStats *st10 = (TPaveStats*)h0->FindObject("stats"); | + | TPaveStats *st0 = (TPaveStats*)h0->FindObject("stats"); |
| - | st10->SetX1NDC(st0_lower_left_x); | + | st0->SetX1NDC(st0_lower_left_x); |
| - | st10->SetY1NDC(st0_lower_left_y); | + | st0->SetY1NDC(st0_lower_left_y); |
| - | st10->SetX2NDC(st0_lower_left_x + st_Width); | + | st0->SetX2NDC(st0_lower_left_x + st_Width); |
| - | st10->SetY2NDC(st0_lower_left_y + st_Height); | + | st0->SetY2NDC(st0_lower_left_y + st_Height); |
| + | st0->SetLineColor(kBlack); | ||
| //h1 の統計boxについて | //h1 の統計boxについて | ||
| - | TPaveStats *st11 = (TPaveStats*)h1->FindObject("stats"); | + | TPaveStats *st1 = (TPaveStats*)h1->FindObject("stats"); |
| - | st11->SetX1NDC(st1_lower_left_x); | + | st1->SetX1NDC(st1_lower_left_x); |
| - | st11->SetY1NDC(st1_lower_left_y); | + | st1->SetY1NDC(st1_lower_left_y); |
| - | st11->SetX2NDC(st1_lower_left_x + st_Width); | + | st1->SetX2NDC(st1_lower_left_x + st_Width); |
| - | st11->SetY2NDC(st1_lower_left_y + st_Height); | + | st1->SetY2NDC(st1_lower_left_y + st_Height); |
| + | st1->SetLineColor(kRed); | ||
| //反映させる | //反映させる | ||
| c->Modified(); // ”変更した” というフラグを立ててやる | c->Modified(); // ”変更した” というフラグを立ててやる | ||
| ライン 107: | ライン 110: | ||
| ---- | ---- | ||
| - | Statistic box内のtextの編集は[[https://root.cern.ch/doc/v608/classTPaveStats.html|公式のクラスリファレンス]]の”Statistics box editing”のところをみると良い。 | + | ==== Statistics box内のtextの編集 ==== |
| + | |||
| + | [[https://root.cern.ch/doc/v608/classTPaveStats.html|公式のクラスリファレンス]]の” Statistics box editing”のところをみると良い。 | ||
| + | |||
| + | 参考コードを以下に。 | ||
| + | <code cpp> | ||
| + | |||
| + | 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(); | ||
| + | |||
| + | } | ||
| + | |||
| + | |||
| + | </code> | ||
| + | ---- | ||
| + | ポイントは、 | ||
| + | * 統計ボックス内のtextにアクセスするには、TList* TPaveStats::GetListOfLines() でtextのリストを取ってきてやる | ||
| + | * TAttText::SetTextSize(0)とすることで、フォントサイズを自動調整 | ||
| + | * TPad::Modified(), TPad::Update()を(こまめに?)呼んでやる | ||
| + | * TPaveStats::SetName("hoge")で名前を変えてやる | ||
| + | * 変更後、TH1::SetStats(0)を呼んでやる | ||
| + | あたりだろうか。 | ||
| + | {{ :ja:root:stat_edit.png?400 |}} | ||
| + | ---- | ||