複数のキャンバスをPDFに保存したい(TCanvas::Print

 1#include <TCanvas.h>
 2#include <TH1D.h>
 3
 4TCanvas *c = new TCanvas("c", "Multi-page PDF", 800, 600);
 5TString filename = "output.pdf";
 6
 7c->Print(filename + "[");  // PDFを開く
 8
 9for (Int_t i = 0; i < 3; i++) {
10    TH1D *h = new TH1D(Form("h%d", i), Form("Histogram %d", i), 100, -3, 3);
11    h->FillRandom("gaus", 1000);
12    h->Draw();
13    c->Print(filename);  // ページを追加
14    delete h;
15}
16
17c->Print(filename + "]");  // PDFを閉じる

TCanvas::Printで複数ページのPDFを1ファイルにまとめて保存できます。 [ で開始し、] で閉じるのが基本パターンです。

 1from ROOT import TCanvas, TH1D
 2
 3c = TCanvas("c", "Multi-page PDF", 800, 600)
 4filename = "output.pdf"
 5
 6c.Print(filename + "[")
 7
 8for i in range(3):
 9    h = TH1D(f"h{i}", f"Histogram {i}", 100, -3, 3)
10    h.FillRandom("gaus", 1000)
11    h.Draw()
12    c.Print(filename)
13
14c.Print(filename + "]")

異なるオブジェクトを1つのPDFに保存したい

 1#include <TCanvas.h>
 2#include <TH1D.h>
 3#include <TH2D.h>
 4#include <TGraph.h>
 5
 6TString filename = "report.pdf";
 7
 8TCanvas *c1 = new TCanvas("c1", "Canvas 1", 800, 600);
 9c1->Print(filename + "[");
10
11// 1ページ目:1次元ヒストグラム
12TH1D *h = new TH1D("h", "Histogram", 100, -3, 3);
13h->FillRandom("gaus", 5000);
14h->Draw();
15c1->Print(filename);
16
17// 2ページ目:グラフ
18TCanvas *c2 = new TCanvas("c2", "Canvas 2", 800, 600);
19TGraph *g = new TGraph();
20for (Int_t i = 0; i < 100; i++) g->SetPoint(i, i, sin(i * 0.1));
21g->Draw("AL");
22c2->Print(filename);
23
24// 3ページ目:2次元ヒストグラム
25TCanvas *c3 = new TCanvas("c3", "Canvas 3", 800, 600);
26TH2D *h2 = new TH2D("h2", "2D Histogram", 50, -3, 3, 50, -3, 3);
27for (Int_t i = 0; i < 10000; i++) h2->Fill(gRandom->Gaus(), gRandom->Gaus());
28h2->Draw("colz");
29c3->Print(filename + "]");  // 最後のページで閉じる

異なるキャンバスの内容を順番にページとして追加できます。 最後の Print] を付けてPDFを閉じます。

大量のページをループで生成したい

 1#include <TCanvas.h>
 2#include <TH1D.h>
 3
 4TCanvas *c = new TCanvas("c", "Canvas", 800, 600);
 5TString filename = "large.pdf";
 6
 7c->Print(filename + "[");
 8
 9for (Int_t page = 0; page < 100; page++) {
10    TH1D *h = new TH1D(Form("h%d", page), Form("Page %d", page), 100, -5, 5);
11    h->Fill(gRandom->Gaus(-5 + page * 0.1, 1));
12    h->Draw();
13    c->Print(filename);
14    delete h;  // メモリを解放してから次のページへ
15}
16
17c->Print(filename + "]");

ループ内で delete h してメモリを解放しておくと、大量ページでもメモリ不足になりません。

関連メソッド

参考資料