Table of Contents
キャンバスの操作をする。
マクロの例としてその2課題1の答えを使用します。
その2で関数を Draw したときに出てきたウィンドウのことです。 単に Draw するだけでも自動的にキャンバスが生成されますが,キャンバスを操作できたほうがいろいろと便利です。 キャンバス操作には自分でキャンバスを作ったほうが便利なので,やってみましょう。
公式の説明は TCanvas にあります。
キャンバスを作るには
TCanvas (const char *name, const char *title="", Int_t form=1)
// - const char *name : キャンバスの名前(任意)
// - const char *title : キャンバスのタイトル(任意)
// - Int_t form : あらかじめ定義されたキャンバスの形
か
TCanvas (const char *name, const char *title, Int_t ww, Int_t wh)
// - const char *name : キャンバスの名前(任意)
// - const char *title : キャンバスのタイトル(任意)
// - Int_t ww : キャンバスの横幅(ピクセル単位),0 以下だとキャンバスを表示しない
// - Int_t wh : キャンバスの高さ(ピクセル単位)
をよく使います。 あらかじめ定義されたキャンバスの形はここを参照してください。
例えば
TCanvas* c = new TCanvas( "name" , "title", 1500, 1200 );
をマクロの Draw1D や Draw2D 関数の前に書いて,実行してみましょう。 Draw2D で electron の場合を描くと,以下のようになりました。
プレゼンや論文に画像を貼り付けるには,描いたものを保存する必要があります。 キャンバスを保存するには Print 関数を使って
c->Print( "figure.png" ); // PNG 形式で保存
c->Print( "figure.pdf" ); // PDF 形式で保存
のようにやるか,キャンバスのメニューをクリックして
のようにやります。
一つのキャンバスに複数の図を並べて描きたくなることがあります(重ね書きとは異なる)。 試してみましょう。
キャンバスを分割して,各サブキャンバス (pad) に図を書いてみます。 マクロの int part2_answer1 関数を以下のように変えてみましょう。
TCanvas* c = new TCanvas( "name" , "title", 1500, 1200 );
c->Divide( 2 , 2 ); // キャンバスを 2 × 2 に分割する。
c->cd(1); // サブキャンバス #1 に移動する
Draw1D( temperature, "proton" );
c->cd(2); // サブキャンバス #2 に移動する
Draw1D( temperature, "electron" );
c->cd(3); // サブキャンバス #3 に移動する
Draw2D( "proton" );
c->cd(4); // サブキャンバス #4 に移動する
Draw2D( "electron" );
c->Print( "name.png" );
ここで
c->Divide( 2 , 2 );
でキャンバスを分割しています。 1 つ目の引数が横方向の分割数で,2 つ目が縦方向です。 正確には
void TPad::Divide ( Int_t nx = 1, Int_t ny = 1, Float_t xmargin = 0.01, Float_t ymargin = 0.01, Int_t color = 0 )
を使っています。
キャンバスを分割したあとで,絵を書きたい pad に移動する必要があります。 pad には 1 から始まる整数が自動的に割り振られており,TCanvas の cd 関数で移動することができます。
こうすることで
という絵が得られます。
PDF や ps ファイルに,複数ページを保存することもできます。 こうすることで,“file1.pdf”, “file2.pdf”, … と大量のファイルを作らずに済み,便利なときもあります。
複数ページ保存するには
とやります。 “[]” は “{}” と違って,“[“ や ”]” がないときのみファイルにキャンバスが保存されます。 以下のサンプルを参考にしてください。
TCanvas* c = new TCanvas( "name" , "title", 1500, 1200 );
c->Divide( 2 , 2 );
c->Print( "name.pdf[" ); // start
c->cd(1);
Draw1D( temperature, "proton" );
c->Print( "name.pdf" );
c->cd(2);
Draw1D( temperature, "electron" );
c->Print( "name.pdf" );
c->cd(3);
Draw2D( "proton" );
c->Print( "name.pdf" );
c->cd(4);
Draw2D( "electron" );
c->Print( "name.pdf" );
c->Print( "name.pdf]" ); // end
特になし。
自分でなにか描いて,保存してみましょう。