5.matplotlibを使いこなそう
Matplotlibを一言で言うのであれば,それはグラフ描画ライブラリです.Numpyをベースとしたライブラリであり,二次元のみならず三次元プロットも可能である優秀なライブラリとして世界中で用いられています.オリジナル版開発者であるJohn Hunter氏が2012年に亡くなったあとも精力的なアップデートが行われていることからもその需要の大きさが分かるでしょう.Matの記述から分かるようにMATLABにあったグラフ描画ライブラリがPythonに移植されたものであり,MATLAB経験者ならば既にある程度理解しているかもしれません.ここでは,Matplotlibを用いた多様なグラフの描画や,オブジェクト志向ライティング,体裁の調整を学んでいきましょう.
5-1.基本的なグラフ描画
まず,Matplotlibを使用する際にはimport matplotlib.pyplot as pltというテンプレがあります.Matplotlib及びNumpyの使用を宣言した上で,以下のコードをインタラクティブモードで実行してみましょう.どうでしょうか?非常に簡単だと思います.
>>> x = np.arange(0,11) #0から10までの整数 >>> y = np.sin(x) #xに対応する正弦 >>> plt.plot(x,y) #折れ線グラフの描画 >>> plt.show( ) #グラフの出力

では,次に先程の折れ線グラフをScatter=散布図にしてみましょう.
>>> x = np.arange(0,11) #0から10までの整数 >>> y = np.sin(x) #xに対応する正弦 >>> plt.scatter(x,y) #散布図の描画 >>> plt.show( ) #グラフの出力

そして,最後はこれらの組み合わせです.
>>> x = np.arange(0,11) #0から10までの整数 >>> y = np.sin(x) #xに対応する正弦 >>> plt.plot(x,y) #折れ線グラフの描画 >>> plt.scatter(x,y) #散布図の追加描画 >>> plt.show( ) #グラフの出力

Matplotlibを使ってグラフを書くのは非常に簡単です.逆に言えばMatplotlibの基本はこれだけなのです.これに追加して体裁を整えて最後はpngやjpgの形で出力させる.ただこれだけのことなのです.
コラム8.リスト内包表記
QiitaなどでPythonの使い方を勉強していると以下のようなコードに出会うことがあります.
>>>a = [ i*5 for i in range (10)] [0, 5, 10, 15, 20, 25, 30, 35, 40, 45]
リストの中に書いた繰り返し計算がこの一行で実行され,一つのリストとして吐き出されています.これをリスト内包表記といいます.リスト内包表記の基本構造は
[contents for variable in iterator]
となっています.先程のi*5が実行内容=conetents,iがvariable,range(10)が繰り返し可能変数=iteratorという構造です.これまで学んできたやり方でリストを作成しようとすると以下のように空のリストに計算結果をappendで追加していくという形になるでしょう.
- A = []
- for i in range (10):
- b = i*5
- A.append(b)
-
リスト内包表記なら先程のようにこれを一行で書くことができます.また,リスト内包表記は条件分岐にも対応しています.
>>> [i for i in range (100) if i%2 == 0] [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98]
ここでは,変数を2で割った際の数値が0である場合をTrueとして偶数をリスト化するという内包表記を実行しています.もう少し発展的な使用方法を見てみましょう.
>>>a = [0,5,3] >>>[i for i in range(10) if i in a] [0,3,5]
これはrange(10)=[0,1,2…9]を順次実行していく中で変数iがリストaの要素として存在すればリスト化するというものです.a=[0,5,3]ですが,出力が[0,3,5]となるのはi=[0,1,2…9]と順次読み込まれるためです.これはnumpyの np.intersect1d(a,range(10),assume_unique = True)と同じものになります.