pythonのmatplotlibを使ったプロットの描画

今回の投稿ではpythonのmatplotlibを使ったプロットの描画の仕方をまとめておきたいと思う。

プロットを作るためのソフトウェア

さて数値データを人に説明しようかと思うと、やはり何らかのプロット(絵)に変換して見せるのがわかりやすいかと思う。 数値データからプロットを作るソフトウエアはエクセルをはじめとして各種の優れた有料ソフトウエアが存在している。 普通はエクセルか所属機関が購入しているソフトを使うことが多いのだろうけど、見た目にこだわりがあるなら自分の予算次第で買うのもありだろう。 そんなに高いわけでもない。
無料ソフトで作りたいと思ったら、gnuplotなどはかなり高性能な上に見た目も良いプロットを作ることができる。 プログラミングと組み合わせて使っている人が多いソフトでもある。 使い勝手に対する意見は分かれるところかもしれないが。

pythonを使ったプロットの描画(matplotlib)

さて我らがpythonはどうなんだというと、matplotlibというパッケージが用意されている。 pythonを使い慣れていればそれなりに使い勝手は良いし、絵も努力次第ではかなり綺麗な絵を出力することができる。 pythonは使っている人が多いので、色合いやプロット形式などのフォーマットを拾ってくれば簡単にクオリティーの高い絵を出力することができる。 もちろん自分の好みを追求していくことも可能だ。
とはいえpythonでプロット出力のスクリプトを書くのには、それなりに時間もかかる。 一つのプロットを作るのにスクリプトを書くのは、あまり賢いことではないだろう(私は自分に練習だからと言い聞かせて書いてしまうこともあるが)。 一方で似たような形式のデータから多数のプロットを作製したい時などは、スクリプトを書くことで時間の短縮ができることもある。 さらに何かのプログラムを書いた時に、ついでにプロットを一緒に出力してしまうのも良い方法だ。 例えば私は良く2Dイメージを強度vsピクセルのプロットに変換するのだが、テキストデータを作ると同時にプロットも出力してしまうようにスクリプトを書いている。

matoplotlibを使ったスクリプトの例

matplotlibはanacondaのpythonを使っていれば標準インストールされていると思う。 そうでない場合はpipでインストール。

pip install matplotlib

スクリプトの最初にmatplotlibのpyplotをインポートしておく。 基本的にはこれだけで良いと思うけど、必要に応じて他の関数もインポートする。 私はグレイスケールの画像を使うのにmatplotlib.cmなどもインポートしている。

import matplotlib.pyplot as plt

私の場合他のパッケージとの競合でのバグ避けようにおまじない。

matplotlib.use('TkAgg')

さてプロットの基本設定は紛らわしくないように、メイン関数の中にでも書いておくと良いかと思う。上からフォント・サイズ・各軸の線の太さ・x軸のメモリの太さ・x軸のラベルサイズ・y軸のメモリの太さ・y軸のラベルサイズ。 最後のは絵を出力する際のサイズ比。 調べてないけどrcParamsはもっと色々設定できるんじゃないだろうか。

plt.rcParams['font.family']='Arial'
plt.rcParams['font.size']= 20
plt.rcParams['axes.linewidth']=3.5
plt.rcParams['xtick.major.width']=2.5
plt.rcParams['xtick.labelsize']=20
plt.rcParams['ytick.major.width']=2.5
plt.rcParams['ytick.labelsize']=20
plt.rcParams['figure.figsize']=(8,6)

さてデータは適当に読み込む。 numpyだったらこんな感じ?

plot = np.loadtxt(argvs[1])

そうしたらプロットを作る関数なりクラスなりを書く。 この場合yが縦軸のデータでx軸が横軸になる。 –は線グラフになるが、oなどを使うと散布図で出力できる。

plot_data(plot)
def plot_data(plot):
y = plot[50:2000,1]
x = plot[50:2000,0]
plt.plot(x, y, '--', colour = [1,1,1], linewidth =2, label='test')

といった感じ。
細かいプロットの調整は関数の中でしても良いかも。 特に一つのプログラムの中で複数のプロットを出力するのに、それぞれ設定を変えたい時なんかに。 そんな時は一つプロットが終わって絵を吐き出したらplt.clf()でリセットしておく。
話を戻してX軸y軸のラベルの調整。

plt.tick_params(axis ='y', which ='both', left='off', right='off', labelleft='on', pad=10)
plt.tick_params(axis ='x', which ='both', top='off',pad=8)

縦横軸の設定。 フォントは初期設定から変えたい場合はここでも変えられる。 特殊記号も下記のようにtex形式やらコードやらで記入可能。

plt.xlabel(r"$\theta$"' (\u00B0)', fontsize = 30, fontname='Arial')
plt.ylabel("Int", fontsize = 30, fontname ='Arial')

レジェンドを図中に入れるなら。 locで場所の指定ができる。 bestみたいなお任せで適当に入れてもらう機能もあるが、必ずしもよくない。

plt.legend(fontsize =14, loc='upper right')

図の保存。 サイズ指定で絵を出力するとはみ出ることがあるので、bbox_inches=’tight’を指定しとくときっちり収まる。

plt.savefig(name, bbox_inches='tight')

あとはx軸とy軸の範囲指定はよく使う。

plt.xlim(5, 100)
plt.ylim(0,10000)

などなど。 最後に保存した絵に加えて、pythonにもプロット出力させておきたかったら。

plt.show()

基本的な使い方はこんな感じでしょうか。 あとはプロットする色の組み合わせなど外部パッケージを使うと少し楽できる。 私が使ったことがあるのはbrewer2mpl。 まずは色のグラデーションを作ってあげる。

import brewer2mpl
bmap = brewer2mpl.get_map('Blues','sequential', 7)
bmap2 = brewer2mpl.get_map('OrRd','sequential', 7)
colors =bmap.mpl_colors
colors2 =bmap2.mpl_colors

それからカラーをcolor[]で指定して出力してあげる。

plt.plot(arr1[50:1000,0],17000+arr1[50:1000,2], '-',color=colors[6], lw=2, alpha=0.7, label='WATER')

てな具合に。
今思いついたのはこのぐらい。 何か有用なことでも思い出したら追記するが、あまり思いつきそうなことももないかなとも思っている。

関連記事

pythonのまとめ

D