なまもの備忘録

気になったことをつらつらと書いていきます

matplotlibでのオブジェクト指向的な描画

matplotlibには主にpyplotの関数を用いてオブジェクトを明示的に操作せず簡単に描画する方法と、オブジェクトを明示的に操作する方法がある。以下後者の方法について。

matplotlibではグラフは一度FigureCanvasに描画され、それがバックエンドのmatplotlib.backend_bases.FigureCanvasBaseを継承した出力フォーマット依存のクラスによって出力されるという仕組みをとっている(はず、要出典)。
FigureCanvasに描画されるFigureは部品ごとに管理されており、すべての部品はmatplotlib.artist.Artistという抽象基底クラスを継承している。Figure自身もArtistの派生クラス。部品というのは例えば、軸(Axisというクラスで管理される)や目盛り、グリッド線(Tickというクラスに管理される)などのことを指す。また、これらはこちらもまたArtistの派生クラスであるmatplotlin.axes.Axesによってまとめられ、管理されている。

オブジェクト指向でのプロットは以下のようになる(例として2つの行列から2つのカラーマップを描く場合を取り上げる)。

import matplotlib.pyplot as pet
import matplotlib.cm as cm

#データを用意する
arr1 = [[1,0,0],[0,1,0],[0,0,1]]
arr2 = [[0,0,1],[0,1,0],[1,0,0]]
data = [arr1,arr2]

#Figure全体を管理するオブジェクトfigを生成する
fig = plt.figure()

#Figureの構成要素である2つの図それぞれを管理するAxesオブジェクトax1とax2を生成する
ax1 = fig.add_subplot(1,2,1)#1行2列のグラフの1つめを描く
ax2 = fig.add_subplot(1,2,2)#1行2列のグラフの2つめを描く

ax1.imshow(data[0], cmap = cm.Greys, interpolation = 'nearest')#オブジェクトにカラーマップの情報をもたせるAxesのimshowメソッドを呼び出す
ax1.set_axis_off()#軸を表示しない設定にするset_axis_off()メソッドを呼び出す
ax2.imshow(data[1], cmap = cm.Greys_r, interpolation = 'nearest')
ax2.set_axis_off()

#描画する
plt.show()

f:id:purple-apple:20170206221130p:plain

上記コードのうちcm.binaryは色を指定している。指定できる色は(http://matplotlib.org/examples/color/colormaps_reference.html)にある。”Greys_r”の”_r”は、グラデーションを反転させている。ここにない色も指定できたりする(例えば”binary”)。また、interpolationの’nearest’は描画をタイル状にしており、無指定だとグラフはグラデーションになる。
図の詳細な設定をいじる場合は図を管理しているAxesオブジェクトのメソッドを使う、というような事になる。Axes.get_xaxisなどのメソッドを使ってX軸の情報のみを管理するXAxisオブジェクトを生成し、更に細かく設定を行うことも(多分)できる。このようなAxesクラスのメソッドは(http://matplotlib.org/api/axes_api.html#axis-limits)に書いてある。