JavaScriptを有効にしてください

Matplotlibのオブジェクト指向な対数軸プロット

 ·   3 min read

はじめに

matplotlibライブラリで作成したグラフの軸を、オブジェクト指向スタイルで対数に変更する。
オブジェクト指向によるグラフの描画は、複数のグラフをプロットしたときに、どのグラフの描画を調整しているか分かりやすいという利点がある。

環境

ソフトウェア バージョン
Spyder 3.2.8
Python 3.6.5
matplotlib 2.2.2

本記事では、各ライブラリを以下のようにインポートしていることを前提とする。

1
2
import numpy as np
import matplotlib.pyplot as plt

対数軸のプロット

x, y軸をそれぞれ対数でプロットするには、Axesオブジェクトのset_xscale, set_yscaleメソッドを用いる。

1
2
Axes.set_xscale(scale, **kargs)
Axes.set_yscale(scale, **kargs)

scaleはプロットの方法であり、str型として以下のいずれかから指定する。
"linear", "log", "symlog"
"logit"も指定できるが、公式のリファレンスに詳細が記載されていないため本記事では扱わない)

また、**kargsは各scaleの詳細を指定する任意の引数である。

通常の線形プロット(linear)

scale="linear"とすると、通常の線形プロットになる。

一般的な対数プロット(log)

scale="log"とすると、一般的な対数プロットになる。オプションは以下の通り。

  • basex/basey: x, y軸の対数の「底」。デフォルトの底は10。
  • nonposx/nonposy: 0以下の値を、"mask"とすると表示せず、"clip"とすると微小な正の数に変換する。
  • subsx/subsy: 小目盛り (subticks) を振る値を整数のリストで指定する。

例: x軸の対数の底を2とし、y軸の小目盛りを2と5だけにする。また、0要素を除く。

1
2
3
4
5
6
7
8
x = np.arange(10) # 0, 1, 2, ..., 9の配列
y = np.arange(10)

fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_xscale("log", basex=2, nonposx="mask")
ax.set_yscale("log", subsy=[2, 5])
plt.show()

実行結果
xscale_log

正負両方の対数プロット(symlog)

scale="symlog"とすると、正負両方の数を対数でプロットできる。すなわち、以下の数式のように、負の数を一度正にして対数をとり再びマイナスを付ける。

$$ \begin{cases} \log(x) & (x > 0) \\ -\log(-x) & (x < 0) \end{cases} $$

オプションは以下の通り。

  • basex/basey: x, y軸の対数の「底」。デフォルトの底は10。
  • linthreshx/linthreshy: 実数xを与えると、範囲(-x, x)で線形にプロットする。ゼロ周辺における対数の発散を防ぐ。
  • subsx/subsy: 小目盛り (subticks) を振る値を整数のリストで指定する。

例: y軸を正負ともに対数でプロットする。範囲(-1, 1)を線形にする。

1
2
3
4
5
6
7
8
x = np.arange(-10, 10) # -10, -9, ..., 10の配列
y = np.arange(-10, 10)

fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_yscale("symlog", linthreshy=1)
ax.grid()
plt.show()

結果

xscale_symlog

参考

matplotlib.pyplot.xscale — Matplotlib 3.3.3 documentation
matplotlib.axes.Axes.set_xscale — Matplotlib 3.3.3 documentation

シェアする

Helve
WRITTEN BY
Helve
関西在住、電機メーカ勤務のエンジニア。Twitterで新着記事を配信中です