軸を対数スケール表示したい(TCanvas::SetLogySetLogx

 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

設定対象

特定のキャンバス

グローバルスタイル

影響範囲

そのキャンバスのみ

以降に作成されるすべてのオブジェクト

使用例

canvas->SetLogy()

gStyle->SetOptLogy(1)

適用タイミング

即座に適用

次のオブジェクト作成時に適用

使い分けの目安

  • TCanvas::SetLogy: 特定のキャンバスだけを対数スケールにしたい場合

  • gStyle::SetOptLogy: プログラム全体で統一的に対数スケールを使いたい場合

詳細は gStyle::SetOptLogy を参照してください。

対数スケール設定メソッド

メソッド

説明

SetLogy()

Y軸を対数スケール表示

SetLogx()

X軸を対数スケール表示

SetLogz()

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);

最小値を小さい正の数に設定します。

関連メソッド

参考資料