點擊上方“藍字”關注“AI 開發者”

Matplotlib Animations 數據可視化進階

Matplotlib Animations 數據可視化進階

如果你對我的代碼有興趣,可以在我的 GitHub 查看。當你第一次執行時,代碼會報錯(我一直沒有解決),但是同樣的代碼框再執行一次,就能夠正常跑通了。Matplotlib 是一個專業的數據可視化的 Python 包。除了折線圖、直方圖和熱力圖,Matplotlib HIA 可以實現一些簡單的動畫。如下圖所示,以 John Conway 的遊戲人生,作爲我第一個 Python 動畫的素材。這個 gif 圖的最後結果:Matplotlib Animations 數據可視化進階

遊戲人生

如果你對我如何對遊戲人生進行編程感興趣,可以查看我 GitHub 上面的代碼 (和評論)。這篇博客側重如何在 Python 中使用 Matplotlib 增加動畫。如果對這個模擬過程不熟悉(過程更像模擬而非正在玩遊戲),這裏有一些建議:

  • 我們首先建立一個 N x N 大小的面板 (在我們目前討論的面板中是 50 x 50)。
  • 我們隨機選擇一部分格子進行填充 (首次模擬,我隨機在 2500 個格子裏面填充了 1500 個),這裏的一個格子代表一個單元格
  • 每一個填充的格子的周圍至多有一個格子爲死亡
  • 每一個填充的格子的周圍有至少四個格子不會死亡
  • 每一個填充的格子的周圍有兩到三個格子存活
  • 每一個被三個填充格子相鄰的空格子將會成爲一個新的單元格

開始

我們先引入我們需要的 Python 包,利用 matplotlib 動畫模塊的 FuncAnimation() 函數。

[code]
import timefrom IPython import displayimport matplotlib.pyplot as pltimport matplotlib.animation as animation
[/code]

FuncAnimation() 陸續重複調用函數,是的一個圖片動畫化,每一次調用更新一次圖片。下面將一步步解釋這個過程。
首先,我們先初始化面板。以下幾行代碼將產生輸入數據:

  • 我們想要一個 50x50 大小的面板。
  • 填充變量使計算相鄰單元格變得更容易,通過用總是空的額外單元格填充邊緣,我們使它不需要編寫額外的邏輯來處理板的邊緣。因此,我們的 50x50 板被一個空單元格邊界包圍,使得實際的 numpy 數組的大小爲 52 x52。
  • 變量 initial_cells 代表我們想要初始化的單元格數量,他們會隨機在面板上產生。

[code]
# Input variables for the boardboardsize = 50 # board will be X by X where X = boardsizepad = 2 # padded border, do not change this!initial_cells = 1500 # this number of initial cells will be placed # in randomly generated positions 接下來我們在初始化的單元格上隨機生成 1500 個座標,這些座標保存在變量 pos_list。# Get a list of random coordinates so that we can initialize # board with randomly placed organismspos_list = []for i in range(initial_cells): pos_list.append([random.randint(1, boardsize), random.randint(1, boardsize)])
[/code]
[/code]
[code]
然後輪到實例化這個面板。使用 numpy 向量 my_board 代表我們的面板,我們初始化 52x52 結構的向量,值都是 0 (由於邊緣填充所以比 50x50 大一些),然後調用函數 init_board() 使用 pos_list 中的座標填充面板。具體查看 GitHub。

[code]
# Initialize the boardmy_board = np.zeros((boardsize+pad, boardsize+pad))my_board = init_board(pos_list, my_board)
[/code]

**

**

設置面板的動畫

我們一直在等待的部分——動畫!首先,我們需要做一些例行工作。用下面幾行代碼創建 matplotlib 圖形,它將用於顯示我們的動畫。

[code]
# Required line for plotting the animation%matplotlib notebook# Initialize the plot of the board that will be used for animationfig = plt.gcf()
[/code]

是時候做第一幀了,matplotlib 中的 imshow() 函數接受一個 numpy 矩陣並將其呈現爲圖像,酷~

[code]
# Show first image - which is the initial boardim = plt.imshow(my_board)plt.show()
[/code]

我們傳遞 imshow() 的變量是我們的初始面板,它存儲在 my_board 中。創建的圖像是這樣的:

Matplotlib Animations 數據可視化進階棋盤的初始狀態 (黃色 = 單元格 )

現在我們要加一個輔助函數給 FuncAnimation() 調用。輔助函數 animate() 的輸入是幀數,指明當前是第幾幀。在 FuncAnimation() 中,每過一幀,就會調用一次 animate() 並且把幀數作爲參數輸入。animate() 裏會先調用 update_board() 更新當前的面板,然後通過 set_data() 將更新的面板顯示出來。

[code]
# Helper function that updates the board and returns a new image of# the updated board animate is the function that FuncAnimation callsdef animate(frame): im.set_data(update_board(my_board)) return im,
[/code]

恭喜,現在就可以順利使用 FuncAnimation() 了。注意函數的輸入參數:

  • fig 是我們先前建立的用來顯示動畫的容器變量。
  • animate 函數是剛剛寫的由 FuncAnimation() 通過幀數來調用的函數 (幀數參數會自動傳入,不需要聲明)。
  • frames 是動畫最大幀數的限制,這裏我們設置成 200 幀,也就是說 200 幀後動畫會自動結束。
  • interval 是每兩幀的間隔時間,單位爲毫秒。這裏我們用 50 毫秒。

[code]
# This line creates the animationanim = animation.FuncAnimation(fig, animate, frames=200, interval=50)
[/code]

這樣就完成了,還可以吧?最終效果是這樣的Matplotlib Animations 數據可視化進階

**

**

結論

我希望這對你有幫助。在我結束之前,讓我來集思廣益一些更多的數據科學,比如我們今天學到的動畫功能的應用:

  • 一次次地進行蒙特卡羅模擬,以便觀察結果分佈是如何逐漸形成的。
  • 遍歷時間序列數據,以便描述模型或數據在新觀測數據到達時的反應。
  • 突出顯示你的算法識別的集羣如何隨着輸入 (如集羣數量) 的改變而改變。
  • 關聯隨時間或跨數據的不同子樣本的熱圖,以可視化不同的樣本可能如何影響模型的估計參數。

via:https://github.com/yiuhyuk/game_of_life

Matplotlib Animations 數據可視化進階
--- 資料推薦 ---

Matplotlib Animations 數據可視化進階

Matplotlib Animations 數據可視化進階

Matplotlib Animations 數據可視化進階點擊閱讀原文查看 生成對抗網絡(GAN)

來源鏈接:mp.weixin.qq.com