techno_memo

個人用の技術メモ。python・ROS・AI系のソフトウェア・ツールなどの情報を記載

matplotlibを用いたグラフ描画

やりたいこと

 pythonのライブラリ matplotlibを用いて数値データをグラフ描画する。

  • pythonのグラフ描画ライブラリの紹介

  • matplotlibの基本 (オブジェクト(figure/axes/axis)の考え方とグラフ設定方法)

  • 各種グラフ形式の描画方法 (折れ線グラフ/散布図/棒グラフと設定方法)

f:id:sd08419ttic:20190324134031p:plain

pythonのグラフ描画ライブラリの紹介

pythonでは多数のグラフ描画ライブラリが利用できる。

www.st-hakky-blog.com

ライブラリ名 リンク 特徴
matplotlib リンク pythonで最も標準的なグラフ描画ライブラリ
ネット上の実装事例も多い
seaborn リンク matplotlibの描画を見やすくすることができるライブラリ
matplotlibより優れたデータ分析機能を利用できる
plotly リンク Javaスクリプト製可視化ライブラリをpythonに対応させたもの
3D描画がきれいでインタラクティブなグラフ生成が可能
altair リンク JSON形式のファイルを扱うためのライブラリ
描画処理の記述が簡単でWEB系のデータ描画がしやすい

今回の記事では最も標準的なライブラリであるmatplotlibの使い方についてまとめる

matplotlibの基本 (オブジェクト(figure/axes/axis)の考え方とグラフ設定方法)

下記サイトの解説が非常に参考になる。

qiita.com

matplotlibではplt関数で描画する方法とsubplotでfigureを生成して各種設定を変更するオブジェクト指向型の描画方法がサポートされている。

このページでは描画設定のやりやすさなどを考慮して。後者のオブジェクト指向型の方法で描画を行う方法について説明する。

matplotlibでは下記画像のように、描画オブジェクトを構造化している。

f:id:sd08419ttic:20190324135639j:plain

オブジェクト名 内容 使用方法
figure プロット画面全体/ウィンドウ plt.figure関数で生成し、オブジェクトの各種設定を変更
axes 各グラフの画面 figureに対してsubplot関数で生成し、、オブジェクトの各種設定を変更
axis グラフのデータ axesに対してデータ描画関数(plot/scatter等)で生成する
(描画調整はaxesへの操作で行う)

figureとaxesの描画および色や軸説明文を設定する処理は下記のように記述できる

f:id:sd08419ttic:20190325211612p:plain

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 棒グラフ 入力した点を下から棒状に表すグラフを描画する

f:id:sd08419ttic:20190325213423p:plain

上記を利用して、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()

ソースコード

github.com

上記より細かい設定については下記サイトに非常に役立つ解説がされている。

qiita.com

その他、matplotlibについてはプロットをアニメーション描画する機能、3Dプロットなどが便利なので別記事で取り上げる。