キャンバスを分割したい(TCanvas::Divide

1c->Divide(
2    1,  // nx: 列数
3    1,  // ny: 行数
4    0.01,  // xmargin: Xマージン(0.0-1.0)
5    0.01   // ymargin: Yマージン(0.0-1.0)
6    0,     // color: パッドの背景色(オプション)
7)

TCanvas::Divideでキャンパスを複数のパッド領域(TPad)に分割できます。

第一引数(nx)と第二引数(ny)で列数と行数を指定します。 第三引数(xmargin)と第四引数(ymargin)でパッド間のマージンを変更できます。 第五引数(color)でパッド領域の背景色を変更できます。

 1// +---+---+
 2// | 1 | 2 |
 3// +---+---+
 4// | 3 | 4 |
 5// +---+---+
 6// | 5 | 6 |
 7// +---+---+
 8
 9c->Divide(2, 3);
10
11// 5番目のパッドを選択
12c->cd(5);
13
14// 全体を選択
15c->cd(0);

上記のサンプルは、キャンバスを2列3行に分割しています。 TCanvas::cdで描画対象のパッドを選択できます。 このサンプルでは5番目のパッドが選択しています。 cd(0)でキャンバス全体を選択できます。

マージンを調整したい(TPad::SetLeftMargin

1gPad->SetLeftMargin(0.15);  // 左マージンを15%に設定(default: 0.10)
2gPad->SetBottomMargin(0.12); // 下マージンを12%に設定(default: 0.10)
3gPad->SetRightMargin(0.05); // 右マージンを5%に設定(default: 0.05)
4gPad->SetTopMargin(0.05);   // 上マージンを5%に設定(default: 0.05)

TPad::SetLeftMarginTPad::SetBottomMarginなどのメソッドで、 キャンバスの余白を調整できます。 マージンは領域の端から描画領域までのスペースで、デフォルトは0.01(1%)です。 軸ラベルが切れないように左と下のマージンを広めに設定するとよいです。

描画領域を切り替えたい(TCanvas::cd

 1#include <TCanvas.h>
 2#include <TGraph.h>
 3#include <TMath.h>
 4
 5TCanvas *c = new TCanvas("c", "Canvas", 1200, 800);
 6c->Divide(1, 2);
 7
 8c->cd(1);
 9TGraph *g1 = new TGraph();
10for (int i = 0; i < 10; i++) g1->SetPoint(i, i, i * i);
11g1->SetTitle("Upper Area");
12g1->Draw("APL");
13
14c->cd(2);
15TGraph *g2 = new TGraph();
16for (int i = 0; i < 10; i++) g2->SetPoint(i, i, TMath::Sqrt(i));
17g2->SetTitle("Lower Area");
18g2->Draw("APL");

TCanvas::cdで描画領域を切り替えて、 複数のヒストグラムやグラフを同じキャンバスに描画できます。

 1// 2列×2行に分割
 2c->Divide(2, 2);
 3// +---+---+
 4// | 1 | 2 |
 5// +---+---+
 6// | 3 | 4 |
 7// +---+---+
 8
 9// 2列x3行の分割
10c->Divide(2, 3);
11// +---+---+
12// | 1 | 2 |
13// +---+---+
14// | 3 | 4 |
15// +---+---+
16// | 5 | 6 |
17// +---+---+

領域番号は左上が1で、左から右、上から下の順に増加します。

 1#include <TCanvas.h>
 2#include <TH1D.h>
 3#include <TRandom.h>
 4
 5TCanvas *c = new TCanvas("c", "Divided Canvas", 1200, 800);
 6c->Divide(2, 2);
 7
 8for (int i = 1; i <= 4; i++) {
 9    c->cd(i);
10    TH1D *h = new TH1D(Form("h%d", i), Form("Histogram %d", i), 100, -3, 3);
11    for (int j = 0; j < 10000; j++) h->Fill(gRandom->Gaus(0, 1));
12    h->Draw();
13}

ループ処理と組み合わせて、複数のヒストグラムを効率的に描画できます。

1c->cd(0);

0を指定するとメインキャンバスが選択されます。

関連メソッド

参考資料