Matplotlib 超入門(1):インストールから基本的機能の使い方まで

この投稿から「matplotlib 超入門」という名前のシリーズで,matplotlib の使い方を本当に最初の最初からの説明を試みたいと思います.今までグラフを描くソフトを使ったことがない方もわかるように配慮して書いてみたいです.「matplotlib を使うと綺麗なグラフが書けるから使ってみたい」という方の背中が押せればと思います.あまりプログラムに慣れていない方もわかるように,書いていることの説明をできるだけ丁寧に書いていきます.

なお,この記事の流れは自分が初めて matplotlib を使ったログをもとに作成しています.なので,本当に初心者向けの超入門ではないのでしょうか.

環境は Windows10 に Anaconda4.1.1(64bit) で Python3.5.2 をインストールした状態です.IDE として PyCharm を用いております.今回の記事では公式のチュートリアルに従って習う過程をログにしたものです.単なる日本語訳ではないのでご安心を...







インストール

自分はコマンドプロンプトで次のコマンドを打つだけで終わりました.

pip install matplotlib

フリーの Linux の OS を使っているなどで環境が私の場合と違う方はもしかしたらこの通りにインストールできないので,他のサイトなどでインストールの方法を見ていただいてからこちらの続きの通りに従ってみてください.

最初の例:リストをプロット

チュートリアルの最初に書いてあるものを,説明のため少し変えたソースコードを載せておきます.説明は結果を見た後に見たいと思います.

import matplotlib.pyplot as plt
plt.plot([3,4,2,1])
plt.ylabel('some numbers')
plt.show()

実行結果は次のようになります.ちなみに上のコードではグラフが表示されるだけで,図がファイルで出力されるわけではありません.どうやって結果をファイルに出力するのかは下の「ファイルへ出力」に書いてあるので,ひとまずこの通りにコードを実行させてみてください.
intro1_1

matplotlib を使う宣言

そもそも matplotlib というのは lib で終わっている通りライブラリ(機能の集りみたいなもの)である.その集りからどのような機能を使うかを自分で決めなければなりません.

import matplotlib.pyplot as plot

import matplotlib.pyplot」までで「matplotlib の pyplot という機能を使えるように持ってきます」という意味になります.python の言葉でこのプログラムが matplotlib を使えるように持ってきています.「as plt」というのは,「matplotlib.pyplot を使う際にいちいち matplotlib.pyplot と打つのは面倒なので,plt と打つことにします」ということだ.基本的に python で matplotlib を使いグラフを書く際には「import matplotlib.pyplot as plt」を呪文のように唱えると理解しても問題ないでしょう.plt の部分をほかの文字に変えれば,その文字で matplotlib.pyplot を利用できる.「import matplotlib.pyplot as aaa」とすれば aaa という指示と matplotlib.pyplot が同じになります.

リストのプロット

二行目について.[3,4,2,1] というのは python でいうところのリストです.

plt.plot([3,4,2,1])

plt.plot([3,4,2,1])」の日本語への翻訳は「最初は3, 二番目は4, 三番目は2, 四番目は1 です.これを何番目かを横軸に,その値を縦軸にプロットしろ(指示)」という意味になります.plt.plot の部分は matplotlib.pyplot.plot と同じ意味です.plt という名前で呼び出してきた機能のうちの plot という関数を使っています.結果を見て注意してほしいのは,リストの一番目の横軸の値は 0 であることですね.つまりリストの [math]i[/math] 番目は [math]x=i-1[/math] のところに点が打たれます.

ラベルの表示

plt.ylabel('some numbers')

このように書くことで,y軸のラベル(しるし)を ‘some numbers’ に指定しています.結果の左を見るとそのラベルが書かれているのがわかります.この行を書かなければラベルは何も表示されません.また,今回の例では書いていないのですが,「plt.ylabel(‘hogehoge’)」を「plt.xlabel(‘hogehoge’)」に変えると,x軸のラベルを作成することができます.

グラフの表示

plt.show()

四行目の「plt.show()」で「今まで書けと指示したものを,実際にグラフにして私たちにウィンドウで見せます」という意味です.これがないとプログラムを実行させても何も起きないです(パソコンが先ほどまで指示を受けて書く準備をしていたが,最終的に「書け」という指示がないため書かない).

2番目の例:座標の点 [math](x,y)[/math] 指定してプロット

チュートリアルに書いてある次の例について,まずはコードを少し変形したものとその結果です.

import matplotlib.pyplot as plt
plt.plot([1,2,3,4], [1,4,9,16], 'ro')
plt.show()

実行結果
intro1_2

最初の行と三行目はさっきの例と同じなので,二行目だけ説明したいと思います.

座標を指定してプロット

まず [1,2,3,4] の部分は,打つ点のx(横軸)の値を順番に書いています.同様に,[1,4,9,16] の部分は,打つ点のy(縦軸)の値を順番に書いています.それぞれの順番通りにxとyが対応されて,例えばこの例だと[math](x,y) = (1,1), (2,4), (3,9), (4,16)[/math] の4つの座標を指定しています

点のスタイル

最初の例を振り返ってみると,プロットする点だけを指定しただけなのにそれぞれの点同士が直線で結びついていることがわかります.つまり matplotlib.pyplot.plot (今の場合は plt.plot) では,特に指定をしてあげない場合自動的に点同士を線でつなぎます.しかし今回の例では線でつながってはいませんこれは「, ‘ro’」というものが plt.plot の中に追加されているからなのです.

plt.show([1,2,3,4], [1,4,9,16], 'ro')

カンマ (,) で区切った後に「‘ro’」と足している部分で点のスタイルを決めています.具体的には「赤い(red)丸(o)」という指示になっています.ほかにどんな点のスタイルができるのかをちらっと見るために,この部分だけを

plt.show([1,2,3,4], [1,4,9,16], 'g^')

のように変えてあげます.すると実行結果は次のようになります
intro1_3
‘g^’」は「緑の(green)三角(^)」という意味であることが分かりますね.

点は全部で4つを指定しているのですが,真ん中に二つだけ見えて残りの二つ端にぎりぎり移っていますね.これではグラフを読みづらいので,今度は表示する範囲を変えてみましょう.

グラフを表示する範囲を変更

公式チュートリアルの次のコードを見てみましょう.

import matplotlib.pyplot as plt
plt.plot([1,2,3,4], [1,4,9,16], 'ro')
plt.axis([0, 6, 0, 20])
plt.show()

実行結果
intro1_4

これは先ほどのものに3行目が足された形になっているのでこの行だけ説明します.

plt.axis([0, 6, 0, 20])

plt.axis」でグラフの軸の出力範囲を指定しています.コードと実行結果を比較していただければお分かりかと思いますが,使い方としては

plt.axis( [xの最小, xの最大, yの最小, yの最大] )

のようにします.これで幾分かグラフが見やすくなりましたね.

関数を描いてみる(numpy との合わせ技)

numpy をインストール

今までのようにリストだけを表示させる機能だけであれば,ほぼ使いものにならない(公式にそう書いてある.ライトジョークのつもりだろう).ということで,今度は関数のグラフを表示させてみる.チュートリアルによると,このようなことをする際には numpy というライブラリを用いると便利になるという.コマンドプロンプトで次のコマンドを打ちインストールを試みる.

pip install numpy

筆者の環境の場合すでに入っていたようだ.Anaconda で Python を入れたからかな...

ともかく関数のグラフをを書いてみる.チュートリアルから関数を書く部分を単純な形にして取り出すと以下のようになる.

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0., 5., 0.2)

plt.plot(x**3, 'b--')
plt.show()

結果
intro1_5

numpy を使う宣言

import numpy as np

1行目のこのような記述で「numpy というライブラリを np という名前で使えるようにします」と宣言している

numpy を用いた数列の生成

x = np.arange(0., 5., 0.2)

numpy の arange という機能を使って,数字のリスト(数列)を作成しています.arange は「与えられた間隔で一定に並んでいる値を返す(原文:”Return evenly spaced values within a given interval.”)」という機能を持っています.この例では「xという変数に,0.(つまり0.0)から5.(つまり5.0)までを 0.2 刻みで点の集りを作れ」という指示になっています.気になる方は print(x) という行をこれより後に書いてみるとこの指示の意味が明確にわかるのではないかと思います.

上のコードではもっぱらこの数列を作成したいがために numpy を用いています.

関数のプロット

plt.plot(x**3, 'b--')

先ほど使った「plt.plot」を用いて関数をプロットします.x**3という部分は「xの3乗([math]=x^3 = x\times x\times x[/math])」を表していて,これが y の値として持つような点の集合 (x,y) がプロットされます.numpy で作った数の集合 x を引数(インプット)として持つ関数をプロットしてくれます.先ほどのまでの知識からいうと

plt.plot(x, x**3, 'b--')

のように x と y 両方指定しなければできなそうですが,実はこう書いても結果は同じなので最初の x は省略可能です.

「b–」というところは先ほどの点のスタイルを指定していて,この例では「青(blue)の点線(–)」で点を表示するよう指示しています.「–」という書き方をすると線で繋いだ上で点線になることに注意しましょう.つまり後ろのオプションは点のスタイルだけでなく線のスタイルも決めれます.

複数のグラフを,同じ場所に異なるスタイルでプロット

まず,公式チュートリアルの通りのコードと計算結果を載せておきます.

import numpy as np
import matplotlib.pyplot as plt

# evenly sampled time at 200ms intervals
t = np.arange(0., 5., 0.2)

# red dashes, blue squares and green triangles
plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')
plt.show()

実行結果
intro1_6

コメントアウト

これは numpy でなく python の機能によるものですが,行の最初にシャープ(#)を付けることでプログラムを動かす際にその行を無視するということになります.つまりコメントやメモを書き足せるようになり,これをコメントアウトといいます.よって「# evenly sampled time at 200ms intervals」という行はなかったことにされます.「# red dashes, blue squares and green triangles」も同様に無いことにされます.

複数の関数を同時プロット

またしても「plt.plot」を用いて関数を複数同時プロットができます.書き方としては

plt.plot(xの値1,yの値1, 値1の点のスタイル,xの値2, yの値2,値2の点のスタイル...)

のようにします.(xの値,yの値,スタイル) を1ペアとして,あとはそれを並べていくだけでよいのです.

ちなみに,点のスタイルで登場している「’bs’」は「青(blue)の四角(square)」という意味です.

関数を定義することでスッキリさせる

今のままですと plt.plot の中がとても複雑になってしまいます.そこで Python の関数を定義できる機能を用いて,もう少しコードをスッキリ(?)させてみます.実行結果はすぐ上のものと同じなので省略します.

import numpy as np
import matplotlib.pyplot as plt

def f(t):
    return t

def g(t):
    return t**2

def h(t):
    return t**3

t = np.arange(0., 5., 0.2)

plt.plot(t, f(t), 'r--', t, g(t), 'bs', t, h(t), 'g^')
plt.show()

ファイルのデータをプロット

ここまでは公式ビギナーズガイドの内容をかみ砕いて説明してみましたが,最後に応用の練習としてファイルのデータをプロットすることををしてみたいと思います.

リンク先にタブ区切りになっている二行のファイルのデータがあるので,そちらをダウンロードして練習してみましょう.

input.txt

こちらの一列目の値を横軸,二列目の値を縦軸として,ファイルを読み込んでグラフを出力させるようなコードを書いてみましょう.これは matplotlib の使い方と python を合わせて行うので今までのものより少々手こずるかとおもいます.ここまでの説明でこれが自力でできるのであれば,もう matplotlib は使いこなしているのも同然だと思います.

一応練習問題にはしていますが,参考として自分が作った際のコードを載せておきます.自分も初心者なのでコードに無駄があると思いますので,削れる部分は削ぎ落してみてください.アイディアの概要は,いったんリストに収めてからプロットするといった方法をとっています.nuumpy は使っていません.もっといい方法などがありましたら是非コメントなどで教えていただきたいです.プログラムを置いてある場所に “Input.txt” を配置して実行してください.

import matplotlib.pyplot as plt

with open("Input.txt", 'r') as inputfile:
    lines = inputfile.readlines()
    x = []
    y = []
    for line in lines:
        value = line.replace('\n', '').split('\t')
        x.append(value[0])
        y.append(value[1])

    plt.plot(x, y)
    plt.show()

実行結果
intro1_7

図をファイルへ出力

matplotlib を使おうとしている方の中には,ただ書いて満足するだけでなくそれをほかの誰かに見てもらうことを念頭に置いている方が多いのではないのでしょうか.そのような場合はグラフを書いて見るだけで満足するのでなく,図をファイルとして出力しておきたい場合があります.その時は「savefig」という関数を用います.詳細はhttp://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.savefig にありますが,「とりあえず詳しい設定はあとにして,綺麗な画質で出力できればいい」という方は次の二つを抑えておくだけでも十分かと思います.

png 形式へ出力

“hoge.phg” というタイトルで出力する際は,最後に次を追加すればオッケーです.

plt.savefig('hoge.png', dpi=300, orientation='portrait', transparent=False, pad_inches=0.0)

pdf 形式へ出力

“hoge.pdf” というタイトルで出力する際は,最後に次を追加すればオッケーです.

plt.savefig('test.pdf', orientation='portrait', transparent=False, bbox_inches=None, frameon=None)

savefig と plot を同時に用いる際の注意

savefig をしてから plot をさせると両方とも成功するのですが,一度 plot をしてウィンドウで表示をしてしまうと,それより後に savefig を書いてもファイルにはグラフが出力されません.


公式のビギナーズガイドの順にある程度沿って,matplotlib を初めて使う方向けにわかりやすくチュートリアルしてみました.初めて習う方が知りたいであろう部分にも手が届くように心がけてみましたがいかがでしたでしょうか? ここまでで matplotlib 超入門第1章はは終わりにしようと思います.長くなりましたが少しでも読んでいただいた方,本当にありがとうございます.

このブログについて

IAtLeX です.ブログをはじめてさほど時間がたっていないので,未熟な内容が多々あるかと思いますが,それも時間が解決してくれるはず...Python系の記事を着々と充実させていきたいです.投稿主についてはこちらを参照してください.

このブログについて - http://iatlex.com/about_blog/

コメント

  1. mennma より:

    簡潔でわかりやすくて良かったです!

    1. IAtLeX より:

      自分もこの記事書きながら Matplotlib に初めて触れたので、初めての方にはウケがよいみたいです(自分で言っちゃう)。見てくれている方がいるってとてもうれしいです、ありがとうございます!

  2. philophilia より:

    python初心者ですが、とても分かりやすい記事でした。
    ちらっとブログ見ましたが、ドイツに留学される(留学中?)んですね。
    私も以前フランスに留学経験があり、共感を覚えました。
    色々と大変かと思いますが、頑張ってください。

    1. IAtLeX より:

      Matplotlib のやつだけでなく、ブログの方にも目を通してくださったのですね!感謝感謝です!!!

      フランス留学、メチャクチャ羨ましいですね… 実はまだ日本から出れていません(笑)色々大変じゃないはずなんですけどね…おっしゃってくださった通り、頑張ります!

コメントを残す

*