その3

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 の場合を描くと,以下のようになりました。

1500×1200 のキャンバス。Web ページにはちょっと大きすぎる。
1500×1200 のキャンバス。Web ページにはちょっと大きすぎる。

描いたものを画像として保存する

プレゼンや論文に画像を貼り付けるには,描いたものを保存する必要があります。 キャンバスを保存するには Print 関数を使って

c->Print( "figure.png" ); // PNG 形式で保存
c->Print( "figure.pdf" ); // PDF 形式で保存

のようにやるか,キャンバスのメニューをクリックして

右上に表示されるメニューの File>Save や File>Save As... をクリックしても保存できる。
右上に表示されるメニューの “File>Save” や “File>Save As…” をクリックしても保存できる。

のようにやります。

分割してみる

一つのキャンバスに複数の図を並べて描きたくなることがあります(重ね書きとは異なる)。 試してみましょう。

キャンバスを分割して,各サブキャンバス (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 関数で移動することができます。

こうすることで

キャンバスを 4 つに分割し,Draw1D, Draw2D を proton, electron それぞれに対して実行した。Draw2D の proton がちょっと見にくい。
キャンバスを 4 つに分割し,Draw1D, Draw2D を proton, electron それぞれに対して実行した。Draw2D の proton がちょっと見にくい。

という絵が得られます。

PDF ファイルに複数ページを保存する

PDF や ps ファイルに,複数ページを保存することもできます。 こうすることで,“file1.pdf”, “file2.pdf”, … と大量のファイルを作らずに済み,便利なときもあります。

複数ページ保存するには

  1. Print に与えるファイル名の最後に “[” か “(” を入れて始める
  2. Print にファイル名のみを与える
  3. 2 を繰り返す
  4. Print に与えるファイル名の最後に “]” か “)” を入れて終了する

とやります。 “[]” は “{}” と違って,“[“ や ”]” がないときのみファイルにキャンバスが保存されます。 以下のサンプルを参考にしてください。

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

PDF ファイル

課題

特になし。

自分でなにか描いて,保存してみましょう。