Helve’s Python memo

Pythonを使った機械学習やデータ分析の備忘録

<matplotlib> オブジェクト指向な対数軸プロット

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

matplotlibの基本的なオブジェクトと、グラフ作成については以下ページを参照。
<matplotlib> オブジェクト指向なグラフ作成 - Helve’s Python memo

目次

環境

Spyder 3.2.8
Python 3.6.5
matplotlib 2.2.2

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

import numpy as np
import matplotlib.pyplot as plt

対数軸のプロット

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

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要素を除く。

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()

実行結果
f:id:Helve:20180805181450p:plain

正負両方の対数プロット“symlog”

scale=“symlog”とすると、正負両方の数を対数でプロットできる。すなわち、以下の数式のように、負の数を一度正にして対数をとり再びマイナスを付ける。
{
\begin{eqnarray}
\left\{ \begin{array}{ll}
\log(x)   & (x>0) \\ -\log(-x) & (x<0)
\end{array}\right.
\end{eqnarray}
}

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

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

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

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()

結果
f:id:Helve:20180805181426p:plain

参考

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

以下の本ではmatplotlibを使ったグラフ作成について詳しい。また、オブジェクト指向スタイルでのグラフの作成・調整についても解説されている。