ヒストグラムを描画したい(TH1::Draw

 1#include <TH1D.h>
 2#include <TCanvas.h>
 3#include <TRandom3.h>
 4
 5TH1D *h = new TH1D("h", "Histogram", 100, -5, 5);
 6
 7TRandom3 random;
 8for (int i = 0; i < 10000; i++) {
 9    h->Fill(random.Gaus(0, 1));
10}
11
12TCanvas *c = new TCanvas("c", "canvas", 600, 400);
13h->Draw();

TH1::Drawメソッドで、ヒストグラムをキャンバスに描画できます。 描画スタイル、色、線種などをカスタマイズして、データを効果的に可視化できます。

 1from ROOT import TH1D, TCanvas, TRandom3
 2
 3h = TH1D("h", "Histogram", 100, -5, 5)
 4
 5random = TRandom3()
 6for i in range(10000):
 7    h.Fill(random.Gaus(0, 1))
 8
 9c = TCanvas("c", "canvas", 600, 400)
10h.Draw()

メソッドシグネチャ

1virtual void Draw(Option_t *option = "")

引数と戻り値

引数:

  • option - 描画オプション(文字列)

    • "HIST" - ヒストグラムのアウトラインのみ

    • "E" - 統計誤差(エラーバー)を表示

    • "E1" - 誤差バーのスタイル1(角度あり)

    • "E2" - 誤差バーのスタイル2(矩形バー)

    • "BAR" - 棒グラフスタイル

    • "BAR1" - 棒グラフスタイル1

    • "BAR2" - 棒グラフスタイル2

    • "BAR3" - 棒グラフスタイル3(立体)

    • "BAR4" - 棒グラフスタイル4

    • "SAME" - 前の描画の上に重ねて描画

    • "C" - スムーズな曲線(スプライン)

    • "L" - 直線で接続

    • "*" - マーカーで表示

戻り値:

  • なし

基本的な描画

 1#include <TH1D.h>
 2#include <TCanvas.h>
 3#include <TRandom3.h>
 4
 5TH1D *h = new TH1D("h", "Basic Histogram", 100, -5, 5);
 6
 7TRandom3 random;
 8for (int i = 0; i < 5000; i++) {
 9    h->Fill(random.Gaus(0, 1));
10}
11
12// キャンバスを作成
13TCanvas *c = new TCanvas("c", "canvas", 600, 400);
14
15// ヒストグラムを描画
16h->Draw();

もっとも基本的な描画方法です。デフォルトスタイルでヒストグラムが描画されます。

描画スタイルの選択

 1#include <TH1D.h>
 2#include <TCanvas.h>
 3#include <TRandom3.h>
 4
 5TH1D *h = new TH1D("h", "data", 100, -5, 5);
 6
 7TRandom3 random;
 8for (int i = 0; i < 5000; i++) {
 9    h->Fill(random.Gaus(0, 1));
10}
11
12TCanvas *c = new TCanvas("c", "canvas", 800, 600);
13c->Divide(2, 2);
14
15// 標準スタイル
16c->cd(1);
17h->Draw();
18
19// アウトラインのみ
20c->cd(2);
21h->Draw("HIST");
22
23// 誤差バー付き
24c->cd(3);
25h->Draw("E");
26
27// スムーズな曲線
28c->cd(4);
29h->Draw("C");

異なる描画オプションを使用して、ヒストグラムの見た目を変更できます。

誤差バー付きで描画したい

 1#include <TH1D.h>
 2#include <TCanvas.h>
 3#include <TRandom3.h>
 4
 5TH1D *h = new TH1D("h", "Histogram with Errors", 100, -5, 5);
 6
 7TRandom3 random;
 8for (int i = 0; i < 5000; i++) {
 9    h->Fill(random.Gaus(0, 1));
10}
11
12TCanvas *c = new TCanvas("c", "canvas", 600, 400);
13
14// 誤差バーを表示
15h->Draw("E");

"E"オプションで統計誤差(ビンの内容の平方根)をエラーバーで表示できます。

複数のヒストグラムを重ねて描画したい

 1#include <TH1D.h>
 2#include <TCanvas.h>
 3#include <TRandom3.h>
 4
 5TH1D *h1 = new TH1D("h1", "Distribution 1", 100, -5, 5);
 6TH1D *h2 = new TH1D("h2", "Distribution 2", 100, -5, 5);
 7
 8TRandom3 random;
 9
10// ヒストグラム1に正規分布(平均0、標準偏差1)
11for (int i = 0; i < 5000; i++) {
12    h1->Fill(random.Gaus(0, 1));
13}
14
15// ヒストグラム2に正規分布(平均1、標準偏差1.5)
16for (int i = 0; i < 5000; i++) {
17    h2->Fill(random.Gaus(1, 1.5));
18}
19
20// 色を設定
21h1->SetLineColor(2);  // 赤
22h2->SetLineColor(4);  // 青
23
24TCanvas *c = new TCanvas("c", "Overlaid Histograms", 600, 400);
25
26// 最初のヒストグラムを描画
27h1->Draw();
28
29// 2番目のヒストグラムを重ねて描画
30h2->Draw("SAME");
31
32// 凡例を追加
33c->BuildLegend();

"SAME"オプションで複数のヒストグラムを重ねて描画できます。 異なる色や線種を使用して区別をつけることが重要です。

棒グラフとして描画したい

 1#include <TH1D.h>
 2#include <TCanvas.h>
 3#include <TRandom3.h>
 4
 5TH1D *h = new TH1D("h", "Bar Chart", 100, -5, 5);
 6
 7TRandom3 random;
 8for (int i = 0; i < 5000; i++) {
 9    h->Fill(random.Gaus(0, 1));
10}
11
12TCanvas *c = new TCanvas("c", "canvas", 600, 400);
13
14// 棒グラフとして描画
15h->Draw("BAR");

"BAR"オプションで棒グラフスタイルで描画できます。 カテゴリカルデータやビンの内容を強調したい場合に有効です。

複数パネル表示したい

 1#include <TH1D.h>
 2#include <TCanvas.h>
 3#include <TRandom3.h>
 4
 5TH1D *h1 = new TH1D("h1", "Dataset 1", 100, -5, 5);
 6TH1D *h2 = new TH1D("h2", "Dataset 2", 100, -5, 5);
 7TH1D *h3 = new TH1D("h3", "Dataset 3", 100, -5, 5);
 8TH1D *h4 = new TH1D("h4", "Dataset 4", 100, -5, 5);
 9
10TRandom3 random;
11
12for (int i = 0; i < 5000; i++) {
13    h1->Fill(random.Gaus(0, 1));
14    h2->Fill(random.Gaus(1, 1));
15    h3->Fill(random.Gaus(-1, 1));
16    h4->Fill(random.Gaus(0, 1.5));
17}
18
19// 2行2列のキャンバスを作成
20TCanvas *c = new TCanvas("c", "Multi-panel Display", 800, 600);
21c->Divide(2, 2);
22
23// パネル1
24c->cd(1);
25h1->Draw();
26
27// パネル2
28c->cd(2);
29h2->Draw();
30
31// パネル3
32c->cd(3);
33h3->Draw();
34
35// パネル4
36c->cd(4);
37h4->Draw();

Divide()メソッドで複数のパネルを持つキャンバスを作成できます。 異なるデータセットや分析結果を比較したい場合に有効です。

描画スタイルをカスタマイズしたい

 1#include <TH1D.h>
 2#include <TCanvas.h>
 3#include <TRandom3.h>
 4
 5TH1D *h = new TH1D("h", "Customized Histogram", 100, -5, 5);
 6
 7TRandom3 random;
 8for (int i = 0; i < 5000; i++) {
 9    h->Fill(random.Gaus(0, 1));
10}
11
12TCanvas *c = new TCanvas("c", "canvas", 600, 400);
13
14// 描画スタイルをカスタマイズ
15h->SetLineColor(2);      // 線の色(赤)
16h->SetLineWidth(2);      // 線幅
17h->SetLineStyle(1);      // 線種(実線)
18h->SetFillColor(38);     // 塗りつぶし色(青灰色)
19h->SetFillStyle(3003);   // 塗りつぶしパターン
20h->SetMarkerColor(1);    // マーカー色(黒)
21h->SetMarkerSize(0.8);   // マーカーサイズ
22h->SetMarkerStyle(20);   // マーカー種(○)
23
24h->Draw("E");

色、線幅、線種、塗りつぶしなど、さまざまなスタイル属性をカスタマイズできます。

タイトルと軸ラベルを設定したい

 1#include <TH1D.h>
 2#include <TCanvas.h>
 3#include <TRandom3.h>
 4
 5TH1D *h = new TH1D("h", "Distribution of Random Values", 100, -5, 5);
 6
 7TRandom3 random;
 8for (int i = 0; i < 5000; i++) {
 9    h->Fill(random.Gaus(0, 1));
10}
11
12TCanvas *c = new TCanvas("c", "canvas", 600, 400);
13
14// 軸ラベルを設定
15h->GetXaxis()->SetTitle("Value");
16h->GetXaxis()->SetTitleSize(0.05);
17h->GetXaxis()->SetLabelSize(0.04);
18
19h->GetYaxis()->SetTitle("Frequency");
20h->GetYaxis()->SetTitleSize(0.05);
21h->GetYaxis()->SetLabelSize(0.04);
22
23h->Draw();

軸のタイトル、ラベルサイズ、フォントなどを調整して、可読性を向上させることができます。

ログスケール表示したい

 1#include <TH1D.h>
 2#include <TCanvas.h>
 3#include <TRandom3.h>
 4
 5TH1D *h = new TH1D("h", "Histogram", 100, -5, 5);
 6
 7TRandom3 random;
 8for (int i = 0; i < 5000; i++) {
 9    h->Fill(random.Gaus(0, 1));
10}
11
12TCanvas *c = new TCanvas("c", "canvas", 600, 400);
13
14// Y軸をログスケールに設定
15c->SetLogy();
16
17// ログスケールで描画
18h->Draw();

SetLogy()でY軸をログスケールに設定できます。 広いダイナミックレンジを持つデータの可視化に有効です。

統計情報ボックスを表示したい

 1#include <TH1D.h>
 2#include <TCanvas.h>
 3#include <TRandom3.h>
 4#include <TStyle.h>
 5
 6TH1D *h = new TH1D("h", "Histogram", 100, -5, 5);
 7
 8TRandom3 random;
 9for (int i = 0; i < 5000; i++) {
10    h->Fill(random.Gaus(0, 1));
11}
12
13TCanvas *c = new TCanvas("c", "canvas", 600, 400);
14
15// 統計情報の表示を有効化
16gStyle->SetOptStat(1111);  // 平均、RMS、オーバーフロー、アンダーフロー
17
18h->Draw();

SetOptStat()で統計情報ボックスの表示内容をコントロールできます。 数値は異なる統計情報の表示を制御します。

範囲を制限して描画したい

 1#include <TH1D.h>
 2#include <TCanvas.h>
 3#include <TRandom3.h>
 4
 5TH1D *h = new TH1D("h", "Full Data", 100, -5, 5);
 6
 7TRandom3 random;
 8for (int i = 0; i < 5000; i++) {
 9    h->Fill(random.Gaus(0, 1));
10}
11
12TCanvas *c = new TCanvas("c", "canvas", 600, 400);
13
14// X軸の表示範囲を制限
15h->GetXaxis()->SetRangeUser(-2, 2);
16
17// Y軸の表示範囲を制限
18h->GetYaxis()->SetRangeUser(0, 500);
19
20h->Draw();

軸のSetRangeUser()メソッドで表示範囲を制限できます。 特定の領域に焦点を当てたい場合に有効です。

スムーズな曲線で描画したい

 1#include <TH1D.h>
 2#include <TCanvas.h>
 3#include <TRandom3.h>
 4
 5TH1D *h = new TH1D("h", "Smooth Histogram", 100, -5, 5);
 6
 7TRandom3 random;
 8for (int i = 0; i < 5000; i++) {
 9    h->Fill(random.Gaus(0, 1));
10}
11
12TCanvas *c = new TCanvas("c", "canvas", 600, 400);
13
14// スムーズな曲線で描画
15h->Draw("C");

"C"オプションでスプライン補間によるスムーズな曲線で描画できます。 ノイズの多いデータの傾向を視覚化する場合に有効です。

2次元ヒストグラムを描画したい

 1#include <TH2D.h>
 2#include <TCanvas.h>
 3#include <TRandom3.h>
 4
 5TH2D *h2 = new TH2D("h2", "2D Histogram", 50, -5, 5, 50, -5, 5);
 6
 7TRandom3 random;
 8for (int i = 0; i < 10000; i++) {
 9    h2->Fill(random.Gaus(0, 1), random.Gaus(0, 1));
10}
11
12TCanvas *c = new TCanvas("c", "2D Histogram", 600, 600);
13
14// 2次元ヒストグラムを描画
15h2->Draw("COLZ");

2次元ヒストグラムは"COLZ"オプションでカラーマップで描画できます。 2つの変数の相関を可視化する場合に有効です。

関連メソッド

参考リンク