Pythonロゴともろみ先輩

今回はmatplotlibを使ったグラフの作り方をご紹介します。

何かデータがある時にそれをぱっと見てわかるようにしたいという場面はよくあると思います。

研究においてもデータの可視化は見る人に直感的にわかり易いものを作るためにとっても大切です。

この記事では初心者向けということで簡単な仕組みと描画方法だけを取り上げます。

それでは本題です。

matplotlibによるプロットの基本

初心者で見に来てくださった方にとってはまずmatplotlibとはなんぞやという所からかと思いますが,matplotlibは描画のためのpythonのライブラリです。

基本的にpythonでグラフを描こうと思ったらまずmatplotlibを使うと思っていいです。

matlabなんかを使ったことがある方は殆ど同じような流れで描画できるのですぐに慣れると思います!

ライブラリのインポート

まずmatplotlibで描画するときのインポート部分をお見せします。

import numpy as np
import matplotlib.pyplot as plt

こんな感じです。

numpyもインポートしていますが,基本的に何かグラフを描く時には必ずデータが必要なのでnumpyは殆どセットだと思いますのでついでに書きました。

今後の例でもnumpyは必ず使いますので皆さんもセットで書いておいて下さい。

さて,何人かの方は疑問を持たれたかもしれませんが,””.pyplot“”この後半部分は何かというとmatplotlibの中にあるAPIでよく使うモジュールが沢山入っているものです。

なので2行目のコードは殆ど毎回このように書くと覚えておいていいかと思います。

2つの描画方法

では早速実際にデータを生成して描画してみましょう。

ただしここで注意です。

描画の方法には大きく2つの流儀があります

1つはplt.で書く方法,もう1つはax.で書く方法です。

これはそれぞれインスタンス(構造)を意識しない単純な方法,インスタンス(構造)を意識した厳密な方法だと言っていいと思います。

インスタンスというのはオブジェクト指向を少し理解する必要があるのでここでは簡単のため構造という表現をします。

何はともあれコードを書いてみましょう。

描画するデータはsin関数にします。

t = np.arange(-10, 10, 0.1)
s = np.sin(t)

ではまずはインスタンスを意識せず書く方法です。

plt.plot(t, s)
plt.show()

次にインスタンスを意識した方法です。

fig,ax = plt.subplots()
ax.plot(t,s)
fig.show()

どちらも結果は次のようになります。

では簡単に何が違うか説明します。

実は描画するときの図は次のような階層構造になっています。

つまりFigureの中にAxesがあって,更にその中にAxisが複数あるわけです。
※今回はご紹介しませんがAxesを複数作ることもできます

インスタンスを意識しない方法は実際にはこの階層構造を作って該当するところに描画するようにしているのですが,これを使いやすいように(意識しなくても実行できるように)しています。

勿論どちらの方法を使ってもいいですが,細かい変更をする際には構造を意識していた方が柔軟に対応できます。

ですので個人的には後者の方法に慣れるのをオススメします。

この辺りのお話は公式ページに明記してありますので興味がある方は読んでみて下さい。

細かい設定

最後にタイトルや軸の名前,色などの細かい設定を幾つかご紹介します。

それぞれ設定できるパラメータが様々ありますので本記事では1例お示しするだけに留めます。

命令それぞれの役割についてはインラインコメントで補足していますので参考にしてください。

例としてsin関数とcos関数を色を変えて描画してみましょう。

信号の生成は次のようにします。

t = np.arange(-10, 10, 0.1)
s1 = np.sin(t)
s2 = np.cos(t)

ではこの2つの信号を先にご紹介した2つの方法でそれぞれ描画してみます。

先に結果は次のような画像になります。

インスタンスを意識しない方法

まずは単純な方法です。ついでに保存までしてみましょう。

plt.plot(t, s1, color="magenta", linestyle="solid", label="sin(t)")
plt.plot(t, s2, color="cyan", linestyle="dashed", label="cos(t)")
plt.legend() # 凡例の表示
plt.title("sin(t) and cos(t)") # グラフのタイトル
plt.xlabel("t [s]") # 横軸の名前
plt.ylabel("amplitude") # 縦軸の名前
plt.xlim(-np.pi, np.pi) # 横軸の範囲指定
plt.ylim(-1.2,1.2) # 縦軸の範囲指定
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r"$-\pi$", r"$-\frac{\pi}{2}$", "0", r"$\frac{\pi}{2}$", r"$\pi$"]) # 横軸の目盛り設定
plt.yticks([-1, -0.5, 0, 0.5, 1]) # 横軸の目盛り設定
plt.grid() # グリッドを入れる
plt.savefig("sine_and_cosine.png", bbox_inches="tight") # 画像の保存

インスタンスを意識しない方法

次にインスタンスを意識した方法です。殆ど同様なのですが,”set_”が付くことが多いので気をつけて下さい。

fig,ax = plt.subplots()
ax.plot(t, s1, color="magenta", linestyle="solid", label="sin(t)")
ax.plot(t, s2, color="cyan", linestyle="dashed", label="cos(t)")
ax.legend() # 凡例の表示
ax.set_title("sin(t) and cos(t)") # グラフのタイトル
ax.set_xlabel("t [s]") # 横軸の名前
ax.set_ylabel("amplitude") # 縦軸の名前
ax.set_xlim(-np.pi, np.pi) # 横軸の範囲指定
ax.set_ylim(-1.2,1.2) # 縦軸の範囲指定
ax.set_xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r"$-\pi$", r"$-\frac{\pi}{2}$", "0", r"$\frac{\pi}{2}$", r"$\pi$"]) # 横軸の目盛り設定
ax.set_yticks([-1, -0.5, 0, 0.5, 1]) # 横軸の目盛り設定
ax.grid() # グリッドを入れる
fig.savefig("sine_and_cosine.png", bbox_inches="tight") # 画像の保存

ちなみに画像の保存のbbox_inches=”tight”という部分は周りの余白を少なくする命令です。

恐らく何かの資料に貼り付けることを考えると余白はない方が良いと思いますので基本的には書いておいていいかと思います。

まとめ

今回はpythonによるデータの描画方法をmatplotlibの簡単な仕組みを見ながらご紹介しました。

紹介した描画方法以外にもグラフの種類は他にも棒グラフ,円グラフなど多々あって殆どmatplotlibで描画出来ますので是非試してみて下さい。

それではお疲れ様でした!