こんにちは、その日暮らしです。
Pythonでmatplotlibパッケージを使って対数グラフを描いたのですが、補助目盛が表示されませんでした。
ググったりいろいろとコードを変えたりして試した結果、ようやく補助目盛を表示することができるようになったのですが、matplotlibパッケージの対数グラフは癖が強く意図したようにグラフを描くにはコツが必要でした。
当記事では、そんなコツをシェアしていきたいと思います。
なお、プログラマ向けQ&Aサイトとして有名なStack Overflowの以下のページを参考にしました。
\(y\)軸が対数の片対数グラフ
まず、普通に\(y\)軸が対数の片対数グラフを描いてみます。
コードは、こんな感じ。
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
# Figureを作成する。
fig = plt.figure()
# Axesを作成する。
ax = fig.add_subplot(111)
# データを描画する。
x = np.arange(.0, 100.0, .01)
ax.plot(x, np.exp(-x / 5.0))
# y軸を対数目盛に設定する。
ax.set_yscale('log')
# グリッドを表示する。
ax.grid(True, "major", linestyle="-", linewidth=.7)
ax.grid(True, "minor", "y", linestyle="-", linewidth=.3)
# グラフを表示する。
plt.show()
出力されるグラフはこんな感じ。
\(y\)軸の補助目盛に対応するグリッド線が表示されるように設定していますが、補助目盛が存在しないのでグリッド線は描かれません。
補助目盛を表示してみる
\(y\)軸に補助目盛が表示されるようコードを修正してみます。以下で、\(y\)軸の補助目盛のロケータにLogLocatorロケータを設定してみます。
# y軸を対数目盛に設定する。
ax.set_yscale('log')
ax.yaxis.set_minor_locator(mpl.ticker.LogLocator())
グラフに変化はありません。ロケータにLogLocatorロケータを設定するだけでは駄目なようです。
補助目盛を表示するコツ
冒頭で挙げた参考ページによると、補助目盛を表示するには、例えば上の場合、主目盛は\(10^2\)倍ごとではなく、\(10^1\)倍ごとに表示する必要があるそうです。確かに、主目盛が\(10^2\)ごとではどんな風に補助目盛を描くんだよって思っちゃいますよね。これが、1つ目のコツです。
したがって、主目盛を\(10^1\)倍ごとに表示するようコードを修正します。まず、考えやすくするために\(y\)軸の範囲を設定します。
# y軸を対数目盛に設定する。
ax.set_yscale('log')
ax.set_ylim(1e-10, 1e1)
\(y\)軸の範囲が設定できました。続いて、\(y\)軸の主目盛を\(10^1\)倍ごとに表示するようコードを修正します。以下のように\(y\)軸の主目盛のロケータにLogLocatorロケータを設定します。このとき、キーワード引数numticksには表示させたい主目盛の数と同じかそれより少し大きい値を設定するのが2つ目のコツです。ここでは、「13」を設定しました。
# y軸を対数目盛に設定する。
ax.set_yscale('log')
ax.set_ylim(1e-10, 1e1)
ax.yaxis.set_major_locator(mpl.ticker.LogLocator(numticks=13))
\(y\)軸の主目盛が正しく設定できました。
続いて、\(y\)軸の補助目盛を設定するために補助目盛のロケータにLogLocatorロケータを設定します。このとき、キーワード引数numticksを\(y\)軸の主目盛のLogLocatorロケータへ与えたときと同じ値で補助目盛のLogLocatorロケータへ与えることと、補助目盛のLogLocatorロケータへ以下のようにキーワード引数subsを与えることが3つ目と4つ目ののコツです。
# y軸を対数目盛に設定する。
ax.set_yscale('log')
ax.set_ylim(1e-10, 1e1)
ax.yaxis.set_major_locator(mpl.ticker.LogLocator(numticks=13))
ax.yaxis.set_minor_locator(mpl.ticker.LogLocator(numticks=13, subs=(.1,.2,.3,.4,.5,.6,.7,.8,.9)))
めでたく\(y\)軸の補助目盛が表示されました。キーワード引数subsは、公式のドキュメントをDeepLで翻訳すると「目盛を配置する基底の整数乗の倍数」だそうです。わかりませんよね。試しに、上のコードの「subs=(.1,.2,.3,.4,.5,.6,.7,.8,.9)」の部分を「subs=(.2,.4,.6,.8)」に変更すると以下のように補助目盛が変更されます。まあ、そういった使い方をする引数だということで(笑)。
以上、「Pythonでmatplotlibパッケージを使って描いた対数グラフの補助目盛が表示されない件」でした。
コメント