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
ja:root:axis [GiriWiki]

ユーザ用ツール

サイト用ツール


ja:root:axis

Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /mnt/hep_web/hep_web/member/n-kota/dokuwiki/inc/parser/handler.php on line 1458

Warning: Declaration of syntax_plugin_note::handle($match, $state, $pos, &$handler) should be compatible with DokuWiki_Syntax_Plugin::handle($match, $state, $pos, Doku_Handler $handler) in /mnt/hep_web/hep_web/member/n-kota/dokuwiki/lib/plugins/note/syntax.php on line 79

Warning: Declaration of syntax_plugin_note::render($mode, &$renderer, $indata) should be compatible with DokuWiki_Syntax_Plugin::render($format, Doku_Renderer $renderer, $data) in /mnt/hep_web/hep_web/member/n-kota/dokuwiki/lib/plugins/note/syntax.php on line 101

軸の設定・装飾


はじめに

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)

としてキロ単位にしたりするとよいかも。

ja/root/axis.txt · 最終更新: 2018/10/20 18:38 by kota