ROOTでは軸の目盛文字のことを”Label”といい、[MeV]とか[cm]とかの軸に添わせた文字を”Title”という。 また、目盛線のことを”Tick”という。
gStyle->SetOptLogx(1); // X軸の目盛をログ表示 gStyle->SetOptLogy(1); // Y軸の目盛をログ表示
gPad->SetLogy(1);
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");
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);
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");
hist->SetMinimum(0); hist->SetMaximum(100);
hist->GetZaxis()->SetRangeUser(0.,1000);
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はさらに半分になる。 //内側を正の向きとし、負号の数を入れると外向きになる。
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 を中心に設定
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");
hist->GetXaxis()->SetBinLabel(ibin,"A"); hist->GetXaxis()->SetBinLabel(ibin+1,"B");
などすると、binに名前をつけられる。 (SetBinContentsなどと同じで、ibin=1がfirst binを指す)
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);
特にY軸でよく起こると思われる。 Canvasのサイズをいじれば解決することもあるが、それでもダメなとき。
h->GetYaxis()->SetTitleOffset(1.2)
数字を大きくする程、軸からTitleが遠ざかる。 しかし、大きくしすぎるとcanvasからはみ出して見切れてしまう。そんなときは
gPad->SetLeftMargin(0.15); //左側のマージンを広げてTitleの文字が入るようにする gPad->SetRightMargin(0.03);//右側のマージンを狭めてバランスをとる(任意) //全体としてcanvasの中を右側にずらしたことになる。
とすればよい。
そのときは、
c->Modified(); c->Update(); gPad->Modified(); gPad->Update();
と二重で Modified & Update をやることで解決した。
h->GetYaxis()->SetTitleSize(0.03);
hist1->GetYaxis()->SetLabelOffset(0.) hist1->GetYaxis()->SetLabelOffset(-0.03) //負にすれば軸に食い込む
h->GetYaxis()->SetLabelSize(0.03);
Labelの数字が大き過ぎて入らない、とかの場合は、
h->Scale(1e-3)
としてキロ単位にしたりするとよいかも。