Matplotlib重疊不同Y軸規模的資料

前些日子在做深度學習的課堂專題時,希望能把訓練中的神經網路所玩遊戲走的步數記錄下來

輸出成圖表,好以觀察神經網路是否有乖乖照我們的設計去學習

不難,用python的matplotlib一下就做出來了

圖雖然是出來了,但因為有兩萬多筆訓練時玩遊戲走的步數,折線圖整個擠成一團

只能免強看到有點在上升的趨勢

而且有時候運氣好走比較多步才死,有時候第一、二步就死了

為了解決折線圖整個擠成一團,以及運氣成分讓折線圖忽高忽低,我決定把每250筆資料平均一次

如此資料量就縮小許多

平均後的結果相對沒那麼擠,而且也可以看得出逐漸上升的波動

 
現在,我想將兩張圖合併再一起

如果用以往的方法直接plot會發現平均後的結果被壓在圖的下半部

這是因為兩張圖的Y軸範圍不一樣所造成的

於是,我希望使用雙Y軸的方式保留原本圖表的比例,讓兩張圖看起來像是直接疊起來的

 
在matplotlib中要做雙Y軸,的確就是使用兩個subplot然後疊加

我們先製作出第一個subplot,然後把圖表的標題、X軸都設定好,再複製出第二個subplot

fig, ax1 = plt.subplots()
plt.title('Numbers of blocks NN opened per Game')
plt.xlabel('Game')
ax2 = ax1.twinx()

現在來設定第一個subplot,給定顏色、Y軸等等的

ax1.set_ylabel('Opened Blocks', color='tab:blue')
ax1.plot(range(len(data)), data, color='tab:blue', alpha=0.75)
ax1.tick_params(axis='y', labelcolor='tab:blue')

換第二個subplot

ax2.set_ylabel('Opened Blocks (Avg of 250 Games)', color='black')
ax2.plot([ 250 * (i + 1) for i in range(len(data_avg))], data_avg, color='black', alpha=1)
ax2.tick_params(axis='y', labelcolor='black')

都好了之後就可以把圖輸出了

fig.tight_layout()
plt.show()

效果果真如我們預期呢


發佈留言