一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 如何基于Python Matplotlib實現網格動畫

如何基于Python Matplotlib實現網格動畫

2020-07-21 00:36吃著東西不想停 Python

這篇文章主要介紹了如何基于Python Matplotlib實現網格動畫,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

—1—

如果你對本文的代碼感興趣,可以去 Github (文末提供)里查看。第一次運行的時候會報一個錯誤(還沒找到解決辦法),不過只要再運行一次就正常了。

這篇文章雖然不是篇典型的數據科學類文章,不過它涉及到數據科學以及商業智能的應用。PythonMatplotlib 是最常用的圖表繪制以及數據可視化庫。我們對折線圖、柱狀圖以及熱力圖都比較熟悉,但你知道用 Matplotlib 還能做簡單的動畫嗎?

下面就是用 Matplotlib 制作動畫的例子。展示的是 John Conway 的 《The Game of Life》,這是一個 Metis(數據科學夏令營)中的編程挑戰題目,同時給了我一個機會來制作我的第一個 Python 動畫。看看結果的動圖:

如何基于Python Matplotlib實現網格動畫

這篇文章的重點還是主要放在 python 中如何用 Matploylib 制作動畫。

但如果你不太熟悉模擬游戲的話(它更像是可以看的模擬動畫,而非可以玩的游戲),我來給大家介紹一下規則:

  • 一開始先設置一個 N×N 的網格(我的動畫中用的是 50×50 );
  • 接著隨機地向格子中填充“小細胞”(一開始隨機地從 2500 個格子中選取 1500 個進行填充);
  • 如果鄰居小細胞少于等于 1 個,那格子中的小細胞會死掉;
  • 如果鄰居大于等于 4 個的也會死掉;
  • 只有 2 個或 3 個鄰居時可以生存;
  • 空的格子中如果正好有 3 個鄰居,則會長出 1 個新的“小細胞”;

—2—

建立網格

我們首先導入所需的庫。

?
1
2
3
4
import time
from IPython import display
import matplotlib.pyplot as plt
import matplotlib.animation as animation

我們會利用Matploylib 動畫模塊中的 FuncAnimation() 函數。 FuncAnimation()是通過多次調用一個函數并逐次更新圖片來實現讓圖片動起來的。我們來一步步地實現這個過程。

但首先,我們需要先初始化我們的網格。下面的幾行代碼用來存儲我們輸入的數據:

  • 我們需要一個 50×50 大小的網格;
  • pad 變量可以使得計算鄰居變得更容易。通過在邊界外添加一層空白格子,我們就不需要額外再寫一個邏輯來處理網格的邊界。因此我們 50×50 的網格其實是被一圈空白格子包圍著,這使得實際的 numpy 序列的大小為 52×52;
  • initial_cels 變量表示在網格啟動的時候我們想要多少“小細胞”。他們會被隨機地分布在網格上。
?
1
2
3
4
5
# 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

接下來我們隨機地生成一系列“小細胞”的初始坐標(上面我們選擇了 1500 個)。把這些坐標存儲在 pos_list 變量中。

?
1
2
3
4
5
6
# 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)])

然后我們是時候該初始化網格了。我們會用一組叫 my_board 的 numpy 序列來代表我們的網格——我們先生成一個 52×52 數值為 0 的矩陣序列作為開始(比 50×50 大是由于增加了空白邊緣),然后調用 init_board() 函數來根據 pos_list 中的坐標把“小細胞”填充到網格中。輔助函數的具體細節我不再展開講了,不過我把他們都整理到我的 Github 上了。

?
1
2
3
# Initialize the board
my_board = np.zeros((boardsize+pad, boardsize+pad))
my_board = init_board(pos_list, my_board)

—3—

制作網格動畫

這是我們最期待的部分——動畫!首先,我們需要完善一些配置。下面的幾行代碼用來生成展示我們動畫的 mtplotlib 圖框。

?
1
2
3
4
# 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() 函數可以接收一組 numpy 矩陣然后返回一張圖片。很酷吧!

?
1
2
3
# Show first image - which is the initial board
im = plt.imshow(my_board)
plt.show()

傳入 imshow() 的變量是我們的初始的網格 my_board。生成的圖片長這樣:

如何基于Python Matplotlib實現網格動畫

現在我們需要寫一個可以給 FuncAnimation() 調用的輔助函數。 animate() 函數接受一幀畫面作為輸入充當計數器。這個畫面計數器就是 FuncAnimation() 和 animate() 函數溝通的橋梁——在每一個時間點(也就是每一幀),它都會調用一次 animate()。然后 animate() 會逐次使用輔助函數 update_board() 來對網格進行迭代。最后, set_data() 函數將圖片更新為迭代后的網格,這就完成了。

?
1
2
3
4
5
# 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,

一切順利!我們準備調用 FuncAnimation() 函數了。注意輸入的參數:

  • fig 是我們在前面創建的用來裝載我們的動畫的圖形變量;
  • animate 是 FuncAnimation() 用畫面計數器進行溝通的函數(自動傳入,不需要特別聲明)
  • frames 表示我們希望動畫持續多少幀,在這里我們想要動畫的長度為 200 幀;
  • interval 表示每一幀之間間隔的毫秒數。我們想要每幀之間間隔 50 毫秒。
?
1
2
3
# This line creates the animation
anim = animation.FuncAnimation(fig, animate, frames=200,
                interval=50)

就這么簡單!不是很難吧?為了慶祝我們成功制作動畫,我再送大家一個動畫:

如何基于Python Matplotlib實現網格動畫

—4—

總結

希望這篇文章能幫到大家。在結束之前,讓我來幫助大家腦補更多我們今天學到的動畫功能在數據科學上的應用:

  • 一個個地畫出蒙特卡洛模擬數據,你能觀察到最終的分布是如何逐步形成的;
  • 按順序遍歷時間序列數據,可以描繪你的模型或數據在新的觀察角度下有什么表現;
  • 當你改變輸入參數時,比如族群數,可以展現你的算法是如何劃分族群的;
  • 根據時間或不同的數據子集生成關聯熱力圖,用于觀察不同的樣本是如何影響你的模型的預期參數的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://www.cnblogs.com/zwhy8/p/13324456.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 美女全身体光羞羞漫画 | 久久综合老色鬼网站 | 国产成人啪精品午夜在线播放 | 青春娱乐国产分类精品二 | 亚洲六月丁香婷婷综合 | 校园肉文高h| 动漫女性扒开尿口羞羞漫画 | 特黄级| 国产激情一区二区三区成人91 | 人阁色第四影院在线观看 | 人妖巨茎video | 欧洲男同直粗无套播放视频 | 涩色网| 丰满大屁股美女一级毛片 | 亚洲欧美日韩精品高清 | 久久不射电影网 | 亚洲AV无码国产精品色午夜情 | 毛片免费网站 | 日本免费观看95视频网站 | 欧美专区在线播放 | japanesen女同 | 91麻豆国产| 黑人破中国女人处 | 大学生宿舍飞机 free | 窝窝影院午夜色在线视频 | 精品久久久噜噜噜久久7 | 女生被草| 久久艹综合 | 精品精品国产自在久久高清 | 免费观看视频在线播放 | 91九色视频无限观看免费 | 精品视频手机在线观看免费 | 青草香蕉精品视频在线观看 | 动漫美女胸被狂揉扒开吃奶动态图 | 外国a级片 | ady成人映画网站官网 | 麻豆天美精东果冻传媒在线 | 满溢游泳池免费土豪全集下拉版 | 日本成熟| 免费一级毛片在线播放 | 精品国产麻豆免费人成网站 |