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
====== 軸の設定・装飾 ======
----
===== はじめに =====
ROOTでは軸の目盛文字のことを**”Label”**といい、[MeV]とか[cm]とかの軸に添わせた文字を**”Title”**という。
また、目盛線のことを**”Tick”**という。
----
===== Axis 関係 =====
==== 軸をLogにする ====
* いくつか方法あり
=== 複数のcanvasで一括してLogに変更 ===
gStyle->SetOptLogx(1); // X軸の目盛をログ表示
gStyle->SetOptLogy(1); // Y軸の目盛をログ表示
* gStyle はそもそもデフォルトを変更するためのもの。
* gStyle%%->%%SetOptLogy() のように()の中が空でも構わない。
* 対数軸をやめて通常に戻すには gStyle%%->%%SetOptLogy(0) のようにすればよい。
=== 今いるcanvasの軸をLogにする ===
gPad->SetLogy(1);
*gPadは "今いるキャンバス" のことを指す。(TCanvas *c = new TCanvas("c","c",600,300); c%%->%%Divide(2,1); c%%->%%cd(1) だと、左側のキャンバスを指す)
*gPad%%->%%SetLogy() でも同じ
*通常軸に戻すには gPad%%->%%SetLogy(0)
----
==== 軸のラベルをtextにする ====
=== 元のラベルを飛ばして、手動でtextを配置する方法 ===
hist->GetXaxis()->SetLabelOffset(100); // 範囲外へ元の数字のラベルを飛ばしてしまう
hist->GetXaxis()->SetNdivisions(3,1,1);
TLatex *label = new TLatex();
label->SetTextSize(0.07);
label->DrawLatexNDC(0.18,0.04,"K_{L}#rightarrow3#pi^{0}");// TLatexでtextを書いていく
label->DrawLatexNDC(0.45,0.04,"K_{L}#rightarrow2#pi^{0}");
label->DrawLatexNDC(0.72,0.04,"K_{L}#rightarrow2#gamma");
=== SetBinLabel functionを使う方法 ===
hist->GetXaxis()->SetBinLabel(1,"K_{L}#rightarrow3#pi^{0}");//第一引数はibin
hist->GetXaxis()->SetBinLabel(2,"K_{L}#rightarrow2#pi^{0}");// ibin=0 はunderflow
hist->GetXaxis()->SetBinLabel(3,"K_{L}#rightarrow2#gamma"); // ibin=nbin+1 はoverflow を表す
hist->GetXaxis()->SetLabelSize(0.07);
=== TPad::DrawFrame を使った場合 ===
DrawFrame functionで生成されるhistogramは、実はnbin=1000をもつ。
必要なbin数にまでrebinしてまとめてやった上でSetBinLabelを呼べば良い。
TString LabelText[3] = { "K_{L}#rightarrow3#pi^{0}",
"K_{L}#rightarrow2#pi^{0}",
"K_{L}#rightarrow2#gamma" };
TCanvas *c = new TCanvas("c","c",700,500);
TH1F *frame = (TH1F*)c->DrawFrame(0,3,3,4.5);
frame->GetXaxis()->SetNdivisions(3,1,1);
frame->Rebin( frame->GetNbinsX()/3 );
for(Int_t i = 0 ; i < 3 ; ++i)
frame->GetXaxis()->SetBinLabel(i+1,LabelText[i]);
frame->GetXaxis()->SetLabelSize(0.07);
----
==== 軸の色を変える ====
gStyle->SetAxisColor(Color_t color = 1, Option_t* axis = "X");
----
==== 軸の範囲を固定する ====
=== 1DヒストグラムでYを固定 ===
hist->SetMinimum(0);
hist->SetMaximum(100);
=== 2DヒストグラムでZを固定 ===
hist->GetZaxis()->SetRangeUser(0.,1000);
* SetRangeUser を使う。Zを固定したのは、2Dヒストを描いたとき。
----
===== Tick 関係(軸目盛) =====
gStyle->SetPadTickX(Int_t tickx);
gStyle->SetPadTickY(Int_t ticky);
gStyle->SetNdivisions(Int_t n = 510, Option_t* axis = "X");
// n = 1000*N3 + 100*N2 + N1 ---> n = CCBBAA ( CC:N3 , BB:N2 , AA:N1 )
// N1 : まず、軸をN1分割する(n=2なら軸の真ん中に1本目盛が入る)
// N2 : N1で分割した中の各区画をN2分割する
// N3 : N2で分割した中の各区画をさらにN3分割する
hist->GetXaxis()->SetNdivisions(Int_t n=510, Bool_t optim=kTRUE);
//histogram毎に設定することも可。
//optim=kTrueだと、指定した分割に近い区切りで、rootが勝手に最適化した区切りが採用される
//optim=kFalseだと、指定した通りの区切りに設定される。
hist->GetXaxis()->SetNdivisions(Int_t N1, Int_t N2, Int_t N3, Bool_t optim=kTRUE);
//こんなのもある。この方がわかりやすいかも。
hist->SetTickLength(Float_t length = 0.02, Option_t* axis = "X");
gStyle->SetTickLength(Float_t length = 0.03, Option_t* axis = "X");
//目盛線の長さを指定。単位はフレームに対する比率
//指定するのはSetNdivisionsのN1で付けられた目盛。N2の目盛はその半分の長さ、N3はさらに半分になる。
//内側を正の向きとし、負号の数を入れると外向きになる。
=====Title ,軸Title 関係 =====
*軸タイトルの方法と関係が深い
* まず、Titleを書く方法(デフォルトだと、ヒストグラムにいれたパラメータ名とカット条件が書かれる)
Th1D *h = new TH1D("histname","title;Xtitle;Ytitle",bin,min,max);//ヒストを作る際、セミコロンで“全体のタイトル;X軸名;Y軸名”と書く
h->SetTitle("Title");//ヒストからSetTitleする。(全体)
h->SetXTitle("X Title");//ヒストからSetTitleする。グラフでは使えない。(X)
h->SetYTitle("Y Title");//ヒストからSetTitleする。グラフでは使えない。(Y)
h->GetXaxis()->SetTitle("X Title");//こちらはグラフの場合でも使える。(X)
h->GetYaxis()->SetTitle("Y Title");//こちらはグラフの場合でも使える。(Y)
gStyle->SetOptTitle(0);//Title を書かない場合、0を入れる(1を入れれば書いてくれる) (全体)
* 位置調整、装飾など( = の後の数字等はデフォルトの値)
//gStyle を使う
gStyle->SetTitleColor(Color_t color = 1, Option_t* axis = "X");
gStyle->SetTitleFont(Style_t font = 62, Option_t* axis = "X");
gStyle->SetTitleOffset(Float_t offset = 1, Option_t* axis = "X");
gStyle->SetTitleSize(Float_t size = 0.02, Option_t* axis = "X");
//軸は"XYZ"のように複数選択することもできる。XYZ以外を入れると全体のTitleに対しての設定となる。(SetTitleOffset以外?)
//他にも以下のようなものがある。(全体のTitle 用?)
gStyle->SetTitleXOffset(Float_t offset = 1);
gStyle->SetTitleYOffset(Float_t offset = 1);
gStyle->SetTitleXSize(Float_t size = 0.02);
gStyle->SetTitleYSize(Float_t size = 0.02);
gStyle->SetTitleX(Float_t x = 0); //Title box(の左上角) の X 座標(Canvasの左下原点、0~1)
gStyle->SetTitleY(Float_t y = 0.985); //Title box(の左上角) の Y 座標(Canvasの左下原点、0~1)
gStyle->SetTitleW(Float_t w = 0); //Title box の幅
gStyle->SetTitleH(Float_t h = 0); //Title box の高さ
gStyle->SetTitleAlign(Int_t a = 13);// a=10*h+v, h=1,2,3 for left, center, top, v=1,2,3 for bottom, middle, top
// gStyle->SetTitleX(x)などでtitle boxのどこをxに合わせるかを指定する。
gStyle->SetTitleFillColor(Color_t color = 1);
gStyle->SetTitleTextColor(Color_t color = 1);
gStyle->SetTitleStyle(Style_t style = 1001);
gStyle->SetTitleFontSize(Float_t size = 0);
gStyle->SetTitleBorderSize(Width_t size = 2);// タイトルの枠線
//h->GetXaxis()から(Y軸も同じ)
h->GetXaxis()->SetTitleOffset(1.2);
h->GetYaxis()->SetTitleOffset(1.2);
h->GetYaxis()->CenterTitle();//Title を中心に設定
----
===== Label 関係 =====
*( = の後の数字等はデフォルトの値)
gStyle->SetLabelOffset(Float_t offset = 0.005, Option_t* axis = "X"); // 軸とラベルの距離
gStyle->SetLabelColor(Color_t color = 1, Option_t* axis = "X"); // ラベルの色
gStyle->SetLabelFont(Style_t font = 62, Option_t* axis = "X"); // ラベルのフォント
gStyle->SetLabelSize(Float_t size = 0.04, Option_t* axis = "X"); // ラベルのサイズ
//example
gStyle->SetLabelOffset(0.001,"XY");
*フォントについては font = 10*fontnumber + precision で表される。
*fontnumber は1〜14までの数字でフォントを選択する。
*precision は 2:サイズ変更、回転可能 ,1:不能
*軸は "XY" のように複数同時に選択することもできる。
hist->GetXaxis()->SetBinLabel(ibin,"A");
hist->GetXaxis()->SetBinLabel(ibin+1,"B");
などすると、binに名前をつけられる。
(SetBinContentsなどと同じで、ibin=1がfirst binを指す)
----
===== Grid 関係 =====
gStyle->SetPadGridX(1);// グリッドの縦線を表示する(0を入れると非表示)
gStyle->SetPadGridY(1);// グリッドの横線を表示する(0を入れると非表示)
gStyle->SetGridStyle(Style_t style = 3); // グリッド線のスタイルを指定
gStyle->SetGridColor(Color_t color = 0); // グリッド線の色を指定
gStyle->SetGridWidth(Width_t width = 1); // グリッド線の線幅を指定(ピクセル単位)
///// pad毎に指定したい場合
gPad->SetGrid(1,0);//// x(縦線)を表示(1)、y(横線)を非表示(0)
gPad->SetGridx(1);///// 一方だけいじるfunctionもある。
gPad->SetGridy(1);
----
===== 軸TitleがLabelと被ってしまうとき =====
特にY軸でよく起こると思われる。
Canvasのサイズをいじれば解決することもあるが、それでもダメなとき。
* 解決法1:Titleをずらす
h->GetYaxis()->SetTitleOffset(1.2)
数字を大きくする程、軸からTitleが遠ざかる。
しかし、大きくしすぎるとcanvasからはみ出して見切れてしまう。そんなときは
* 解決法1−2:canvasのマージンをいじる
gPad->SetLeftMargin(0.15); //左側のマージンを広げてTitleの文字が入るようにする
gPad->SetRightMargin(0.03);//右側のマージンを狭めてバランスをとる(任意)
//全体としてcanvasの中を右側にずらしたことになる。
とすればよい。
gPad%%->%%SetLeftMargin(… などをやった場合、図に修正前の線が残ることがあった。\\
この線は図をクリックしたりすると消えた。
そのときは、
c->Modified();
c->Update();
gPad->Modified();
gPad->Update();
と二重で Modified & Update をやることで解決した。
* 解決法2:Titleのサイズを小さくする
h->GetYaxis()->SetTitleSize(0.03);
* 解決法3:Labelを軸に寄せる
hist1->GetYaxis()->SetLabelOffset(0.)
hist1->GetYaxis()->SetLabelOffset(-0.03) //負にすれば軸に食い込む
* 解決法4:Labelのサイズを小さくする
h->GetYaxis()->SetLabelSize(0.03);
Labelの数字が大き過ぎて入らない、とかの場合は、
h->Scale(1e-3)
としてキロ単位にしたりするとよいかも。