軸を対数スケール表示したい(TCanvas::SetLogy、SetLogx)
1#include <TCanvas.h>
2#include <TH1D.h>
3
4TCanvas *c = new TCanvas("c", "Log Scale Canvas", 800, 600);
5
6TH1D *h = new TH1D("h", "Distribution", 100, 0.1, 1000);
7h->FillRandom("expo", 1000);
8
9// Y軸を対数スケールに設定
10c->SetLogy();
11
12h->Draw();
TCanvas::SetLogyメソッドでY軸を対数スケール表示に変更できます。
大きく異なる値の範囲を視覚的に比較する場合に便利です。
1from ROOT import TCanvas, TH1D
2
3c = TCanvas("c", "Log Scale Canvas", 800, 600)
4
5h = TH1D("h", "Distribution", 100, 0.1, 1000)
6h.FillRandom("expo", 1000)
7
8# Y軸を対数スケールに設定
9c.SetLogy()
10
11h.Draw()
メソッドのシグネチャ
1void SetLogy(Int_t value = 1)
2void SetLogx(Int_t value = 1)
3void SetLogz(Int_t value = 1)
引数と戻り値
引数:
value - 対数スケールのON/OFF(1=ON、0=OFF)
戻り値:
なし
注釈
TCanvas::SetLogy vs gStyle::SetOptLogy
本ドキュメント(TCanvas::SetLogy)と gStyle::SetOptLogy は異なる設定メソッドです:
機能 |
TCanvas::SetLogy |
gStyle::SetOptLogy |
|---|---|---|
設定対象 |
特定のキャンバス |
グローバルスタイル |
影響範囲 |
そのキャンバスのみ |
以降に作成されるすべてのオブジェクト |
使用例 |
|
|
適用タイミング |
即座に適用 |
次のオブジェクト作成時に適用 |
使い分けの目安:
TCanvas::SetLogy: 特定のキャンバスだけを対数スケールにしたい場合
gStyle::SetOptLogy: プログラム全体で統一的に対数スケールを使いたい場合
詳細は gStyle::SetOptLogy を参照してください。
対数スケール設定メソッド
メソッド |
説明 |
|---|---|
|
Y軸を対数スケール表示 |
|
X軸を対数スケール表示 |
|
Z軸を対数スケール表示(3D図の場合) |
使用例
Y軸を対数スケール表示したい
1#include <TCanvas.h>
2#include <TH1D.h>
3
4TCanvas *c = new TCanvas("c", "Y-axis Log Scale", 800, 600);
5
6TH1D *h = new TH1D("h", "Exponential Distribution", 100, 0, 10);
7
8// 指数分布に従うデータを生成
9for (int i = 0; i < 10000; i++) {
10 h->Fill(gRandom->Exp(1));
11}
12
13// Y軸を対数スケールに設定
14c->SetLogy();
15
16h->Draw();
指数関数的に減少するデータを視覚的に比較しやすくなります。
X軸を対数スケール表示したい
1#include <TCanvas.h>
2#include <TGraph.h>
3
4TCanvas *c = new TCanvas("c", "X-axis Log Scale", 800, 600);
5
6TGraph *g = new TGraph();
7
8// X軸が指数的に増加するデータを生成
9for (int i = 0; i < 50; i++) {
10 double x = pow(10, i * 0.1); // 10^0 から 10^5 まで
11 double y = sin(log10(x));
12 g->SetPoint(i, x, y);
13}
14
15// X軸を対数スケールに設定
16c->SetLogx();
17
18g->Draw("AL");
X軸の値が非常に広い範囲をカバーする場合に有効です。
両軸を対数スケール表示したい
1#include <TCanvas.h>
2#include <TH2D.h>
3
4TCanvas *c = new TCanvas("c", "Both Axes Log Scale", 800, 600);
5
6TH2D *h2 = new TH2D("h2", "Power-law Distribution", 50, 0.1, 1000, 50, 0.1, 1000);
7
8// べき乗則に従うデータを生成
9for (int i = 0; i < 10000; i++) {
10 double x = pow(10, gRandom->Uniform(0, 3));
11 double y = pow(10, gRandom->Uniform(0, 3));
12 h2->Fill(x, y);
13}
14
15// 両軸を対数スケールに設定
16c->SetLogx();
17c->SetLogy();
18
19h2->Draw("colz");
べき乗則やスケーリング則を分析する場合に活用できます。
キャンバスを分割して一部だけ対数スケールにしたい
1#include <TCanvas.h>
2#include <TH1D.h>
3
4TCanvas *c = new TCanvas("c", "Mixed Log Scales", 1200, 500);
5
6// キャンバスを2つに分割
7c->Divide(2, 1);
8
9// パッド1:通常のスケール
10c->cd(1);
11TH1D *h1 = new TH1D("h1", "Linear Scale", 100, 0, 10);
12h1->FillRandom("gaus", 5000);
13h1->Draw();
14
15// パッド2:対数スケール
16c->cd(2);
17TH1D *h2 = new TH1D("h2", "Log Scale", 100, 0.1, 1000);
18h2->FillRandom("expo", 5000);
19gPad->SetLogy(); // 現在のパッドのY軸を対数スケール
20h2->Draw();
複数のパッドで異なるスケール設定ができます。
特定のパッドで対数スケールを設定したい
1#include <TCanvas.h>
2#include <TH1D.h>
3
4TCanvas *c = new TCanvas("c", "Specific Pad Log Scale", 1200, 600);
5
6// キャンバスを3つに分割
7c->Divide(3, 1);
8
9// パッド1:通常のスケール
10c->cd(1);
11TH1D *h1 = new TH1D("h1", "Pad 1", 50, -5, 5);
12h1->FillRandom("gaus", 1000);
13h1->Draw();
14
15// パッド2:Y軸対数スケール
16c->cd(2);
17TH1D *h2 = new TH1D("h2", "Pad 2", 50, 0, 10);
18h2->FillRandom("expo", 1000);
19gPad->SetLogy();
20h2->Draw();
21
22// パッド3:XY両軸対数スケール
23c->cd(3);
24TH1D *h3 = new TH1D("h3", "Pad 3", 50, 0.1, 100);
25h3->FillRandom("pareto", 1000);
26gPad->SetLogx();
27gPad->SetLogy();
28h3->Draw();
キャンバス内の複数のパッドで異なるスケール設定を適用できます。
対数スケールのON/OFFを切り替えたい
1#include <TCanvas.h>
2#include <TH1D.h>
3
4TCanvas *c = new TCanvas("c", "Toggle Log Scale", 800, 600);
5
6TH1D *h = new TH1D("h", "Data", 100, 0.1, 1000);
7h->FillRandom("expo", 5000);
8
9// 最初は通常スケール
10h->Draw();
11
12// ... 後で対数スケールに変更
13c->SetLogy(1);
14c->Update();
15
16// ... さらに後で通常スケールに戻す
17c->SetLogy(0);
18c->Update();
SetLogy(1)で対数スケール有効、SetLogy(0)で無効にできます。
gPad を使って現在のパッドに設定したい
1#include <TCanvas.h>
2#include <TH1D.h>
3
4TCanvas *c = new TCanvas("c", "Using gPad", 1200, 600);
5
6c->Divide(2, 1);
7
8// パッド1
9c->cd(1);
10TH1D *h1 = new TH1D("h1", "Histogram 1", 50, -5, 5);
11h1->FillRandom("gaus", 1000);
12h1->Draw();
13gPad->SetLogy(); // 現在のパッド(パッド1)に対数スケールを設定
14
15// パッド2
16c->cd(2);
17TH1D *h2 = new TH1D("h2", "Histogram 2", 50, 0, 10);
18h2->FillRandom("expo", 1000);
19h2->Draw();
20gPad->SetLogy(); // 現在のパッド(パッド2)に対数スケールを設定
gPadは「current pad」(現在のパッド)へのポインターです。
対数スケールが有効な用途
用途 |
説明 |
|---|---|
指数関数的分布 |
指数減少データを可視化 |
べき乗則データ |
スケーリング則の分析 |
広い値域の比較 |
10倍以上離れた値を比較 |
小さい値の詳細表示 |
小さい値の変化を顕著に表示 |
周波数スペクトラム |
音響や振動解析 |
注意事項
負の値を含む場合
1// ❌ エラー:負の値は対数スケールで表示できない
2TH1D *h = new TH1D("h", "Data with Negative", 50, -10, 10);
3h->FillRandom("gaus", 1000);
4c->SetLogy(); // 負の値があるとエラー
5h->Draw();
6
7// ✅ 解決策:負の値を除外またはシフト
8TH1D *h = new TH1D("h", "Data without Negative", 50, 0.1, 10);
9h->FillRandom("expo", 1000);
10c->SetLogy();
11h->Draw();
対数スケールでは負の値や0は表示できません。
0を含む場合
1// ❌ 注意:0を含むとスケールが正しく設定されない
2TH1D *h = new TH1D("h", "Data with Zero", 50, 0, 10);
3// ...
4
5// ✅ 小さい正の値を最小値に設定
6TH1D *h = new TH1D("h", "Data Starting from Small Value", 50, 0.1, 10);
最小値を小さい正の数に設定します。