キャンバスを作成したい(TCanvas

1#include <TCanvas.h>
2
3// キャンバスを作成
4TCanvas *c = new TCanvas("c1", "Canvas Title", 800, 600);
5c->Draw();

TCanvasはROOTで図形やグラフを描画するための描画領域(キャンバス)を提供するクラスです。 ヒストグラムやグラフなどのオブジェクトはTCanvas上に描画されます。

1from ROOT import TCanvas
2
3# キャンバスを作成
4c = TCanvas("c1", "Canvas Title", 800, 600)
5c.Draw()

コンストラクターのシグネチャ

 1// デフォルトコンストラクター
 2TCanvas();
 3
 4// 基本的なコンストラクター
 5TCanvas(const char *name,
 6        const char *title = "",
 7        Int_t ww = 0,
 8        Int_t wh = 0);
 9
10// 詳細なコンストラクター(位置とサイズを指定)
11TCanvas(const char *name,
12        const char *title,
13        Int_t wtopx,
14        Int_t wtopy,
15        Int_t ww,
16        Int_t wh);

コンストラクターのパラメーター

基本的なコンストラクター

name - キャンバスの識別名

  • オブジェクト識別用

  • ROOTファイルでの保存

  • 同じディレクトリ内では一意

title - キャンバスのタイトル

  • ウィンドウのタイトルバーに表示

ww - キャンバスの幅(ピクセル)

  • デフォルト値:0(自動決定)

  • 0の場合は約700ピクセル

wh - キャンバスの高さ(ピクセル)

  • デフォルト値:0(自動決定)

  • 0の場合は約600ピクセル

詳細なコンストラクター(位置とサイズ指定)

wtopx - ウィンドウの左端のX座標

wtopy - ウィンドウの上端のY座標

ww - キャンバスの幅(ピクセル)

wh - キャンバスの高さ(ピクセル)

newで作成すべきか、スタック変数で作成すべきか

ROOTではキャンバスは**newで動的確保することが推奨されます。**

 1#include <TCanvas.h>
 2
 3// ❌ 推奨されない:スタック変数として作成
 4{
 5    TCanvas c("c", "Canvas");  // スコープを抜けるとメモリが解放される
 6    // ここで描画
 7}  // キャンバスのメモリが自動解放される
 8
 9// ✅ 推奨:newで動的確保
10TCanvas *c = new TCanvas("c", "Canvas", 800, 600);
11// ここで描画
12// 手動でdelete c;する必要はない(ROOTが管理)

newを推奨する理由

  1. キャンバスがROOTに登録される

    • newで作成したキャンバスはROOTのメモリ管理下に入る

    • gROOT->GetListOfCanvases()で参照できる

  2. 対話モードとマクロの動作が一貫する

    • 対話モードでnewを使う場合と同じ動作が保証される

    • スタック変数だとスコープを抜けた時に予期しない動作が発生する可能性

  3. メモリ管理はROOTが行う

    • ROOTはキャンバスのメモリを自動管理する

    • 明示的なdeleteは通常不要

  4. ウィンドウが消えない

    • スタック変数ではスコープ終了時にウィンドウが消えてしまう

    • newで作成すればプログラム終了まで表示される

グラフやヒストグラムを描画したい

 1#include <TCanvas.h>
 2#include <TH1D.h>
 3#include <TRandom.h>
 4
 5// キャンバスを作成
 6TCanvas *c = new TCanvas("c", "Histogram Canvas", 800, 600);
 7
 8// ヒストグラムを作成
 9TH1D *h = new TH1D("h", "Gaussian Distribution", 100, -3, 3);
10
11// データを入力
12for (int i = 0; i < 10000; i++) {
13    h->Fill(gRandom->Gaus(0, 1));
14}
15
16// キャンバスに描画
17h->Draw();

注釈

ROOTの対話モードでh->Draw()を実行した場合、キャンバスが存在しなければ自動的に生成されます。 ただし、マクロやスクリプトではキャンバスを明示的に作成することが推奨されます。

関連メソッド

参考資料