Deprecated: Array and string offset access syntax with curly braces is deprecated in /mnt/hep_web/hep_web/member/n-kota/dokuwiki/inc/init.php on line 542
====== 統計情報(統計box) ======
----
===== 統計情報の表示 =====
* 表示される情報は、SetOptStat で制御される
gStyle->SetOptStat(mode);
*modeで指定するのは、尖度(k)、歪度(s)、ビン数(i)、オーバーフロー数(o)、アンダーフロー数(u)、RMS(%%r%%)、平均値(m)、データ数(e)、ヒストグラム名(n)
* modeの指定には2通りの書き方がある。
- 0を非表示、1を表示、2をエラー付きで表示(k,s,r,mのみ)として、ksiourmen の順に gStyle%%->%%SetOptStat(000111111) のように指定する方法。
* デフォルトは、gStyle%%->%%SetOptStat(000001111)
* 頭の方の0は書かなければ省略したとみなされるので、gStyle%%->%%SetOptStat(1111) と gStyle-%%->%%SetOptStat(000001111) は同じ意味
* gStyle%%->%%SetOptStat(1) は gStyle%%->%%SetOptStat(1111) と認識されてしまうらしい。ヒストグラム名だけを表示させたければ、 gStyle%%->%%SetOptStat(1000000001) のようにすればよい。(頭に1を足して10桁にする)
- 文字を用いて gStyle-%%->%%SetOptStat("nemr") のように""で囲んで指定する。
*デフォルトは gStyle%%->%%SetOptStat("nemr")
*基本的には小文字だが、K,S,R,M は大文字もあり、これらはエラー付きを表す。
*Iにも大文字があり、Integralの"幅"を表示してくれるらしい。(上のやり方にもiに対応するところに2を入れられるかも?未確認)
----
===== 統計boxの移動・サイズ変更 =====
//移動
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); //フォントのサイズを変える
----
===== 統計BOXのIntegralなどの表示桁数を変更したい =====
gStyle->SetStatFormat("6.6g");
とするか、またはTPaveStats *stに対して
st->SetStatFormat("6.6g");
などのようにして、フォーマットを指定する。
デフォルトは"6.4g"。
これらの意味するところはフォーマット指定子を[[ja:cpp:iostream|参照]]。
===== 個々のヒストグラムなどの統計boxに対する操作 =====
* 以下のようにして、Drawしたヒストグラムの統計boxをとってこれる
h->Draw();
gPad->Update(); //マクロに書いて実行するときにはこれがないと h->FindObject("stats") が NULL ポインタを返してしまう
//コマンドラインでやるときは多分必要ない
TPaveStats *st = (TPaveStats*)h->FindObject("stats");
* histogram hの統計boxを削除したいときは h%%->%%SetStats(0)
==== 2つのヒストグラムの統計情報を並べて書く ====
* 2つのヒストグラムの統計情報を縦に並べるには、例えば以下のようにすればよい
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(); // フラグが立っているものを変更、反映する
* NDC : Normalized Descartes Coordinate のことだと思われる(0〜1まで)
* 最後の反映に関わるところは、Canvasを分割している場合は次のように分割pad毎にModified , Update する必要がある。
c->cd(1)->Modified();
c->cd(1)->Update();
----
==== Statistics box内のtextの編集 ====
[[https://root.cern.ch/doc/v608/classTPaveStats.html|公式のクラスリファレンス]]の” 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();
}
----
ポイントは、
* 統計ボックス内のtextにアクセスするには、TList* TPaveStats::GetListOfLines() でtextのリストを取ってきてやる
* TAttText::SetTextSize(0)とすることで、フォントサイズを自動調整
* TPad::Modified(), TPad::Update()を(こまめに?)呼んでやる
* TPaveStats::SetName("hoge")で名前を変えてやる
* 変更後、TH1::SetStats(0)を呼んでやる
あたりだろうか。
{{ :ja:root:stat_edit.png?400 |}}
----