どうもこんにちは。
今でもExcelで綺麗なグラフを作ることが苦手なコンです。(2回目)
今回はmatplotlibでグラフを描画していきたいと思います。
このmatplotlibはPythonのライブラリのひとつで、グラフを綺麗に書くことができます。
とてもメジャーなライブラリの1つで、書き方も簡単な方なので
公式ページだけなく、色々なサイトで日本語でも解説や参考コードが載っていたりします。
そこで、前回はせっかくClassについて学んだので
今回はインスタンスやメソッドの目線をもちつつ、matplotlibのコードを書いていきたいと思います。
matplotlibの書き方
初心者の方には突然すぎる内容になるのですが、
matplotlibにはグラフを作る際の2つのコードの書き方があります。
それが「plt.plot」
と「ax.plot」
による記述です。
公式ドキュメントを含めてネット上に無数にあるmatplotlibのコードにはこの二つが混在していますが、
plt.plotは簡単に書くことができるようになると思うので、ax.plotの
書き方を最終的には覚えていくことを目標にしましょう(^_^)
「plt.plot」でシンプルに描画することだけを目的に記述
以下のコードに示すように、1つのグラフに対して1つずつ設定をしていくコードの書き方になります。
とりあえずグラフを書くだけならこれだけで大丈夫です。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
#x-axis ranges from -5 and 5 with .001 steps
x = np.arange(-5, 5, 0.001)
#define multiple normal distributions
plt.plot(x, norm.pdf(x, 0, 1), label='μ: 0, σ: 1')
plt.plot(x, norm.pdf(x, 0, 1.5), label='μ:0, σ: 1.5')
plt.plot(x, norm.pdf(x, 0, 2), label='μ:0, σ: 2')
#add legend to plot
plt.legend(title='Parameters')
#add axes labels and a title
plt.ylabel('y')
plt.xlabel('x')
plt.title('Normal Distributions', fontsize=14)
plt.show()
plt.close()
上の結果を実行した結果が以下のグラフになります。
インスタンスを明言して「ax.plot」を使ってプロットする
matplotlibの書き方を調べていると
インスタンスを明言してプロットするスタイルで書かれている情報が多くあります。
ただPythonのClassの書き方のインスタンスやメソッドについて理解していると、すぐにmatplotlibの扱いにも慣れると思います。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
#横軸方向のデータを-5から5まで001刻みで作成
x = np.arange(-5, 5, 0.001)
#figのインスタンスを作成
fig = plt.figure()
#ax1のインスタンスを作成
ax1 = fig.add_subplot(111)
#ax1のメソッドを実行
#norm.pdfは正規分布を出力している
ax1.plot(x, norm.pdf(x, 0, 1), label='μ: 0, σ: 1')
ax1.plot(x, norm.pdf(x, 0, 1.5), label='μ:0, σ: 1.5')
ax1.plot(x, norm.pdf(x, 0, 2), label='μ:0, σ: 2')
#メソッドでタイトルやラベルづけを実行
ax1.legend(title='Parameters')
ax1.set_ylabel('y')
ax1.set_xlabel('x')
ax1.set_title('Normal Distributions', fontsize=14)
plt.show()
plt.close()
この書き方でもインスタンスを記述しないものと同じ結果を得ることができます。
上記コードではまずfigというインスタンスを作成しています。そして次にfigを使ってax1のインスタンスを作成しています。
インスタンスを利用しない書き方に比べ、記述量が多くなっており、必要なのか疑問に感じる方も
多いかも知れませんが、以下のように複数グラフをプロットし、それぞれのグラフを別々に設定する場合に書きやすくなります。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm, t
#横軸方向のデータを-5から5まで001刻みで作成
x = np.arange(-5, 5, 0.001)
#figのインスタンスを作成
fig = plt.figure()
#ax1のインスタンスを作成
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)
#ax1のメソッドを実行
#norm.pdfは正規分布を出力している
ax1.plot(x, norm.pdf(x, 0, 1), label='μ: 0, σ: 1')
ax1.plot(x, norm.pdf(x, 0, 1.5), label='μ:0, σ: 1.5')
ax1.plot(x, norm.pdf(x, 0, 2), label='μ:0, σ: 2')
ax1.legend(title='Parameters')
ax1.set_ylabel('y')
ax1.set_xlabel('x')
ax1.set_title('Normal Distributions', fontsize=10)
#ax2のメソッドを実行
#norm.pdfはベータ布を出力している
ax2.plot(x, norm.pdf(x, 0, 1), label='μ: 0, σ: 1')
ax2.plot(x, t.pdf(x, 1), label='t : 1')
ax2.plot(x, t.pdf(x, 3), label='t : 3')
ax2.legend(title='Parameters')
ax2.set_ylabel('y')
ax2.set_xlabel('x')
ax2.set_title('Student Distributions', fontsize=10)
plt.show()
plt.close()
インスタンスを使うメリット
これまでに、「plt.plotでゴリゴリ記述する方法」と「fig、axを使うオブジェクト指向的な記述をする方法」の2つを紹介させてもらいました。
matplotlibの公式のチュートリアルを確認すると「plt.plotでゴリゴリ記述する方法」で確かに綺麗なグラフを描画できています。
しかし、matplotlibの描画を上手くなるためには、「fig、axを使うオブジェクト指向的な記述をする方法」で書けるようになることが必要不可欠です。
例えばのチャートページには以下のようにまとめてくれていますが、細かな調整・多様な描画の書き方はオブジェクト指向の書き方によって紹介されています。
matplotlibの公式ドキュメントも多くはオブジェクト指向の書き方での紹介をしている内容が多いです。
なのである程度の段階までpyplotで図を作っても、いざ細かい調整をしようとすると、結局オブジェクト指向のやり方に従うことになります。人に見せたり、提出書類に記載する図は微調整したい部分がでてくる場合も多いので、早いうちからオブジェクト指向の書き方に慣れたほうが良いです。
最初は難しいかもしれませんが頑張っていきましょう!!
おわりに
このページではmatplotlibの基本の書き方を説明させていただきました。
Classの基本の部分を理解しないと、なかなか記述が難しいので大変なので
私もPythonを始めたころは、よく分かっている先輩に教えてもらいながらコーディングをしたことをよく覚えております。
このページが皆様のmatplotlibについてちょっとでも理解できるきっかけになれば幸いです。
ここまで読んでいただき誠にありがとうございました。