rootマクロ又はシェルスクリプト。
#include <TPad.h> #include <TStyle.h> #include <TList.h> #include <TH1.h> #include <TF1.h> #include <TGraph.h> #include <TMultiGraph.h> void Divide2(TPad* c,Double_t ratio = 0.65){ //ratio : to set the ratio of upper pad xsize to canvas //divide TPad horizontal if (!c->IsEditable()) return; TVirtualPad* padsav = (TVirtualPad*)gPad; c->cd(); const Char_t* name = c->GetName(); Double_t defLeftMargin = gStyle->GetPadLeftMargin(); Double_t defBottomMargin = gStyle->GetPadBottomMargin(); Double_t dx = 1.0; Double_t x1low = 0; Double_t x1up = x1low + dx; Double_t y1up = 1.0; Double_t y1low = y1up - ratio; TPad* p1 = new TPad(Form("%s_%d",name,1),Form("%s_%d",name,1),x1low,y1low,x1up,y1up); p1->SetLeftMargin(defLeftMargin*ratio); p1->SetBottomMargin(0.0); p1->SetNumber(1); p1->Draw(); Double_t x2low = 0; Double_t x2up = x1low + dx; Double_t y2up = 1.0 - ratio; Double_t y2low = y2up + ratio - 1.0; TPad *p2 = new TPad(Form("%s_%d",name,2),Form("%s_%d",name,2),x2low,y2low,x2up,y2up); p2->SetTopMargin(0.0); p2->SetLeftMargin(defLeftMargin*ratio); p2->SetBottomMargin(defBottomMargin/(1.0-ratio)); p2->SetNumber(2); p2->Draw(); c->Modified(); #ifndef __CINT__ if (padsav) padsav->cd(); #endif } void SetDivideHistStyle(TPad *c,Double_t ratio = 0.65,Double_t lfactor = 1.00,Double_t tfactor = 1.00,Double_t tfactor2 = 1.00,Double_t tfactor3 = 1.00){ //lfactor : to resize label font on all histograms by lfactor //tfactor : to resize title font on all histograms by tfactor //tfactor2 : to resize Ytitle font on bottom histograms by tfactor2 //tfactor3 : to resize Xtitle font by tfactor3 Double_t defTitleSizex = gStyle->GetTitleSize("x"); Double_t defLabelSizex = gStyle->GetLabelSize("x"); Double_t defTitleSizey = gStyle->GetTitleSize("y"); Double_t defLabelSizey = gStyle->GetLabelSize("y"); TIter next(c->GetListOfPrimitives()); TObject* obj; int count = 0; TPad* p[2]; while ( (obj = next()) && count < 2) { if(obj->InheritsFrom("TPad")){ p[count] = (TPad*)obj; count++; } } if(!(p[0] && p[1])){ cout << "Error: This pad doesn't have two pads" << endl; return; } TIter next1(p[0]->GetListOfPrimitives()); TObject* obj1; while ((obj1 = next1())) { TH1* h = NULL; if(obj1->InheritsFrom("TH1")){ h = (TH1*)obj1; }else if(obj1->InheritsFrom("TGraph")){ h = ((TGraph*)obj1)->GetHistogram(); }else if(obj1->InheritsFrom("TF1")){ h = ((TF1*)obj1)->GetHistogram(); }else if(obj1->InheritsFrom("TMultiGraph")){ h = ((TMultiGraph*)obj1)->GetHistogram(); } if(h){ Double_t lsizex = defLabelSizex/ratio*lfactor; Double_t tsizex = defTitleSizex/ratio*tfactor; Double_t lsizey = defLabelSizey/ratio*lfactor; Double_t tsizey = defTitleSizey/ratio*tfactor; Double_t offsety = (0.9*lsizey + 0.3*tsizey) / tsizey; Double_t lmargin = 1.5*lsizey + 0.9*tsizey; h->SetLabelSize(lsizex,"x"); h->SetTitleSize(tsizex,"x"); h->SetLabelSize(lsizey,"y"); h->SetTitleSize(tsizey,"y"); h->SetTitleOffset(offsety*ratio,"y"); if(ratio <= 0.3){ h->GetYaxis()->SetNdivisions(504); }else if(ratio <= 0.4){ h->GetYaxis()->SetNdivisions(505); }else if(0.65 >= ratio){ h->GetYaxis()->SetNdivisions(509); } p[0]->SetLeftMargin(lmargin*ratio); p[0]->Modified(); } } TIter next2(p[1]->GetListOfPrimitives()); TObject* obj2; while ((obj2 = next2())) { TH1* h = NULL; if(obj2->InheritsFrom("TH1")){ h = (TH1*)obj2; }else if(obj2->InheritsFrom("TGraph")){ h = ((TGraph*)obj2)->GetHistogram(); }else if(obj2->InheritsFrom("TF1")){ h = ((TF1*)obj2)->GetHistogram(); }else if(obj2->InheritsFrom("TMultiGraph")){ h = ((TMultiGraph*)obj2)->GetHistogram(); } if(h){ Double_t lsizex = defLabelSizex/(1.0-ratio)*lfactor; Double_t tsizex = defTitleSizex/(1.0-ratio)*tfactor*tfactor3; Double_t lsizey = defLabelSizey/(1.0-ratio)*lfactor; Double_t tsizey = defTitleSizey/(1.0-ratio)*tfactor*tfactor2; Double_t offsetx = (0.8*lsizex + 0.4*tsizex) / tsizex; Double_t offsety = (0.9*lsizey + 0.3*tsizey/tfactor2 ) / tsizey; Double_t bmargin = 1.3*lsizex + 1.3*tsizex; Double_t lmargin = 1.5*lsizey + 0.9*tsizey/tfactor2; h->SetLabelSize(lsizex,"x"); h->SetTitleSize(tsizex,"x"); h->SetLabelSize(lsizey,"y"); h->SetTitleSize(tsizey,"y"); h->SetTitleOffset(offsetx,"x"); h->SetTitleOffset(offsety*(1-ratio),"y"); if(ratio >= 0.65){ h->GetYaxis()->SetNdivisions(504); }else if(ratio >= 0.55){ h->GetYaxis()->SetNdivisions(505); }else if(0.40 <= ratio){ h->GetYaxis()->SetNdivisions(509); } p[1]->SetLeftMargin(lmargin*(1.0-ratio)); p[1]->SetBottomMargin(bmargin); p[1]->Modified(); } } c->Modified(); }
#include "Divide2.cxx" void test(){ TCanvas *c1 = new TCanvas("c1","c1"); TH1F *h1 = new TH1F("h1",";Xtitle;Ytitle",100,-10,10); h1->FillRandom("gaus"); double x[] = {1,30,80}; double y[] = {6,30,86}; TGraph *g = new TGraph(3,x,y); Divide2(c1,0.7);//0.7は分割する比率 c1->cd(1); h1->Draw(); c1->cd(2); g->Draw("ap"); SetDivideHistStyle(c1,0.7);//文字の大きさなどを揃える }