公開日: 最終更新日:

【Python】Matplotlibで複数のグラフを一枚の画像で表示

環境

  • Jupyter Notebook 5.7.1
  • matplotlib 2.2.2

 

導入

 

研究で進化シミュレーションをしようと思い、ある適応度に関係するパラメーターの進化を見るモデルを用意した。

そこでそのパラメータ5つに対してそれぞれ実験を行い、100世代ごとの分布の中央値を得た。それらをmatplotlibで折れ線グラフで描画させていたが、Jupyter notebookでいちいちplot.show()を使っているとグラフの数が多くなるに連れてページもどんどん縦に長くなっていってしまう。

それが嫌だったので一行に2つのグラフを表示するように設定した。

 

コード

 

# グラフ設定
    x = []
    title = ["hoge1", "hoge2", "hoge3", "hoge4", "hoge5", "population size"]
    
    for i in range(int(iteration / 100)):
        a = 99
        x.append(a+(i*100))
    
    rows_count = 3 # 行
    columns_count = 2 # 列
    graphs_count = rows_count * columns_count # グラフの数
    axes = []
    fig = plt.figure(figsize=(18,18))
    
    for i in range(graphs_count):
        axes.append(fig.add_subplot(rows_count, columns_count, i+1)) # i番目追加
        plt.title(title[i])
        for j in range(num):
            axes[i].plot(x, summarize[j][i], label='Population' + str(j+1))
            plt.xlabel("Generations")
            plt.grid(True)

    fig.subplots_adjust(wspace=0.1, hspace=0.2) # グラフ間の隙間調整
    plt.show()              # グラフを表示

(参考:Matplotlibで複数のグラフを並べて描く方法)

6つグラフを表示し、1~5はhogeXで6つ目はPopulationである。

summarize配列は2次元配列で、iは集団、jは各パラメータの中央値が入っている。これをy軸に取っている。

 

 

100世代ごとの目盛をxに入れてある。これだけ見るとnp.arangeでいいじゃないかって思うかもしれないが、実際そうである。numpyを使うならば

print(np.arange(99,1000,100,dtype = 'int'))

となる。

 

グラフの間隔はいろいろ試したが、このようなタイトル、軸ラベルの配置だとこの間隔がちょうどいい感じである。

 

出力結果

 

このように一枚の画像に6つのグラフが表示される。

Jupyter notebookは右クリックから普通に画像を保存できる。

 

レジェンドもつけようと思ったが、どうやらこのmatplotlibの複数のグラフの色は変数iによって一意的にきまっているようである。同じ色なら同じ集団のプロットである。つけなくていいや(よくない)。

 

こうしてみると何か大きなことをやった感があるが全然モデルがうまくいっていない。

何も進捗が出ていないのである。

つらい。