Help us understand the problem. What is going on with this article?

資料作りのためのmatplotlib入門(1) 1次元図

More than 1 year has passed since last update.

この記事のターゲット

  • 理論シミュレーションとかで出てきたデータをグラフ化する方法を探している人
  • 今までgnuplotを使っていたけどPythonにも興味がある人
  • でも何からやればいいのかよくわからない人
  • というか「matplotlib、いろんな流儀ありすぎィ!」って混乱してる人

目次

  1. 1次元図(この記事)
  2. 2次元contour図 https://qiita.com/Bluepost59/items/a0869aee34db3f450162

想定しているデータ形式

配列を扱える言語は多い。fortranでもCでも多次元配列は普通に使えるが、出力する場合は、例えば次のようなコードで出すことが多いと思う。

do i=1,Nx
   write(UNITNUM,*) i,a(i)
end do

このコードを実行すると、次のような形でデータが並ぶことになる。

1 0.000E00
1 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のloattxt関数で行う。これは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])

サンプルコード

https://gist.github.com/Bluepost59/133efb85f3f50a16fd2e823074879c28

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オブジェクトを定義するやり方もあり、後者の方が複数枚並置する場合などに拡張しやすい。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした