Sometimes the Divide() method is not appropriate to divide a Canvas. Because of the left and right margins, all the pads do not have the same width and height. CanvasPartition does that properly. This example also ensure that the axis labels and titles have the same sizes and that the tick marks length is uniform. In addition, XtoPad and YtoPad allow to place graphics objects like text in the right place in each sub-pads.
void canvas2()
{
if (C) delete C;
C =
new TCanvas(
"C",
"canvas",1024,640);
C->SetFillStyle(4000);
CanvasPartition(C,Nx,Ny,lMargin,rMargin,bMargin,tMargin);
h =
new TH1F(
"histo",
"",100,-5.0,5.0);
h->FillRandom(
"gaus",10000);
h->GetXaxis()->SetTitle(
"x axis");
h->GetYaxis()->SetTitle(
"y axis");
for (
Int_t i = 0; i < Nx; i++) {
for (
Int_t j = 0; j < Ny; j++) {
C->cd(0);
text.DrawTextNDC(XtoPad(0.9), YtoPad(0.8),
gPad->GetName());
}
}
}
{
if (!C) return;
Float_t vStep = (1.- bMargin - tMargin - (Ny-1) * vSpacing) / Ny;
Float_t hStep = (1.- lMargin - rMargin - (Nx-1) * hSpacing) / Nx;
Float_t vposd,vposu,vmard,vmaru,vfactor;
Float_t hposl,hposr,hmarl,hmarr,hfactor;
for (
Int_t i=0;i<Nx;i++) {
if (i==0) {
hposl = 0.0;
hposr = lMargin + hStep;
hfactor = hposr-hposl;
hmarl = lMargin / hfactor;
hmarr = 0.0;
} else if (i == Nx-1) {
hposl = hposr + hSpacing;
hposr = hposl + hStep + rMargin;
hfactor = hposr-hposl;
hmarl = 0.0;
hmarr = rMargin / (hposr-hposl);
} else {
hposl = hposr + hSpacing;
hposr = hposl + hStep;
hfactor = hposr-hposl;
hmarl = 0.0;
hmarr = 0.0;
}
for (
Int_t j=0;j<Ny;j++) {
if (j==0) {
vposd = 0.0;
vposu = bMargin + vStep;
vfactor = vposu-vposd;
vmard = bMargin / vfactor;
vmaru = 0.0;
} else if (j == Ny-1) {
vposd = vposu + vSpacing;
vposu = vposd + vStep + tMargin;
vfactor = vposu-vposd;
vmard = 0.0;
vmaru = tMargin / (vposu-vposd);
} else {
vposd = vposu + vSpacing;
vposu = vposd + vStep;
vfactor = vposu-vposd;
vmard = 0.0;
vmaru = 0.0;
}
auto pad = (
TPad*)
C->FindObject(
name.Data());
if (pad) delete pad;
pad =
new TPad(
name.Data(),
"",hposl,vposd,hposr,vposu);
}
}
}
{
double xl,yl,xu,yu;
gPad->GetPadPar(xl,yl,xu,yu);
double pw = xu-xl;
double lm =
gPad->GetLeftMargin();
double rm =
gPad->GetRightMargin();
double fw = pw-pw*lm-pw*rm;
}
{
double xl,yl,xu,yu;
gPad->GetPadPar(xl,yl,xu,yu);
double ph = yu-yl;
double tm =
gPad->GetTopMargin();
double bm =
gPad->GetBottomMargin();
double fh = ph-ph*bm-ph*tm;
}
Option_t Option_t TPoint TPoint const char text
R__EXTERN TStyle * gStyle
virtual void SetTitleOffset(Float_t offset=1)
Set distance between the axis and the axis title.
virtual void SetLabelSize(Float_t size=0.04)
Set size of axis labels.
virtual void SetTitleFont(Style_t font=62)
Set the title font.
virtual void SetLabelOffset(Float_t offset=0.005)
Set distance between the axis and the labels.
virtual void SetLabelFont(Style_t font=62)
Set labels' font.
virtual void SetTitleSize(Float_t size=0.04)
Set size of axis title.
virtual void SetTickLength(Float_t length=0.03)
Set tick mark length.
virtual void SetNdivisions(Int_t n=510, Bool_t optim=kTRUE)
Set the number of divisions for this axis.
virtual void SetBottomMargin(Float_t bottommargin)
Set Pad bottom margin in fraction of the pad height.
virtual void SetLeftMargin(Float_t leftmargin)
Set Pad left margin in fraction of the pad width.
void SetFrameBorderMode(Int_t mode=1)
void SetFrameFillStyle(Style_t styl=0)
virtual void SetRightMargin(Float_t rightmargin)
Set Pad right margin in fraction of the pad width.
virtual void SetTopMargin(Float_t topmargin)
Set Pad top margin in fraction of the pad height.
void CenterTitle(Bool_t center=kTRUE)
Center axis title.
1-D histogram with a float per channel (see TH1 documentation)
virtual void SetMaximum(Double_t maximum=-1111)
void Draw(Option_t *option="") override
Draw this histogram with options.
virtual void SetMinimum(Double_t minimum=-1111)
TObject * Clone(const char *newname="") const override
Make a complete copy of the underlying object.
The most important graphics class in the ROOT system.
void SetBorderSize(Short_t bordersize) override
void SetFillStyle(Style_t fstyle) override
Override TAttFill::FillStyle for TPad because we want to handle style=0 as style 4000.
Double_t GetAbsWNDC() const override
TVirtualPad * cd(Int_t subpadnumber=0) override
Set Current pad.
void Draw(Option_t *option="") override
Draw Pad in Current pad (re-parent pad if necessary).
void SetBorderMode(Short_t bordermode) override
Double_t GetAbsHNDC() const override
const char * Data() const
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
void SetOptStat(Int_t stat=1)
The type of information printed in the histogram statistics box can be selected via the parameter mod...
Base class for several text objects.
constexpr Double_t C()
Velocity of light in .