matplotlibのメモページ

pythonやらmatplotlibやらのメモ。

参考になるページ

matplotlibでいろいろなプロットができることを紹介しているページ。

xkcd styleのplotをmatplotlibで作りたい時。

python関係の用語

  • module:
pythonのスクリプトが書かれたファイルのこと。pythonでは、
import module_name
とすることで、それらのmoduleを取り込む (import) することができる。

matplotlibを使うためには

さきほど言ったように、pythonを開き、matplotlibをimportすればよい。具体的にはコマンドライン上で
python
と打ち、そのあと、
import matplotlib
とすればよい。これで、matplotlibがimportされた。
実際は、様々な関数を使うことがあるので、その際に便利なnumpyなどもimportしておくとよい。なので、最初は

import numpy as np
import scipy as sp
import glob
import matplotlib.pyplot as plt

などと最初に書くことが多い。
import hogehoge as hg
と書かれているものは「"hogehoge"という名のモジュールを"hg"という名前をつけて使います」という宣言をしている。
また、"matplotlib.pyplot"というのは、matplotlibの下にあるpyplotモジュールを指す。

ファイルを読み込む

自前でデータを持っていて、それを読み込みたいときは"np.loadtxt"モジュールを使う。
x = np.loadtxt('aho.tbl')
これで、'aho.tbl'がxに入った。

また、特定のdirectoryにある大量のファイルを読み込みたい時もある。たとえば、dir /HOGEの下にある拡張子".tbl"というファイルをすべて読み込みたいときは、

import glob
とglobを読み込んでおいて、
a = glob.glob('/HOGE/*.tbl')

とすると、aにすべてのファイル名が読み込まれる。確認をしたいときは

print a
とすればよい。

図をプロットする

"aho.tbl"には一列目に波長、二列目にflux、三列目にfluxのerrorが入っているとする。
これらのデータを読み込んで、実際にプロットをしてみる。そのためには、まずはデータを読み込み、
a = np.loadtxt('aho.tbl')
そして、波長、flux、fluxのerrorがどこに入っているのかを教えて代入する。
wave = a[:,0]
flux = a[:,1]
flerr = a[:,2]
a[:,0]は、1列目のデータの配列を指す (pythonの場合、配列は0から)。同様に、a[:,n]は、(n-1)列目のデータにある配列をさす。 上は1, 2, 3列目の配列をそれぞれwave, flux, flerrに代入している。
上記のように代入したデータを、横軸波長、縦軸fluxとしてプロットしたい場合は、
plt.plot(wave, flux)
とすればよい。さらに、エラーバーも含めてプロットしたい場合は、
plt.errorbar(wave, flux, yerr=flerr)
とすればよい。また、エラーバーの領域に色を塗りたい時があるかもしれない。その場合は、
plt.fill_between(wave, flux-flerr, flux+flerr)
と書くことができる。
fill_betweenは図の凡例を付けたい時にlabel=""が働かない問題が知られていて、それを解決するためには、空データを与えて、図の凡例を無理やりつけてやればよい。たとえば、
plt.plot([], [], color='red', linewidth=10, label="Pseudo Data")
などとして、fill_betweenで使用したものと同じcolorを指定し、linewidth=10などとしてlineを太くしてやるとよい。

upper/lower limit付きのプロットをしたい

読み込んだファイルでプロットをするときに、lower/upper limitであることを表示したいときがある。そういうときは、
plt.errorbar(wave, flux, yerr=0.3*flux, lolims=True, fmt='+', capsize=5)
などと書けばよい。lower limitのときは、"lolims"のところを、"uplims"に変えるとよい。もちろん、"lolims"より後ろはオプションなので、自分の好きなようにいじっていけば良い。yerrのところが矢印の長さになる。

直線をプロットする

直線y=ax+bみたいなものをプロットしたいときは, もしa, bなどがfixされている場合は、
a=2.0
b=5.0
plt.plt(x, a*x+b)
で問題ない。また、プロットの範囲を選びたいときは
x=np.linespace(0.0, 20.0, 20)
などとしてから、同様に
plt.plt(x, a*x+b)
とすればよい. linespaceは3つの変数を持ち、左から最小値、最大値、プロット点の数である。


ヒストグラムを書く

ヒストグラムを書くときには、まずは分布を示すデータを準備する。データを持っていないときは適当に乱数を振ってくれるものを使ってデータを用意する

x=np.random.randn(10000)
(1000)はサンプルの数で、これで中心0の正規分布に従う乱数がxに入る。このあと、

plt.hist(x)
と打てば、上記の正規分布のヒストグラムが表示される。
ヒストグラムは様々なオプションがあって、
plt.hist(x, bins=100, alpha=0.7, color='r')
は、"xのヒストグラムを、bin数100, 透過率30%, color="red"でプロットする"という意味になる。ほかにも様々なオプションがある。

様々な図の設定

さて、図をプロットしたあとは、図を保存したり、横軸をいじったり、縦軸をいじったりして、他の人が見た時に、最も大事な情報が取り出せるような、見やすい図にする必要がある。それを実現するためには、往々にして、細かい設定をいろいろとする必要がある。

軸の表示範囲の指定

x, y軸の表示範囲を指定するときは
plt.xlim(xmin,xmax)
plt.ylim(ymin,ymax)
などと書いてやればよい。また、x, y軸同時に表示範囲を指定したいときは、
plt.axis(xmin,xmas,ymin,ymax)
などと書けば良い。

対数軸の設定

軸を対数目盛にしたいときは、
plt.xscale('log')
plt.yscale('log')
と書くと良い。

図のタイトルの設定

とある図にタイトルを付けたいときは、
plt.title('title_name')
と書けば良い。

軸のタイトルの設定

また、x軸やy軸にタイトルを付けたいときもある。その場合は、
plt.xlabel('xlabel_name')
plt.ylabel('ylabel_name')
などとすればよい。様々なオプションがあって、フォントの指定や、フォントサイズを変えたいときは
plt.xlabel('xlabel_name', fontsize=20, fontname='serif')
とすればよい。

図の凡例の設定

図の凡例は"legend"で設定をいじることができる。
plt.legend(fancybox=True,loc='upper left', prop={'size':20}, numpoints=1)
と書くと、
  • 凡例を囲う形が四角形で、そのうち隅は尖っておらず丸いもの (fancybox=True)
  • 凡例の場所は左上 (loc='upper left')
  • フォントのサイズは20ポイント (prop={'size':20})
  • 凡例内に表示されるデータ点がデフォルトでは2つあるが、それを1つにする (numpoints=1)

などが設定できる。

図の保存

図を保存したいときは、savefigというものがある。
fig = plt.savefig('filename')
とすればよい。余白を調整したいときは、"bbox_inches="tight", pad_inches=0.0"というふうにするとよい。つまり、
fig = plt.savefig('filename', bbox_inches='tight', pad_inches=0.0)
と書ける。もし、余白を少し残したいときは、"pad_inches"のところの値を少しずつ増やしていって、ベストなものを探す。

複数の図を描いた時に、軸のタイトルと図がかぶらないようにする。

複数枚の図を一度に書く場合に、軸のタイトルが図とかぶってしまうときがある。そういうときは、
http://matplotlib.org/users/tight_layout_guide.html
を参考にする (要編集)。

軸の設定

一つのfigureの中に複数の図を入れたい場合、fig, axをうまく使うと簡単にできますよ、というのが以下にまとまっている。
http://matplotlib.org/examples/pylab_examples/subplots_demo.html
最終更新:2016年03月21日 21:48