Matplotlib で対数グラフを描く方法

ここでは Matplotlib を用いて対数グラフを描く方法を紹介します。

対数グラフとは

\(x\) の変化量に対して、\(y\) が指数関数的に増加する時 (言い換えると、 \(x\) の増加量に対して、\(y\) の変動が急激な時) などは、 グラフの目盛を対数として取ることで、\(x\) と \(y\) の関係性がわかりやすくなることがあります。

例えば、次のグラフを見てください。

これだと、\(x\)が、\(1, 2, 3\) と増えてきた時には、\(y\) はほとんど変わらないのに、\(x\) が \(4, 5\) となると、急速にドーンと値が増えていることがわかります。 このグラフだけでみると、「最初はあまり増えてなくて、あとからドンと増える」くらいの認識しか持つことができませんね。

そこで、\(y\) 軸の目盛を \(10\) を底 (base) とする対数で取ります。

「\(10\) を底とする対数を目盛にする」ということは、「(底である) \(10\) を何乗するとその値になるかという値を目盛にする」ということですね。

すると、次のような関係性が見えてきます。

このように表現されていれば、「\(x\) が小さい時は \(y\) の変化はちょっぴりだな」というだけの理解ではなく、「なるほど \(x\) が \(1\) から \(2\) に変わった時は \(y\) は \(10\) 倍になっている。\(2\) から \(3\) の変化も \(10\) 倍である」とハッキリわかります。

このように目盛を対数でとったグラフを、対数グラフと呼びます。

Matplotlib のグラフで対数グラフを描く方法

Matplotlib で対数グラフを書きたい場合は、目盛を対数でとる軸の xscale オプション、または yscaleオプションを log に設定します。もちろん、それぞれ \(x\) 軸、\(y\) 軸を対数にする場合に指定します。

早速コードを見てみましょう。上の対数グラフを表示するコードは次のようになります。

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [10, 10**2, 10**3, 10**4,  10**5]

fig, ax = plt.subplots()
ax.plot(x, y, marker='s', markersize=8)
ax.set_yscale('log')
ax.grid()
ax.set(xlabel='x', ylabel='y', title='scale example')
plt.show()

ポイントは上のコードの8行目です。ここではグラフを表す Axes オブジェクト ax で、 set_yscale('log') を呼ぶことで、\(y\) 軸を対数目盛にしています。

これは、次のように指定しても同じです。

ax.set(yscale='log')

Matplotlib の対数グラフで底を変更する方法

Matplotlib の対数グラフの底の既定値は \(10\) です。しかし、底を変えた方が見通しが良くなる場合があります。

底を変更する場合は、set_yscale() 関数で base オプションを設定することで底を指定できます。

次のコードでは 8 行目で、底を 2 とする対数グラフを書くように指定しています。

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 8, 16, 32]

fig, ax = plt.subplots()
ax.plot(x, y, marker='s', markersize=8)
ax.set_yscale('log', base=2)
ax.grid()
ax.set(xlabel='x', ylabel='y', title='scale example 2')
plt.show()

この結果、次のようになります。

以上、ここでは Matplotlib を使って対数グラフを描く方法について紹介しました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Python 入門