0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CERN ROOT (C++) グラフ作成 (6) 複数のグラフをタイル状に並べて表示

Posted at

概要

複数のグラフをタイル状に並べて表示する。このとき重要になるのがPadの概念である。1Padに1グラフ表示するのでPadの増やし方やPadの選択の仕方を学ばなければならない。

Pad (TPad)

Canvasを作ると1個のPadが作られる。というかTCanvasTPadを継承しているクラスです。これまで投稿していた記事のグラフはその1個のPadに表示していたのです。
Padは入れ子にできるので、CanvasのPad内にタイル状に複数のPadを作成することできる。その複数Padにそれぞれグラフを表示させる。

  • Padの追加
    • TPad::Divide(Int_t nx = 1, Int_t ny = 1, Float_t xmargin = 0.01, Float_t ymargin = 0.01, Int_t color = 0)
      • nxが列数、nyが行数、でny行nx列の行列の配置になる
    • TopのPadはCanvasなのでTCanvas::Divide
  • Padの選択
    • TVirtualPad* TPad::cd(Int_t subpadnumber = 0)
      • subpadnumberは0が親Padで子Padは行列の左から右、上から下に1から順番に割り振られる
      • cd()で選ばれたPadにグラフを描画することができる。また、選択されたPadはgPadというROOTのグローバル変数にも設定される。gPadはいつでも現在選択されているPadを示している
  • Padへの描画
    • 描画したいPadを選択する
    • 表示したいグラフのDraw()を実行する
      • Drawを実行したときに選択されているPadに描画されるので、Draw以外の関数はPad選択前に実行してもOK

2行2列にグラフ表示

2行2列のPadを作って4個のグラフを描画させる例です。

tiled_graphs.C
void sincos() {
    gPad->SetGrid();
    constexpr int n = 100;
    float x[n], ys[n], yc[n];
    for(int i=0; i < n; i++){
        x[i] = 0.04 * i;
        ys[i] = TMath::Sin(x[i]*4);
        yc[i] = TMath::Cos(x[i]*4);
    }
    auto gr = new TGraph(n, x, ys);
    gr->SetMarkerStyle(20);
    gr->SetMarkerSize(0.5);
    gr->SetMarkerColor(2);
    gr->Draw("apc");
    auto gr2 = new TGraph(n, x, yc);
    gr2->SetMarkerColor(4);
    gr2->SetMarkerSize(0.5);
    gr2->SetMarkerStyle(40);
    gr2->Draw("pc");
}
void tiled_graphs() {
    auto canvas = new TCanvas("canvas", "Tiled Graphs");
    canvas->Divide(2, 2);
    auto tf1 = new TF1("sin1","sin(2.0 * x)",0,5);
    auto tf2 = new TF1("cos1","cos(2.0 * x)",0,5);
    auto tf3 = new TF1("log","log(x)",0,5);
    canvas->cd(1);
    tf1->Draw();
    canvas->cd(2);
    tf2->Draw();
    canvas->cd(3);
    sincos();
    canvas->cd(4);
    gPad->SetGrid();
    gPad->SetFillColor(kGray);
    tf3->SetLineColor(kCyan);
    tf3->Draw();
}
root [0] .x tiled_graphs.C  
root [1]

2024-11-27 13.11.53.png

3個のグラフ表示

トップのPadを2分割する。2分割した一方のPadをさらに2分割して3個の描画用Padを用意する。

tiled_graphs2.C
void sincos() {
    gPad->SetGrid();
    constexpr int n = 100;
    float x[n], ys[n], yc[n];
    for(int i=0; i < n; i++){
        x[i] = 0.04 * i;
        ys[i] = TMath::Sin(x[i]*4);
        yc[i] = TMath::Cos(x[i]*4);
    }
    auto gr = new TGraph(n, x, ys);
    gr->SetMarkerStyle(20);
    gr->SetMarkerSize(0.5);
    gr->SetMarkerColor(2);
    gr->Draw("apc");
    auto gr2 = new TGraph(n, x, yc);
    gr2->SetMarkerColor(4);
    gr2->SetMarkerSize(0.5);
    gr2->SetMarkerStyle(40);
    gr2->Draw("pc");
}
void tiled_graphs2() {
    auto canvas = new TCanvas("canvas", "Tiled Graphs");
    canvas->Divide(2, 1);
    auto tf1 = new TF1("sin1","sin(2.0 * x)", 0, 5);
    auto tf2 = new TF1("cos1","cos(2.0 * x)", 0, 5);
    auto pad1 = canvas->cd(1);
    pad1->Divide(1, 2, 0.01, 0);
    pad1->cd(1);
    gPad->SetGrid();
    tf1->Draw();
    pad1->cd(2);
    gPad->SetGrid();
    tf2->Draw();
    canvas->cd(2);
    sincos();
}

tf1tf2のx軸の範囲は同じなのでy方向のマージンを0にしました。

root [0] .x tiled_graphs2.C  
root [1]

2024-11-27 18.02.14.png

終わりに

Padをcdで選択して描画するという方法は初めてなので違和感が有りましたが慣れの問題かなと思います。私自身はやり方についてはあまりこだわりがないので、極端に面倒でなければ道具に合わせて受け入れます。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?