python入門: 12. matplotlib.pyplotモジュール
pythonでnumpyモジュールの次によく使う有用なモジュールは, matplotlib.pyplotモジュールである。これは図やグラフを描く機能を提供してくれる, 楽しいモジュールである! お約束の短縮名はpltである。つまり,
import matplotlib.pyplot as plt
という呪文でインポートする。matplotlib.pyplotは, たいていnumpyモジュールと組み合わせて使うので, 上の呪文は
import numpy as np
という呪文とセットで打つことが多い。
pythonで散布図を描いてみよう
では, さっそくmatplotlib.pyplotモジュールを使ってみよう。例によって, pythonシェル(ipython3)を立ち上げ, 以下を打とう:
import numpy as np import matplotlib.pyplot as plt x = np.arange(-10,10,0.1) y = x**2 plt.scatter(x, y) plt.show()
すると, 画面にこんなのが出てくる:

なんと! 我々が高校数学でよく見た放物線が出てきたではないか!! 何をやったか説明しよう。最初の2行はモジュールのインポートである。次の
x = np.arange(-10,10,0.1)
は, 「-10以上10未満の数を0.1刻みで順に並べてnumpy.ndarrayインスタンスにせよ」という命令であり, つまり,
x = np.array([-10, -9.9, -9.8, ...(中略)..., 9.8, 9.9])
と同じことである。np.arangeは前回も使ったが, このように刻み幅を小数にすることもできるのだ。
で, 次のy=x**2は, xの各要素を2重にして並べたnumpy.ndarrayインスタンスを作って, それにyという名前をつける。次の
plt.scatter(x, y)
は, matplotlib.pyplotの命令であり, xの各要素をx座標に, yの各要素をy座標にとるような点をグラフにプロットせよ, という意味だ。で, 最後の
plt.show()
は, そうやってできたグラフを画面に表示せよ, という命令だ。
[レポート課題12-1] 上の例で, plt.scatter(x, y)をplt.plot(x, y)に置き換えて実行せよ。何が起きるか?
[レポート課題12-2] 上の例を応用して, 関数y=sin(x)のグラフを描け。
[レポート課題12-3] 上の例を応用して, 半径1の円周上の点を, 15度間隔でグラフにプロットせよ。ヒント: 角をnumpy.ndarrayインスタンスとして並べる。15度はπ/12であることに注意すれば, 角はnp.arange(0, 2*np.pi, np.pi/12)とすればよい。これをnp.cosとnp.sinにそれぞれ入れて, 前者をx, 後者をyとして, あとは同じ!
最初のプログラムを解読しよう
ここまで来たら, python入門: python初経験!で打ったプログラム(あのらせんのグラフを出すやつ)が理解できる:
import numpy as np import matplotlib.pyplot as plt t=np.arange(0,100,0.1) plt.plot(np.cos(t)*np.exp(-t/10), np.sin(t)*np.exp(-t/10)) plt.show()
どうしてらせんのグラフが出たか, 解読してみよう!!
[レポート課題12-4] らせんが中心に落ちていくのをもっとゆるやかにするにはどうすればよいか? 考えてやってみよ。
[レポート課題12-5] 上のプログラムの中程の2行を以下のように修正して走らせてみよ:
t=np.arange(0,100,0.005) plt.plot(np.cos(3*t)*np.exp(-t/30), np.sin(4*t)*np.exp(-t/30))
どういう図が出るか?
[レポート課題12-6] こんな調子で上のプログラム例をいろいろ変えて, もっとカッコよくて変な図形を描いてみよ。
[レポート課題12-7 (オプション)] 以下のプログラムを実行し, 各行が何をしているか考察せよ。なお, これは円錐曲線
r=el/(1 + ecos φ)
を描くものである。
import numpy as np import matplotlib.pyplot as plt emin, emax, de = 0.1, 2, 0.1 l=10 phi=np.arange(-np.pi, np.pi, 0.01) xmin, xmax = -10*l, 2*l ymin, ymax = -5*l, 5*l plt.axis([xmin, xmax, ymin, ymax]) plt.axes().set_aspect('equal') plt.plot(np.array([l, l]), np.array([ymin, ymax])) for e in np.arange(emin, emax, de): r=e*l/(1+e*np.cos(phi)) x, y = r*np.cos(phi), r*np.sin(phi) ind=r>0 plt.plot(x[ind], y[ind]) plt.show()
Keyword(s):
References:[python入門]