<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
我們想製作一個動畫,其中正弦和餘弦函數在螢幕上逐步繪製。首先需要告訴matplotlib我們想要製作一個動畫,然後必須指定想要在每一幀繪製什麼。一個常見的錯誤是重新繪製每一幀的所有內容,這會使整個過程非常緩慢。相反地,只能更新必要的內容,因為我們知道許多內容不會隨著幀的變化而改變。對於折線圖,我們將使用set_data
方法更新繪圖,剩下的工作由matplotlib完成。
注意隨著動畫移動的終點標記。原因是我們在末尾指定了一個標記(markevery=[-1]
),這樣每次我們設定新資料時,標記就會自動更新並隨著動畫移動。參見下圖。
import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation fig = plt.figure(figsize=(7, 2)) ax = plt.subplot() X = np.linspace(-np.pi, np.pi, 256, endpoint=True) C, S = np.cos(X), np.sin(X) (line1,) = ax.plot(X, C, marker="o", markevery=[-1], markeredgecolor="white") (line2,) = ax.plot(X, S, marker="o", markevery=[-1], markeredgecolor="white") def update(frame): line1.set_data(X[:frame], C[:frame]) line2.set_data(X[:frame], S[:frame]) plt.tight_layout() ani = animation.FuncAnimation(fig, update, interval=10)
如果我們現在想要儲存這個動畫,matplotlib可以建立一個mp4檔案,但是選項非常少。一個更好的解決方案是使用外部庫,如FFMpeg,它可以在大多數系統上使用。安裝完成後,我們可以使用專用的FFMpegWriter,如下圖所示:
writer = animation.FFMpegWriter(fps=30) anim = animation.FuncAnimation(fig, update, interval=10, frames=len(X)) anim.save("sine-cosine.mp4", writer=writer, dpi=100)
注意,當我們儲存mp4動畫時,動畫不會立即開始,因為實際上有一個與影片建立相對應的延遲。對於正弦和餘弦,延遲相當短,可以忽略。但對於長且複雜的動畫,這種延遲會變得非常重要,因此有必要跟蹤其進展。因此我們使用tqdm
庫新增一些資訊。
from tqdm.autonotebook import tqdm bar = tqdm(total=len(X)) anim.save("../data/sine-cosine.mp4", writer=writer, dpi=300, progress_callback = lambda i, n: bar.update(1)) bar.close()
[Errno 2] No such file or directory: 'ffmpeg'
如果你在 macOS 上,只需通過 homebrew 安裝它:brew install ffmpeg
x = data['指標'].values rate= data['人口出生率(‰)'] y = rate.values xvals = np.linspace(2002,2021,1000) yinterp = np.interp(xvals,x,y) (line1,) = ax.plot(xvals, yinterp, marker="o", markevery=[-1], markeredgecolor="white") text = ax.text(0.01, 0.95,'text', ha="left", va="top", transform=ax.transAxes, size=25) ax.set_xticks(x) def update(frame): line1.set_data(xvals[:frame], yinterp[:frame]) text.set_text("%d 年人口出生率(‰) " % int(xvals[frame])) return line1, text
# 設定畫布 fig = plt.figure(figsize=(10, 5)) ax = plt.subplot() # 資料準備 X = data['指標'] male, female =data['男性人口(萬人)'], data['女性人口(萬人)'] # 繪製折線圖 (line1,) = ax.plot(X, male, marker="o", markevery=[-1], markeredgecolor="white") (line2,) = ax.plot(X, female, marker="o", markevery=[-1], markeredgecolor="white") # 設定圖形註釋 text = ax.text(0.01, 0.75,'text', ha="left", va="top", transform=ax.transAxes,size=20) text2 = ax.text(X[0],male[0], '', ha="left", va="top") text3 = ax.text(X[0],female[0], '', ha="left", va="top") # 設定座標軸刻度標籤 ax.set_xticks(X) ax.set_yticks([]) # 設定座標軸線格式 ax.spines["top"].set_visible(False) ax.spines["left"].set_visible(False) ax.spines["right"].set_visible(False) # 定義更新函數 def update(frame): line1.set_data(X[:frame+1], male[:frame+1]) line2.set_data(X[:frame+1], female[:frame+1]) text.set_text("%d 人口(萬人)" % X[frame]) text2.set_position((X[frame], male[frame])) text2.set_text(f'男性: {male[frame]}') text3.set_position((X[frame], female[frame])) text3.set_text(f'女性: {female[frame]}') return line1,line2, text # 定義輸出 plt.tight_layout() writer = animation.FFMpegWriter(fps=5) # 執行動畫 anim = animation.FuncAnimation(fig, update, interval=500, frames=len(X)) # 儲存動畫 # 設定進度條 bar = tqdm(total=len(X)) anim.save( "num_people2.mp4", writer=writer, dpi=300, progress_callback=lambda i, n: bar.update(1), ) # 關閉進度條 bar.close()
# 設定雨滴繪圖更新函數 def rain_update(frame): global R, scatter # 資料獲取 R["color"][:, 3] = np.maximum(0, R["color"][:, 3] - 1 / len(R)) R["size"] += 1 / len(R) i = frame % len(R) R["position"][i] = np.random.uniform(0, 1, 2) R["size"][i] = 0 R["color"][i, 3] = 1 # 散點形狀設定 scatter.set_edgecolors(R["color"]) scatter.set_sizes(1000 * R["size"].ravel()) scatter.set_offsets(R["position"]) return (scatter,) # 繪製畫布 fig = plt.figure(figsize=(6, 8), facecolor="white", dpi=300) ax = fig.add_axes([0, 0, 1, 1], frameon=False) # , aspect=1) # 繪製初始化散點圖 scatter = ax.scatter([], [], s=[], linewidth=0.5, edgecolors=[], facecolors="None",cmap='rainbow') # 設定雨滴數量 n = 250 # 為雨滴設定引數值 R = np.zeros( n, dtype=[("position", float, (2,)), ("size", float, (1,)), ("color", float, (4,))]) R["position"] = np.random.uniform(0, 1, (n, 2)) R["size"] = np.linspace(0, 1.5, n).reshape(n, 1) R["color"][:, 3] = np.linspace(0, 1, n) # 設定座標軸格式 ax.set_xlim(0, 1), ax.set_xticks([]) ax.set_ylim(0, 1), ax.set_yticks([]) # 儲存同上
以上就是Python Matplotlib繪製動畫的程式碼詳解的詳細內容,更多關於Python Matplotlib動畫的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45