この記事のターゲット
- 理論シミュレーションとかで出てきたデータをグラフ化する方法を探している人
- 今までgnuplotを使っていたけどPythonにも興味がある人
- でも何からやればいいのかよくわからない人
- というか「matplotlib、いろんな流儀ありすぎィ!」って混乱してる人
目次
- 1次元図(この記事)
- 2次元contour図 https://qiita.com/Bluepost59/items/a0869aee34db3f450162
想定しているデータ形式
配列を扱える言語は多い。fortranでもCでも多次元配列は普通に使えるが、出力する場合は、例えば次のようなコードで出すことが多いと思う。
do i=1,Nx
write(UNITNUM,*) i,a(i)
end do
このコードを実行すると、次のような形でデータが並ぶことになる。
1 0.000E00
2 0.628E00
...
10 0.810E01
matplotlibのインポート
Pythonでグラフを書くときは、次のライブラリを使う。
- NumPy
行列を扱うためのライブラリ - matplotlib
グラフを書くライブラリ - matplotlib.pyplot
matplotlibのインターフェースのようなもの
おのおのの詳細についてはもっとググってもらうとして、この三つがあればグラフは書ける。
普通にローカルのPCにインストールする場合、GUIが使えるが、たとえばリモートのスパコン上のデータを可視化したりするときは必ずしもGUIが使えるとは限らない。そのときは画像に出力する設定(gnuplotのset term pngcairoのような感じ)をしなければならないが、ここにつまづくポイントがある。
まず、NumPyとmatplotlibをインストールする。次にmatplotlib.pyplotをインストールする前に、matplotlibをpngで出力するように設定する。具体的には次のようになる。
import numpy as np
import matplotlib as mpl
mpl.use('Agg')
import matplotlib.pyplot as plt
この順番を間違えるとエラーが出る。
データの読み込みと整列
データの読み込みはnumpyのloadtxt関数で行う。これはNumpy配列を返す関数で、以下のように記述する。
mydata = np.loadtxt('mydata.txt')
このときmydataの中身は
[[1,0.0000],
[2,0.628],
...,
10,0.810]]
とNx行2列行列となる。
一方、matplotlibで描画に用いるplotメソッドは、次のようになる。
myax.plot(x,y)
このxが横軸、yが縦軸の数値リストであり、ともに同じ次元を持つ1次元リストでなければならない。つまりnp.loadtxtで読み込んだmydataからx,yに整列する必要がある。ただし今回は「mydataの1列目」と「mydataの2列目」とするだけでよいので、次のように指定するだけでグラフにできる。
myax.plot(mydata[:,0],mydata[:,1])
サンプルコード
import numpy as np
import matplotlib as mpl
matplotlib.use('Agg')
import matplotlib.pyplot as plt
mydata = np.loadtxt('mydata.txt')
myfig = plt.figure()
myax = myfig.add_subplot(1,1,1)
myax.plot(mydata[:,0],mydata[:,1])
myfig.savefig('mydata.png')
myfig.clf()
ここでfigureとaxesについて触れておく。figureとaxesはmatplotlibのオブジェクトで、figureが画像全体で、axesは各グラフに対応する。イメージとしてはfigureという台紙にグラフに対応するaxesを貼り付けていくような感じである。pltに直接メソッドを作用させていくやり方もあるが、このサンプルコードのようにfigureオブジェクトとaxesオブジェクトを定義するやり方もあり、後者の方が複数枚並置する場合などに拡張しやすい。