ここまでは、ヒストグラムの使い方をみてきたが、
データ点を直接キャンバスにプロットしたいという要求も
しばしば起きる。
このような場合、
あるいは
誤差棒つきのプロットの場合は
を使うことになる。
基本的な使い方は「猿にも」にあるので重複するが、
複数のグラフの重ね書きなど書いてないこともあるので
補足しておく。
グラフを作ることの練習なのでデータ点 については適当に関数と乱数を組み合わせて作ろう。
const Int_t np = 10; // # data points
Int_t i;
Double_t x[np], dx[np], y1[np], y2[np], dy[np];
{
for (i=0; i<np; i++) {
x [i] = 0.5 + i;
dx[i] = 0.3;
y1[i] = 4. + 0.1*x[i]*x[i] + gRandom->Gaus(0.,1.);
y2[i] = 8. + 0.1*x[i]*x[i] + gRandom->Gaus(0.,1.);
dy[i] = 1.;
}
}
後で2つのグラフの重ね書きをしたいので、
これを、ただ単にプロットするだけなら
TGraph *gr1 = new TGraph(np,x,y1);
gr1->Draw("ap");
あるいは誤差棒つきなら
TGraphErrors *gre1 = new TGraphErrors(np,x,y1,dx,dy);
gre1->Draw("ap");
で良いわけで、これは「猿にも」にも書いてある。
ここで、
上の例ではデフォールトの軸を使ったが、プロットの範囲を指定したり 重ね書きをしようと思うと先にグラフの枠を書いておくのが望ましい。
Double_t xlo = 0.; // x の下限
Double_t xhi = 10.; // x の上限
Double_t ylo = 0.; // y の下限
Double_t yhi = 20.; // y の上限
TCanvas *c1 = new TCanvas("c1","My Canvas",10,10,400,400);
TH1F *frame = gPad->DrawFrame(xlo,ylo,xhi,yhi);
こうしておけば
TGraphErrors *gre1 = new TGraphErrors(np,x,y1,dx,dy);
gre1->Draw("p");
TGraphErrors *gre2 = new TGraphErrors(np,x,y2,dx,dy);
gre2->Draw("p");
とした時に指定通りの軸の範囲で重ね書きできる。
既にヒストグラムの説明の際に 述べたようにプロットマーカーや曲線の種類や色、 大きさなど、お化粧は GUI でできるが、 もちろん
gre1->SetLineColor(2); // 線に赤を指定
gre1->SetMarkerColor(2); // マーカーに赤を指定
gre1->SetMarkerStyle(8); // マーカーに○を指定
gre1->SetMarkerSize(1.3); // マーカーのサイズ指定
gre1->Draw("p"); // 描画
gre2->SetLineColor(4); // 線に青を指定
gre2->SetMarkerColor(4); // マーカーに青を指定
gre2->SetMarkerStyle(22); // マーカーに△を指定
gre2->SetMarkerSize(1.3); // マーカーのサイズ指定
gre2->Draw("p"); // 描画
のように直接コマンドラインで指定することもできる。
できたプロットは図3.13。