複数のキャンバスを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 してメモリを解放しておくと、大量ページでもメモリ不足になりません。
関連メソッド
TCanvas::SaveAs - 1枚の画像として保存する
TCanvas - キャンバスの基本
TH1::Draw - ヒストグラムを描画する