matplotlibを用いたグラフ描画
やりたいこと
pythonのライブラリ matplotlibを用いて数値データをグラフ描画する。
pythonのグラフ描画ライブラリの紹介
matplotlibの基本 (オブジェクト(figure/axes/axis)の考え方とグラフ設定方法)
各種グラフ形式の描画方法 (折れ線グラフ/散布図/棒グラフと設定方法)
pythonのグラフ描画ライブラリの紹介
pythonでは多数のグラフ描画ライブラリが利用できる。
ライブラリ名 | リンク | 特徴 |
---|---|---|
matplotlib | リンク | pythonで最も標準的なグラフ描画ライブラリ ネット上の実装事例も多い |
seaborn | リンク | matplotlibの描画を見やすくすることができるライブラリ matplotlibより優れたデータ分析機能を利用できる |
plotly | リンク | Javaスクリプト製可視化ライブラリをpythonに対応させたもの 3D描画がきれいでインタラクティブなグラフ生成が可能 |
altair | リンク | JSON形式のファイルを扱うためのライブラリ 描画処理の記述が簡単でWEB系のデータ描画がしやすい |
今回の記事では最も標準的なライブラリであるmatplotlibの使い方についてまとめる
matplotlibの基本 (オブジェクト(figure/axes/axis)の考え方とグラフ設定方法)
下記サイトの解説が非常に参考になる。
matplotlibではplt関数で描画する方法とsubplotでfigureを生成して各種設定を変更するオブジェクト指向型の描画方法がサポートされている。
このページでは描画設定のやりやすさなどを考慮して。後者のオブジェクト指向型の方法で描画を行う方法について説明する。
matplotlibでは下記画像のように、描画オブジェクトを構造化している。
オブジェクト名 | 内容 | 使用方法 |
---|---|---|
figure | プロット画面全体/ウィンドウ | plt.figure関数で生成し、オブジェクトの各種設定を変更 |
axes | 各グラフの画面 | figureに対してsubplot関数で生成し、、オブジェクトの各種設定を変更 |
axis | グラフのデータ | axesに対してデータ描画関数(plot/scatter等)で生成する (描画調整はaxesへの操作で行う) |
figureとaxesの描画および色や軸説明文を設定する処理は下記のように記述できる
def matplotlib_gui_fig_sub(): #plot関数のテスト fig = plt.figure() #新規フィギュア(Window)の描画 fig.canvas.set_window_title('My title') #Windowタイトルの設定 fig.suptitle("Figure Title") #Figureタイトルの設定 fig.patch.set_facecolor('xkcd:mint green') #Figure背景色の設定 #折れ線グラフの表示 ax = fig.add_subplot(2,2,1) #subplotの追加 (行/列/描画対象インデックス) ax.set_title('First plot') #サブプロットタイトルの表示 ax.set_xlabel('X') #X軸説明文の表示 ax.set_ylabel('Y1') #Y軸説明文の表示 ax.grid(True) #Gridの表示 #散布図の描画例 ax2 = fig.add_subplot(2,2,2) #subplotの追加 (行/列/描画対象インデックス) ax2.set_title('Second plot') #サブプロットタイトルの表示 ax2.set_xlabel('X') #X軸説明文の表示 ax2.set_ylabel('Y2') #Y軸説明文の表示 ax2.legend(loc="upper right") #凡例の表示 (locで表示位置を設定可) ax2.set_facecolor('lightyellow') fig.subplots_adjust(top=0.9) #棒グラフの描画 ax3 = fig.add_subplot(2,2,3) #subplotの追加 (行/列/描画対象インデックス) ax3.set_title('Third plot') #サブプロットタイトルの表示 ax3.set_xlabel('X') #X軸説明文の表示 ax3.set_ylabel('Y3') #Y軸説明文の表示 fig.tight_layout() #subplot表示位置の調整 plt.show()
各種グラフ形式の描画方法 (折れ線グラフ/散布図/棒グラフと設定方法)
上記で設定したaxesに対して描画関数でグラフを追加する。
代表的な描画関数は下記になる。
関数名 | 内容 | 説明 |
---|---|---|
plot | 折れ線グラフ | 入力した点を折れ線で結ぶグラフを描画する |
scatter | 散布図 | 入力した各点をマーカーで表現するグラフを描画する |
bar | 棒グラフ | 入力した点を下から棒状に表すグラフを描画する |
上記を利用して、sin/cos/tanをそれぞれのグラフ形式で表示するサンプルを下記に示す。
#波形データのGUI(Matplotlib) def matplotlib_gui_example(): #sns.set() X = np.linspace(-10, 10, 100) Y1 = np.sin(X) # サインの値を計算する Y2 = np.cos(X) Y3 = np.tan(X) #plot関数のテスト fig = plt.figure() #新規フィギュア(Window)の描画 fig.canvas.set_window_title('My title') #Windowタイトルの設定 fig.suptitle("Figure Title") #Figureタイトルの設定 fig.patch.set_facecolor('xkcd:mint green') #Figure背景色の設定 #折れ線グラフの表示 #https://pythondatascience.plavox.info/matplotlib/%E6%8A%98%E3%82%8C%E7%B7%9A%E3%82%B0%E3%83%A9%E3%83%95 ax = fig.add_subplot(2,2,1) #subplotの追加 (行/列/描画対象インデックス) ax.plot(X,Y1, color='black', linestyle='solid') #サブプロット1の描画 (折れ線グラフ colorは色,linestyleは線のタイプ) ax.plot(X,Y1+0.5, color='black', linestyle='dashed') #サブプロット1の描画 (折れ線グラフ colorは色,linestyleは線のタイプ) ax.plot(X,Y1+1, color='black', linestyle='dashdot') #サブプロット1の描画 (折れ線グラフ colorは色,linestyleは線のタイプ) ax.set_title('First plot') #サブプロットタイトルの表示 ax.set_xlabel('X') #X軸説明文の表示 ax.set_ylabel('Y1(sin)') #Y軸説明文の表示 ax.grid(True) #Gridの表示 #散布図の描画例 #https://pythondatascience.plavox.info/matplotlib/%E6%95%A3%E5%B8%83%E5%9B%B3 ax2 = fig.add_subplot(2,2,2) #subplotの追加 (行/列/描画対象インデックス) ax2.scatter(X,Y2,marker="*",s=5.0,label='Y2(cos)') #散布図1の描画 (sは点の大きさ、labelは凡例用) ax2.scatter(X,Y2+0.5,marker="o",s=10.0,label='Y2(cos)+0.5') #散布図2の描画 (sは点の大きさ、labelは凡例用) ax2.scatter(X,Y2+1,marker=".",s=1.0,label='Y2(cos)+1.0') #散布図3の描画 (sは点の大きさ、labelは凡例用) ax2.set_title('Second plot') #サブプロットタイトルの表示 ax2.set_xlabel('X') #X軸説明文の表示 ax2.set_ylabel('Y2(cos)') #Y軸説明文の表示 ax2.legend(loc="upper right") #凡例の表示 (locで表示位置を設定可) ax2.set_facecolor('lightyellow') fig.tight_layout() #subplot表示位置の調整 fig.subplots_adjust(top=0.9) #棒グラフの描画 ax3 = fig.add_subplot(2,2,3) #subplotの追加 (行/列/描画対象インデックス) ax3.bar(X, Y3,width=0.2) ax3.set_title('Third plot') #サブプロットタイトルの表示 ax3.set_xlabel('X') #X軸説明文の表示 ax3.set_ylabel('Y3(tan)') #Y軸説明文の表示 #データラベルの描画 for indx in range(0,Y3.shape[0],20): print( Y3[indx]) ax3.annotate('{:.2f}'.format(Y3[indx]), xy=(X[indx], Y3[indx])) plt.tight_layout() plt.show()
上記より細かい設定については下記サイトに非常に役立つ解説がされている。
その他、matplotlibについてはプロットをアニメーション描画する機能、3Dプロットなどが便利なので別記事で取り上げる。