【matplotlib基礎】--動畫

来源:https://www.cnblogs.com/wang_yb/archive/2023/09/21/17719014.html
-Advertisement-
Play Games

matplotlib的動畫一直是一個強大但使用頻率不高的功能,究其原因,一方面展示動畫需要一定的媒介,沒有圖形和文字展示方便;二來大家更關心的是分析結果的最終圖表,圖表的動態展示則沒有那麼重要。 不過,隨著短視頻的興起,在短視頻平臺上展示動畫變得非常容易,所以,我們發現有越來越多的數據分析動畫(比如 ...


matplotlib動畫一直是一個強大但使用頻率不高的功能,究其原因,
一方面展示動畫需要一定的媒介,沒有圖形和文字展示方便;
二來大家更關心的是分析結果的最終圖表,圖表的動態展示則沒有那麼重要。

不過,隨著短視頻的興起,在短視頻平臺上展示動畫變得非常容易,
所以,我們發現有越來越多的數據分析動畫(比如各種橫向條形圖的排名等等)出現在了短視頻平臺上。

通過動畫來展示數據和模型的變化過程,可使數據的可視化更加生動形象,
隨著各種平臺的興起,matplotlib的動畫功能也因此有了更多的用武之地。

1. 動畫示例

介紹matplotlib的動畫功能之前,先看用matplotlib製作的兩個簡單的的動畫示例。

1.1. 單個動畫

首先是單個動畫,繪製一個正弦曲線。

import numpy as np

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.animation as animation

x = np.linspace(-8, 8, 100)
y = np.sin(x)

fig, ax = plt.subplots()
(g,) = ax.plot(x, y)


def update(frame):
    y = np.sin(x[:frame])
    g.set_data(x[:frame], y)


animation.FuncAnimation(fig, update, interval=50, frames=len(x))

11.gif

1.2. 組合動畫

除了單個動畫之外,組合動畫也簡單,下麵的示例中,
先繪製一個正弦曲線,然後一個點沿著曲線運動,隨著這個點,繪製正弦曲線的切線。

x = np.linspace(-8, 8, 100)
f = lambda x: np.sin(x / 2)

fig, ax = plt.subplots()
fig.set_size_inches(8, 4)
ax.plot(x, f(x), 'lightblue')

(point,) = ax.plot(x[0], f(x[0]), "r", alpha=0.4, marker="o")
(line,) = ax.plot([0], [0], "g", linewidth=3)

#繪製切線
def tangent_line(x0, y0):
    h = 1e-4
    num_min = f(x0 - h)
    num_max = f(x0 + h)
    k = (num_max - num_min) / (2 * h)

    xs = np.linspace(x0 - 0.5, x0 + 0.5, 100)
    ys = y0 + k * (xs - x0)
    return xs, ys

#移動切點
def move_point(frame):
    point.set_data([x[frame]], [f(x[frame])])

    xs, ys = tangent_line(x[frame], f(x[frame]))
    line.set_data(xs, ys)


animation.FuncAnimation(fig, move_point, interval=50, frames=len(x))

11-3.gif

2. 動畫函數

matplotlib的動畫函數主要有兩種,它們的動畫原理差別很大,
瞭解它們之間的區別,才能根據自己的場景選擇合適的動畫函數。

2.1. FuncAnimation

上一節的示例中使用的就是FuncAnimation,它的動畫原理是通過回調函數,不斷重繪圖形,已達到動畫的效果。
主要的參數有:

  1. 畫布:比如上面第一個示例中的 fig
  2. 回調函數:比如上面第一個示例中的 update
  3. 調用回調函數的間隔:比如上面第一個示例中的 interval=50,單位是毫秒
  4. 調用回調函數的次數:比如上面第一個示例中的 frames=len(x)

簡單來說,也就是FuncAnimation函數每隔interval毫秒,調用一次update,一共調用frames次。``

2.2. ArtistAnimation

ArtistAnimation函數的原理則是先準備好每一幀的數據,然後繪製按照一定的時間間隔,
繪製每一幀數據對應的圖像。
比如上面的示例一樣的正弦曲線,用ArtistAnimation函數繪製的話:

points = np.linspace(-8, 8, 100)

fig, ax = plt.subplots()

frames = []
for i in range(50):
    x = points[:i]
    y = np.sin(x)
    g = ax.plot(x, y)
    frames.append(g)

animation.ArtistAnimation(fig, frames, interval=50)

11-2.gif

ArtistAnimation的主要參數:

  1. 畫布:比如上面示例中的 fig
  2. 每一幀的數據:比如上面示例中的 frames
  3. 每一幀的間隔:比如上面示例中的 interval=50,單位是毫秒

ArtistAnimation沒有回調函數,只要準備好每一幀的數據,它會按照時間間隔繪製每一幀的數據。

3. 動畫導出

最後,是動畫的導出,常用的兩種格式是MP4GIF
如果安裝了 ffmpeg,那麼導出這兩種格式就很簡單了。

3.1. 導出mp4

#前面部分省略。。。
anim = animation.FuncAnimation(fig, update, interval=50, frames=len(x))
anim.save("./output.mp4", writer='ffmpeg')

導出的文件名尾碼 mp4,則可以導出視頻。
這裡的writer參數用ffmpeg

3.2. 導出GIF

同樣,導出gif也一樣,文件名的尾碼 gif即可。

#前面部分省略。。。
anim = animation.FuncAnimation(fig, update, interval=50, frames=len(x))
anim.save("./output.gif", writer='ffmpeg')

當然,也可以不用ffmpeg,比如,如果安裝了imagemagick,這裡的writer也可以用imagemagick

#前面部分省略。。。
anim = animation.FuncAnimation(fig, update, interval=50, frames=len(x))
anim.save("./output.gif", writer='imagemagick')

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 內置數據類型 在編程中,數據類型是一個重要的概念。 變數可以存儲不同類型的數據,不同類型可以執行不同的操作。 Python預設內置了以下這些數據類型,分為以下幾類: 文本類型:str 數值類型:int、float、complex 序列類型:list、tuple、range 映射類型:dict 集合類 ...
  • 目錄前言介紹照片:後續: 前言 V~~~V。 介紹 進程間通訊(Inter-Process Communication,IPC)是操作系統中的一個重要概念,用於不同進程之間的數據傳輸和交互。有多種方式可以實現進程間通訊,以下是其中一些常見的方式: 管道(Pipe):管道是一種單向通信方式,通常用於具 ...
  • 等待事件或等待其他條件 坐車案例 想象一種情況:假設晚上坐車外出,如何才能確保不坐過站又能使自己最輕鬆? 方法一:不睡覺,時刻關註自己的位置 1 #include <iostream> 2 #include <thread> 3 #include <mutex> 4 using namespace ...
  • 基於java線上心理健康咨詢系統設計與實現,可適用於基於java心理健康,java心理咨詢室系統,大學生心理健康,心理健康系統,大學生心理評測管理系統,心理健康平臺系統,校園心理健康評測平臺,校園健康咨詢,校園心理健康咨詢,java心理咨詢室,校園心理咨詢室。 ...
  • Record Patterns 第一次發佈預覽是在JDK 19、隨後又在JDK 20中進行了完善。現在,Java 21開始正式推出該特性優化。下麵我們通過一個例子來理解這個新特性。 record Point(int x, int y) {} static void printSum(Object o ...
  • 基於java酒店客房管理系統設計與實現,可適用於java酒店管理系統,客房系統,酒店客房系統,酒店保潔系統,酒店打掃系統,酒店客房系統,客房酒店管理系統,酒店房間系統,酒店房間管理系統,酒店房間打掃,酒店房間保潔系統,房間酒店系統,賓館客房系統等等; ...
  • 目錄一、爬取目標二、爬取結果三、代碼講解四、技術總結五、演示視頻六、附完整源碼 一、爬取目標 您好!我是@馬哥python說,一名10年程式猿。 今天分享一期爬蟲案例,爬取的目標是:今日頭條熱榜的榜單數據。 打開今日頭條 首頁,在頁面右側會看到頭條熱榜,如下: 爬取以上6個關鍵欄位,含: 熱榜排名, ...
  • Sunday 演算法是一種字元串搜索演算法,由`Daniel M.Sunday`於1990年開發,該演算法用於在較長的字元串中查找子字元串的位置。演算法通過將要搜索的模式的字元與要搜索的字元串的字元進行比較,從模式的最左側位置開始。如果發現不匹配,則演算法將模式向右`滑動`一定數量的位置。這個數字是由當前文本... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...