対数スケールにしたい(TCanvas::SetLogy

 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
 9c->SetLogy();
10h->Draw();

TCanvas::SetLogyメソッドでY軸を対数スケール表示に変更できます。 それぞれの軸に対して、SetLogx(X軸)やSetLogz(Z軸)も同様に使用できます。 大きく異なる値の範囲を視覚的に比較する場合に便利です。

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
8c.SetLogy()
9h.Draw()

参考

TCanvas::SetLogygStyle->SetOptLogyは異なる設定メソッドです。

TCanvas::SetLogyは特定のキャンバスに対して対数スケールを設定するのに対し、 gStyle->SetOptLogy(1)はグローバルスタイルを変更して、以降に作成されるすべてのオブジェクトに対数スケールを適用します。

対数スケールをトグルしたい

1c->SetLogy(1);  // 対数スケール有効
2c->Update();
3
4c->SetLogy(0);  // 通常スケールに戻す
5c->Update();

SetLogy(1)で対数スケール有効、SetLogy(0)で無効にできます。 Updateでキャンバス表示の更新が必要です。

両対数したい

 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
 8for (int i = 0; i < 10000; i++) {
 9    double x = pow(10, gRandom->Uniform(0, 3));
10    double y = pow(10, gRandom->Uniform(0, 3));
11    h2->Fill(x, y);
12}
13
14c->SetLogx();
15c->SetLogy();
16h2->Draw("colz");

べき乗則やスケーリング則を分析する場合に活用できます。

キャンバスを分割して一部だけ対数スケールにしたい

 1#include <TCanvas.h>
 2#include <TH1D.h>
 3
 4TCanvas *c = new TCanvas("c", "Mixed Log Scales", 1200, 500);
 5
 6c->Divide(2, 1);
 7
 8// パッド1:通常のスケール
 9c->cd(1);
10TH1D *h1 = new TH1D("h1", "Linear Scale", 100, 0, 10);
11h1->FillRandom("gaus", 5000);
12h1->Draw();
13
14// パッド2:対数スケール
15c->cd(2);
16TH1D *h2 = new TH1D("h2", "Log Scale", 100, 0.1, 1000);
17h2->FillRandom("expo", 5000);
18gPad->SetLogy();
19h2->Draw();

gPadは「current pad」(現在のパッド)へのポインターです。 複数のパッドで異なるスケール設定ができます。

関連メソッド

参考資料