クーの自由研究

マスターのかえるのクーは、弟子達の召喚術により新たな依り代を得てⅡ世として復活しました。

実験結果の複数グラフをmatplotlibで表示しよう

matplotlibで複数のグラフを順次更新表示するには

こんにちわ、こんばんわ。かえるのクーの助手の「井戸中 聖」です pythonを使って実験結果を表示するにはが良く使われます。リアルタイムとまではいきませんが、結果を随時更新していく方法を確認します。だいたいが、諸先輩の受け売りですが、自分でやってみることが大切だと思っています。

まずは配置デザイン

実験をするとだいたい複数のグラフを同時に表示したくなります。 処理中のイメージなんかも表示したいです。 そんなときは配置デザインを最初に考えることが大切です。 手順です。

4つぐらいのエリアで考えてみましょう

1.グラフのウインドウサイズを決める

  横5インチ、縦9インチにしてみます。

2.各グラフの配置、大きさを決める

  ax1:イメージを表示する5インチ×5インチの部分

  ax2:折れ線グラフを表示する3インチ×3インチの部分

  ax3:棒グラフを表示する2インチ×3インチの部分

  ax4:なにかコメントを表示する1インチ×5インチの部分、を考えてみます。

3.グリッドをきめる

  0.5インチのグリッドにしようと思うので、18行10列にしてみます。

  f:id:AssistantOfKoo:20200704152045p:plain

4.コーディングしてみます

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

if __name__ == '__main__':
fig = plt.figure(figsize=(5, 9)) #横、縦のインチ指定です
gs = gridspec.GridSpec(17, 9) #縦17,横9のグリッドで 縦18、10のブロックに分割します。
#一度に(1行で)指定することもできますが、調整はベタで書いた方がやりやすです。
ax1 = plt.subplot(gs[0:9, 0:9]) #0.5*10で縦横5インチです。
ax2 = plt.subplot(gs[10:15, 0:5]) #3インチ横3インチ
ax3 = plt.subplot(gs[10:15, 6:9]) #3インチ横2インチ
ax4 = plt.subplot(gs[16:17, 0:9]) #1インチ横5インチ
plt.show()
 

表示はこんな感じです

f:id:AssistantOfKoo:20200704150713p:plain

枠はできました。

次にイメージを出力してみます

このページのもう一つのポイントです。

例として28*28の2次元画像が1次元配列化(1×784)されている400個の配列を一遍に表示してみます。個数からもわかるとおり、MNISTの画像の大きさです。

お題:1次元配列化された2次元画像を順番に縦20、横20並べた画像の配列(2次元配列1個)に変換せよ(画像は複数を個別で表示するより、1つにして表示したほうが断然早いから)

変換例:784×400の配列を20(行)、28×20(列)、28の3次元配列化したあと真ん中、最初、最後の要素順に転置を行い、28×20(行)、28×20(列)の行列にして、上下を反転[::-1]すれば、求める画像になります。

イメージ

複数のガボールフィルタセットを表示してみましょう

変換せずにそのまま表示すると下のようになります。

f:id:AssistantOfKoo:20200704173316p:plain

上記の変換すると下のようになります。井戸した表示になりました

f:id:AssistantOfKoo:20200704183253p:plain

ガボールフィルタにしてはいびつですが、実験用のものです。

画像を20個ずつ縦横にならべていますが、境界があったほうがいいので付けます。

区切りをいれるには指定行列に固定値をinsertすればよいでしょう。

plt.gray()  #色をグレー系表示に設定(ヒートマップとかにしない)
ax1.set_xticks([]) #X軸情報表示なし
ax1.set_yticks([]) #Y軸情報表示なし
data = mk_initfilter()[:-1:] #そのへんにあった、いびつなガボールフィルタ(401,768)
data_a = data.reshape(int(400/20),28*20,28).transpose(1,0,2).reshape(28*20,int(400*28/20))[::-1]
data_b = np.insert(data_a, 28 * np.arange(20)[1::], 0.2, axis=0) #横線を挿入(座標0はとばす)
data_c = np.insert(data_b, 28 * np.arange(20)[1::], 0.2, axis=1) #縦線を挿入(座標0はとばす)
ax1.pcolor(data_a, vmin=0.0, vmax=0.5) #vmin,vmaxはお好みで 

f:id:AssistantOfKoo:20200704183702p:plain

配列操作は本当に便利です。

今日の応援

木村王位がんばってください。「わかもの」をコテンパンにやっつけてください。藤井聡太七段の大ファンではありますが、木村王位との対戦だけは木村さんを全力で応援してます。輝け、中高年の星

(つづく)