Pythonのデータ可視化パッケージであるmatplotlibをオブジェクト指向プログラミングとして使うことで、効率良く綺麗なグラフを描画する方法を解説します。
こんにちは。wat(@watlablog)です。
データをグラフで表示する際に見た目を色々調整したくなる時があります。細かい見た目の調整はmatplotlibをオブジェクト指向プログラミングで使うことで解決します!
matplotlibの使い方
対話形式スタイル
matplotlibの使用方法説明の中で最も代表的なスタイルが対話形式スタイルです。
この対話形式スタイルとは、アクティブなグラフに対して処理を行うもので、以下のコードに示すように、1つのグラフに対して1つずつ設定をしていく形式を指します。
1 2 3 4 5 6 7 8 9 10 |
import numpy as np from matplotlib import pyplot as plt plt.xticks(np.arange(-4, 4, 1)) #x軸の目盛設定 plt.yticks(np.arange(-2, 2, 0.1)) #y軸の目盛設定 plt.xlim(-3,3) #x軸の範囲 plt.ylim(0, 0.5) #y軸の範囲 plt.plot(x, y) #データをプロット plt.show() #グラフを表示 plt.close() #グラフを消去 |
簡単で単一なグラフであればこれでも十分なのですが、グラフを複数並べて表示させたり、そのグラフに対してそれぞれ別々の設定をしたりする場合は、対話形式スタイルだと非常に書き辛いと思います。
オブジェクト指向スタイル
オブジェクト指向スタイルのプログラミングとは、筆者もあまり完全に理解していませんが、手順を記述するのではなくオブジェクト(モノ)を定義して操作していくプログラミング方法という認識です。
しかしこれは筆者の経験上、習うより慣れろという精神論が最も効果を発揮する分野だと思いますので、まずはオブジェクト指向で書いたコードを以下に紹介します。何か適当なデータを作ってお手元の環境で動作させてみて下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import numpy as np from matplotlib import pyplot as plt fig = plt.figure() #プロットの入れ物オブジェクト作成 ax1 = fig.add_subplot(111) #プロットのオブジェクト作成 ax1.set_xticks(np.arange(-4, 4, 1)) #ax1のx軸目盛設定 ax1.set_yticks(np.arange(-2, 2, 0.1)) #ax1のy軸目盛設定 ax1.set_xlim(-3, 3) #ax1のx軸範囲 ax1.set_ylim(0, 0.5) #ax1のy軸範囲 ax1.plot(x, y) #データをプロット plt.show() #グラフを表示 plt.close() #グラフを消去 |
この書き方でも対話形式と同じ結果を得ます。
オブジェクトを作成するメリット
上記コードではまずfigというオブジェクトを作成しています。そして次にfigを使ってax1というプロットのオブジェクトを作成しています。
オブジェクト指向の書き方は先に紹介した対話形式の書き方に比べ、文量が多くなっており、なんでこんな書き方が必要なのか疑問に感じる方も多いかも知れませんが、以下のように複数グラフをプロットし、それぞれのグラフ設定を別々に設定する時に便利です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import numpy as np from matplotlib import pyplot as plt fig = plt.figure() #プロットの入れ物オブジェクト作成 ax1 = fig.add_subplot(211) #ax1のプロットのオブジェクト作成 ax2 = fig.add_subplot(212) #ax2のプロットのオブジェクト作成 ax1.set_xticks(np.arange(-4, 4, 1)) #ax1のx軸目盛設定 ax1.set_yticks(np.arange(-2, 2, 0.1)) #ax1のy軸目盛設定 ax1.set_xlim(-3, 3) #ax1のx軸範囲 ax1.set_ylim(0, 0.5) #ax1のy軸範囲 ax1.plot(x, y) #ax1のデータをプロット ax2.set_xticks(np.arange(-4, 4, 0.2)) #ax2のx軸目盛設定 ax2.set_yticks(np.arange(-2, 2, 0.1)) #ax2のy軸目盛設定 ax2.set_xlim(0, 1) #ax2のx軸範囲 ax2.set_ylim(0.3, 0.5) #ax2のy軸範囲 ax2.plot(x, y) #ax2のデータをプロット plt.show() #グラフを表示 plt.close() #グラフを消去 |
対話形式で上図のような複数プロットの設定を別々に設定する方法…を筆者は知りません。
おそらく対話形式だとプロット設定の変更がある度に指令を与える方法になると思いますが、オブジェクト指向であれば変更がある際もオブジェクトを指定して変更すれば良いだけなので簡単です。
まとめ
このページではmatplotlibのオブジェクト指向スタイルプログラミングの基本を習得しました。
この方法を使うことで複数プロットの設定を個別に変更することが容易になりました。
筆者はWATLABブログで記事を書きながらPythonを勉強しているため、初期の頃はmatplotlibのこんな使い方は知りませんでしたが、オブジェクト指向プログラミングにはまだまだ便利な使い方がありそうです。
今後も便利な使い方を発掘次第記事にしていきます。
「オブジェクト指向」の考え方を理解していけば本当のプログラマみたいになれそうだ!matplotlib以外にもこのような関数のオブジェクト化の考えで効率化できないか応用してみよう!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!
コメント