matplotlibで複数のグラフを順次更新表示するには
こんにちわ、こんばんわ。かえるのクーの助手の「井戸中 聖」です pythonを使って実験結果を表示するにはが良く使われます。リアルタイムとまではいきませんが、結果を随時更新していく方法を確認します。だいたいが、諸先輩の受け売りですが、自分でやってみることが大切だと思っています。
まずは配置デザイン
実験をするとだいたい複数のグラフを同時に表示したくなります。 処理中のイメージなんかも表示したいです。 そんなときは配置デザインを最初に考えることが大切です。 手順です。
4つぐらいのエリアで考えてみましょう
1.グラフのウインドウサイズを決める
横5インチ、縦9インチにしてみます。
2.各グラフの配置、大きさを決める
ax1:イメージを表示する5インチ×5インチの部分
ax2:折れ線グラフを表示する3インチ×3インチの部分
ax3:棒グラフを表示する2インチ×3インチの部分
ax4:なにかコメントを表示する1インチ×5インチの部分、を考えてみます。
3.グリッドをきめる
0.5インチのグリッドにしようと思うので、18行10列にしてみます。
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()
表示はこんな感じです
枠はできました。
次にイメージを出力してみます
このページのもう一つのポイントです。
例として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]すれば、求める画像になります。
イメージ
複数のガボールフィルタセットを表示してみましょう
変換せずにそのまま表示すると下のようになります。
上記の変換すると下のようになります。井戸した表示になりました
ガボールフィルタにしてはいびつですが、実験用のものです。
画像を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はお好みで
配列操作は本当に便利です。
今日の応援
木村王位がんばってください。「わかもの」をコテンパンにやっつけてください。藤井聡太七段の大ファンではありますが、木村王位との対戦だけは木村さんを全力で応援してます。輝け、中高年の星★
(つづく)