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 を使って対数グラフを描く方法について紹介しました。