この文書の現在のバージョンと選択したバージョンの差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
ja:root:stat [2014/04/17 12:24] kota [2つのヒストグラムの統計情報を並べて書く] |
ja:root:stat [2019/04/18 16:23] (現在) kota [Statistics box内のtextの編集] |
||
---|---|---|---|
ライン 27: | ライン 27: | ||
<code c_mac> | <code c_mac> | ||
//移動 | //移動 | ||
- | gStyle->SetStatX(0.2); // | + | gStyle->SetStatX(0.2); //統計boxの右上角のX座標(左下を(0,0),右上を(1,1)) |
- | gStyle->SetStatY(0.9); // | + | gStyle->SetStatY(0.9); //統計boxの右上角のY座標(左下を(0,0),右上を(1,1)) |
//サイズ変更 | //サイズ変更 | ||
gStyle->SetStatH(3); //高さを変える | gStyle->SetStatH(3); //高さを変える | ||
- | gStyle->SetStatW(0.15); //幅を変える | + | gStyle->SetStatW(0.15); //幅を変える (Canvas?全体の長さを1とする) |
- | gStyle->SetStatFontSize(30); //フォントのサイズを変える | + | gStyle->SetStatFontSize(0.04); //フォントのサイズを変える |
</code> | </code> | ||
---- | ---- | ||
+ | ===== 統計BOXのIntegralなどの表示桁数を変更したい ===== | ||
+ | <code c_mac> | ||
+ | gStyle->SetStatFormat("6.6g"); | ||
+ | </code> | ||
+ | とするか、またはTPaveStats *stに対して | ||
+ | <code c_mac> | ||
+ | st->SetStatFormat("6.6g"); | ||
+ | </code> | ||
+ | などのようにして、フォーマットを指定する。 | ||
+ | デフォルトは"6.4g"。 | ||
+ | これらの意味するところはフォーマット指定子を[[ja:cpp:iostream|参照]]。 | ||
===== 個々のヒストグラムなどの統計boxに対する操作 ===== | ===== 個々のヒストグラムなどの統計boxに対する操作 ===== | ||
ライン 54: | ライン 65: | ||
==== 2つのヒストグラムの統計情報を並べて書く ==== | ==== 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(); | ||
| | ||
- | TPaveStats *st0 = (TPaveStats*)h0->FindObject("stats"); | + | const Float_t st0_lower_left_x = 0.6; |
- | Float_t st0_lower_left_x = 0.7; | + | const Float_t st0_lower_left_y = 0.75; |
- | Float_t st0_lower_left_y = 0.85; | + | const Float_t st_Width = 0.39; |
- | Float_t st0_Width = 0.29; | + | const Float_t st_Height = 0.24; |
- | Float_t st0_Height = 0.14; | + | 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の隙間 | |
- | + | ||
- | st0->SetX1NDC(st0_lower_left_x); //new x start position | + | |
- | st0->SetY1NDC(st0_lower_left_y); //new y start position | + | |
- | //NDC : Normalized Descartes Coordinate のことだと思われる(0〜1まで) | + | |
- | st0->SetX2NDC(st0_lower_left_x + st0_Width); //new x end position | + | |
- | st0->SetY2NDC(st0_lower_left_y + st0_Height); //new y end position | + | |
+ | //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"); | TPaveStats *st1 = (TPaveStats*)h1->FindObject("stats"); | ||
- | st1->SetX1NDC(0.7);//もちろん、直接数字で指定してもOK | + | st1->SetX1NDC(st1_lower_left_x); |
- | st1->SetY1NDC(0.7); | + | st1->SetY1NDC(st1_lower_left_y); |
- | st1->SetX2NDC(0.99); | + | st1->SetX2NDC(st1_lower_left_x + st_Width); |
- | st1->SetY2NDC(0.84); | + | st1->SetY2NDC(st1_lower_left_y + st_Height); |
- | + | st1->SetLineColor(kRed); | |
- | + | //反映させる | |
- | + | ||
- | //反映させる | + | |
c->Modified(); // ”変更した” というフラグを立ててやる | c->Modified(); // ”変更した” というフラグを立ててやる | ||
c->Update(); // フラグが立っているものを変更、反映する | c->Update(); // フラグが立っているものを変更、反映する | ||
- | |||
</code> | </code> | ||
+ | * NDC : Normalized Descartes Coordinate のことだと思われる(0〜1まで) | ||
+ | |||
* 最後の反映に関わるところは、Canvasを分割している場合は次のように分割pad毎にModified , Update する必要がある。 | * 最後の反映に関わるところは、Canvasを分割している場合は次のように分割pad毎にModified , Update する必要がある。 | ||
- | <code_mac> | + | <code c_mac> |
c->cd(1)->Modified(); | c->cd(1)->Modified(); | ||
c->cd(1)->Update(); | c->cd(1)->Update(); | ||
</code> | </code> | ||
+ | |||
+ | ---- | ||
+ | ==== 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 |}} | ||
+ | ---- |