您好,登錄后才能下訂單哦!
這篇文章主要講解了Python Matplotlib實現(xiàn)網(wǎng)格動畫的方法,內(nèi)容清晰明了,對此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會有幫助。
—1—
如果你對本文的代碼感興趣,可以去 Github (文末提供)里查看。第一次運行的時候會報一個錯誤(還沒找到解決辦法),不過只要再運行一次就正常了。
這篇文章雖然不是篇典型的數(shù)據(jù)科學(xué)類文章,不過它涉及到數(shù)據(jù)科學(xué)以及商業(yè)智能的應(yīng)用。Python 的 Matplotlib 是最常用的圖表繪制以及數(shù)據(jù)可視化庫。我們對折線圖、柱狀圖以及熱力圖都比較熟悉,但你知道用 Matplotlib 還能做簡單的動畫嗎?
下面就是用 Matplotlib 制作動畫的例子。展示的是 John Conway 的 《The Game of Life》,這是一個 Metis(數(shù)據(jù)科學(xué)夏令營)中的編程挑戰(zhàn)題目,同時給了我一個機會來制作我的第一個 Python 動畫。看看結(jié)果的動圖:
這篇文章的重點還是主要放在 python 中如何用 Matploylib 制作動畫。
但如果你不太熟悉模擬游戲的話(它更像是可以看的模擬動畫,而非可以玩的游戲),我來給大家介紹一下規(guī)則:
—2—
建立網(wǎng)格
我們首先導(dǎo)入所需的庫。
import time from IPython import display import matplotlib.pyplot as plt import matplotlib.animation as animation
我們會利用Matploylib 動畫模塊中的 FuncAnimation() 函數(shù)。 FuncAnimation()是通過多次調(diào)用一個函數(shù)并逐次更新圖片來實現(xiàn)讓圖片動起來的。我們來一步步地實現(xiàn)這個過程。
但首先,我們需要先初始化我們的網(wǎng)格。下面的幾行代碼用來存儲我們輸入的數(shù)據(jù):
# Input variables for the board boardsize = 50 # board will be X by X where X = boardsize pad = 2 # padded border, do not change this! initial_cells = 1500 # this number of initial cells will be placed # in randomly generated positions
接下來我們隨機地生成一系列“小細(xì)胞”的初始坐標(biāo)(上面我們選擇了 1500 個)。把這些坐標(biāo)存儲在 pos_list 變量中。
# Get a list of random coordinates so that we can initialize # board with randomly placed organisms pos_list = [] for i in range(initial_cells): pos_list.append([random.randint(1, boardsize), random.randint(1, boardsize)])
然后我們是時候該初始化網(wǎng)格了。我們會用一組叫 my_board 的 numpy 序列來代表我們的網(wǎng)格——我們先生成一個 52×52 數(shù)值為 0 的矩陣序列作為開始(比 50×50 大是由于增加了空白邊緣),然后調(diào)用 init_board() 函數(shù)來根據(jù) pos_list 中的坐標(biāo)把“小細(xì)胞”填充到網(wǎng)格中。輔助函數(shù)的具體細(xì)節(jié)我不再展開講了,不過我把他們都整理到我的 Github 上了。
# Initialize the board my_board = np.zeros((boardsize+pad, boardsize+pad)) my_board = init_board(pos_list, my_board)
—3—
制作網(wǎng)格動畫
這是我們最期待的部分——動畫!首先,我們需要完善一些配置。下面的幾行代碼用來生成展示我們動畫的 mtplotlib 圖框。
# Required line for plotting the animation %matplotlib notebook # Initialize the plot of the board that will be used for animation fig = plt.gcf()
接下來制作我們的第一幀。 mtplotlib 中的 imshow() 函數(shù)可以接收一組 numpy 矩陣然后返回一張圖片。很酷吧!
# Show first image - which is the initial board im = plt.imshow(my_board) plt.show()
傳入 imshow() 的變量是我們的初始的網(wǎng)格 my_board。生成的圖片長這樣:
現(xiàn)在我們需要寫一個可以給 FuncAnimation() 調(diào)用的輔助函數(shù)。 animate() 函數(shù)接受一幀畫面作為輸入充當(dāng)計數(shù)器。這個畫面計數(shù)器就是 FuncAnimation() 和 animate() 函數(shù)溝通的橋梁——在每一個時間點(也就是每一幀),它都會調(diào)用一次 animate()。然后 animate() 會逐次使用輔助函數(shù) update_board() 來對網(wǎng)格進行迭代。最后, set_data() 函數(shù)將圖片更新為迭代后的網(wǎng)格,這就完成了。
# Helper function that updates the board and returns a new image of # the updated board animate is the function that FuncAnimation calls def animate(frame): im.set_data(update_board(my_board)) return im,
一切順利!我們準(zhǔn)備調(diào)用 FuncAnimation() 函數(shù)了。注意輸入的參數(shù):
# This line creates the animation anim = animation.FuncAnimation(fig, animate, frames=200, interval=50)
就這么簡單!不是很難吧?為了慶祝我們成功制作動畫,我再送大家一個動畫:
—4—
總結(jié)
希望這篇文章能幫到大家。在結(jié)束之前,讓我來幫助大家腦補更多我們今天學(xué)到的動畫功能在數(shù)據(jù)科學(xué)上的應(yīng)用:
看完上述內(nèi)容,是不是對Python Matplotlib實現(xiàn)網(wǎng)格動畫的方法有進一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。