摘要:相對于靜態圖表,人類總是容易被動畫和交互式圖表所吸引。可以使用輕松生成圖表直方圖功率譜,條形圖,錯誤圖表,散點圖等。然而,也有一些方面落后于同類的庫。動畫使用一組固定的對象。稍后將用數據對行對象進行填充。現在用將它們轉換為動畫。
翻譯:瘋狂的技術宅
https://towardsdatascience.co...
更多文章請關注微信公眾號:硬核智能
動畫是一種展示現象的有趣方式。相對于靜態圖表,人類總是容易被動畫和交互式圖表所吸引。在描述多年來的股票價格、過去十年的氣候變化、季節性和趨勢等時間序列數據時,動畫更有意義,因為我們可以看到特定的參數是怎樣隨時間變化的。
上面的圖是雨滴的模擬并且已經使用 Matplotlib 庫實現,該庫是一個廣為人知的祖父級別的 python 可視化包。 Matplotlib 通過對 50 個散點的比例和透明度進行設置來模擬雨滴。今天,Python 擁有大量強大的可視化工具,如 Plotly、Bokeh、Altair等等。這些庫能夠實現最先進的動畫和交互特性。盡管如此,本文的目的是強調這個庫的另一個方面,這個方面沒有人進行過太多的探索,這就是動畫。
Matplotlib 是一個廣受歡迎的 Python 2D 繪圖庫。很多人都是從 Matplotlib 開始數據可視化之旅的。可以使用matplotlib輕松生成圖表、直方圖、功率譜,條形圖,錯誤圖表,散點圖等。它還與 Pandas 和 Seaborn 等庫無縫集成,創造出更加復雜的可視化效果。
matplotlib 的優點是:
它的設計類似于 MATLAB,因此很容易在在兩者之間切換。
在后端進行渲染。
可以重現任何圖表(需要一點努力)。
已經存在了十多年,擁有龐大的用戶群。
然而,也有一些方面 Matplotlib 落后于同類的庫。
Matplotlib 有一個過于冗長的規則 API。
有時候風格很差。
對 Web 和交互式圖表的支持不佳。
對于大型復雜數據而言通常很慢。
這份復習資料是來自 Datacamp 的 Matplotlib 小抄,你可以通過它來提高自己的基礎知識。
Matplotlib 的 animation 基類負責處理動畫部分。它提供了一個構建動畫功能的框架。使用下面兩個接口來實現:
FuncAnimation 通過重復調用函數 func 來產生動畫。
ArtistAnimation: 動畫使用一組固定的 Artist 對象。
但是,在這兩個接口中,FuncAnimation 是最方便使用的。你可以通過閱讀文檔 得到的更多信息,因為我們只關注 FuncAnimation 工具。
要求安裝 numpy 和 matplotlib 。
要將動畫保存為 mp4 或 gif,需要安裝 ffmpeg 或 imagemagick。
準備好之后,我們就可以在 Jupyter note 中開始創建第一個動畫了。可以從 Github 得到本文的代碼。
基本動畫:移動的正弦波我們先用 FuncAnimation 創建一個在屏幕上移動的正弦波的動畫。動畫的源代碼來自 Matplotlib 動畫教程。首先看一下輸出,然后我們會分析代碼以了解幕后的原理。
import numpy as np from matplotlib import pyplot as plt from matplotlib.animation import FuncAnimation plt.style.use("seaborn-pastel") fig = plt.figure() ax = plt.axes(xlim=(0, 4), ylim=(-2, 2)) line, = ax.plot([], [], lw=3) def init(): line.set_data([], []) return line, def animate(i): x = np.linspace(0, 4, 1000) y = np.sin(2 * np.pi * (x - 0.01 * i)) line.set_data(x, y) return line, anim = FuncAnimation(fig, animate, init_func=init, frames=200, interval=20, blit=True) anim.save("sine_wave.gif", writer="imagemagick")
在第(7-9)行中,我們只需在圖中創建一個帶有單個軸的圖形窗口。然后創建一個空的行對象,它實際上是動畫中要修改的對象。稍后將用數據對行對象進行填充。
在第(11-13)行中,我們創建了 init 函數,它將使動畫開始。 init 函數對數據進行初始化并設置軸限制。
在第(14-18)行中,我們最終定義了動畫函數,該函數將幀編號( i )作為參數并創建正弦波(或任何其他動畫),這取決于 i 的值。此函數返回一個已修改的繪圖對象的元組,它告訴動畫框架哪些部分應該屬于動畫。
在第 20 行中,我們創建了實際的動畫對象。 blit 參數確保只重繪那些已經改變的圖塊。
這是在 Matplotlib 中創建動畫的基本方法。通過對代碼進行一些調整,可以創建有趣的可視化圖表。接下來看看更多的可視化案例。
同樣,在 GeeksforGeeks 中有一個很好的例子。現在讓我們在 matplotlib 的 animation 類的幫助下創建一個緩慢展開的動圈。該代碼非常類似于正弦波圖,只需稍作調整即可。
import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy as np plt.style.use("dark_background") fig = plt.figure() ax = plt.axes(xlim=(-50, 50), ylim=(-50, 50)) line, = ax.plot([], [], lw=2) # initialization function def init(): # creating an empty plot/frame line.set_data([], []) return line, # lists to store x and y axis points xdata, ydata = [], [] # animation function def animate(i): # t is a parameter t = 0.1*i # x, y values to be plotted x = t*np.sin(t) y = t*np.cos(t) # appending new points to x, y axes points list xdata.append(x) ydata.append(y) line.set_data(xdata, ydata) return line, # setting a title for the plot plt.title("Creating a growing coil with matplotlib!") # hiding the axis details plt.axis("off") # call the animator anim = animation.FuncAnimation(fig, animate, init_func=init, frames=500, interval=20, blit=True) # save the animation as mp4 video file anim.save("coil.gif",writer="imagemagick")
在繪制動態數量(如庫存數據,傳感器數據或任何其他時間相關數據)時,實時更新的圖表會派上用場。我們繪制了一個簡單的圖表,當有更多數據被輸入系統時,該圖表會自動更新。下面讓我們繪制一家假想公司在一個月內的股票價格。
# importing libraries import matplotlib.pyplot as plt import matplotlib.animation as animation fig = plt.figure() # creating a subplot ax1 = fig.add_subplot(1,1,1) def animate(i): data = open("stock.txt","r").read() lines = data.split(" ") xs = [] ys = [] for line in lines: x, y = line.split(",") # Delimiter is comma xs.append(float(x)) ys.append(float(y)) ax1.clear() ax1.plot(xs, ys) plt.xlabel("Date") plt.ylabel("Price") plt.title("Live graph with matplotlib") ani = animation.FuncAnimation(fig, animate, interval=1000) plt.show()
現在,打開終端并運行 python 腳本。你將得到如下圖所示的圖表,該圖表會自動更新:
這里的間隔是 1000 毫秒或一秒。
創建 3D 圖形是很常見的,但如果我們想要為這些圖形的視角設置動畫,該怎么辦呢?我們的想法是更改攝像機視圖,然后用每個生成的圖像來創建動畫。在 Python Graph Gallery 上有一個很好的例子。
在與 jupyter notebook 相同的目錄中創建名為 volcano 的文件夾。所有圖片文件都將存儲在這里,然后將在動畫中使用。
# library from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import pandas as pd import seaborn as sns # Get the data (csv file is hosted on the web) url = "https://python-graph-gallery.com/wp-content/uploads/volcano.csv" data = pd.read_csv(url) # Transform it to a long format df=data.unstack().reset_index() df.columns=["X","Y","Z"] # And transform the old column name in something numeric df["X"]=pd.Categorical(df["X"]) df["X"]=df["X"].cat.codes # We are going to do 20 plots, for 20 different angles for angle in range(70,210,2): # Make the plot fig = plt.figure() ax = fig.gca(projection="3d") ax.plot_trisurf(df["Y"], df["X"], df["Z"], cmap=plt.cm.viridis, linewidth=0.2) ax.view_init(30,angle) filename="Volcano/Volcano_step"+str(angle)+".png" plt.savefig(filename, dpi=96) plt.gca()
這將會在 Volcano 文件夾中創建多個 PNG 文件。現在用 ImageMagick 將它們轉換為動畫。打開終端并切換到 Volcano 目錄下輸入以下命令:
convert -delay 10 Volcano*.png animated_volcano.gif
Celluloid 是一個Python模塊,它簡化了在 matplotlib 中創建動畫的過程。這個庫創建一個 matplotlib 圖,并從中再創建一個 Camera。然后重新處理數據,并在創建每個幀后,用 camera 拍攝快照。最后創建包含所有幀的動畫。
安裝pip install celluloid
以下是使用 Celluloid 模塊的一些示例。
Minimalfrom matplotlib import pyplot as plt from celluloid import Camera fig = plt.figure() camera = Camera(fig) for i in range(10): plt.plot([i] * 10) camera.snap() animation = camera.animate() animation.save("celluloid_minimal.gif", writer = "imagemagick")Subplot
import numpy as np from matplotlib import pyplot as plt from celluloid import Camera fig, axes = plt.subplots(2) camera = Camera(fig) t = np.linspace(0, 2 * np.pi, 128, endpoint=False) for i in t: axes[0].plot(t, np.sin(t + i), color="blue") axes[1].plot(t, np.sin(t - i), color="blue") camera.snap() animation = camera.animate() animation.save("celluloid_subplots.gif", writer = "imagemagick")Legend
import matplotlib from matplotlib import pyplot as plt from celluloid import Camera fig = plt.figure() camera = Camera(fig) for i in range(20): t = plt.plot(range(i, i + 5)) plt.legend(t, [f"line {i}"]) camera.snap() animation = camera.animate() animation.save("celluloid_legends.gif", writer = "imagemagick")
動畫有助于突出顯示無法通過靜態圖表輕松傳達的某些功能。盡管如此,不必要的過度使用有時會使事情復雜化,應該明智地使用數據可視化中的每個功能以產生最佳效果。
更多文章請關注微信公眾號:硬核智能
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/19995.html
摘要:相對于靜態圖表,人類總是容易被動畫和交互式圖表所吸引。可以使用輕松生成圖表直方圖功率譜,條形圖,錯誤圖表,散點圖等。然而,也有一些方面落后于同類的庫。動畫使用一組固定的對象。稍后將用數據對行對象進行填充。現在用將它們轉換為動畫。 翻譯:瘋狂的技術宅https://towardsdatascience.co... showImg(https://segmentfault.com/img...
摘要:概述是使用開發的一個繪圖庫,是界進行數據可視化的首選庫。可以通過圖形示例來快速瀏覽所有支持的圖形。最后,調用把繪制好的圖形顯示出來。對應于三個參數,表示行,表示列,表示位置。因此,表示在圖表中總共有個圖形,當前新增的圖形添加到位置。 showImg(https://segmentfault.com/img/bV6EPD?w=542&h=130); 概述 Matplotlib 是使用 P...
摘要:圖表是比干巴巴的表格更直觀的表達,簡潔有力。當我們想關注比數值本身更多的信息像數值的變化對比或異常,圖表就非常有用了。把數值轉化為圖片要依賴第三方庫的幫忙,在之中最好的圖表庫叫。 圖表是比干巴巴的表格更直觀的表達,簡潔、有力。工作中經常遇到的場景是,有一些數值需要定時的監控,比如服務器的連接數、活躍用戶數、點擊某個按鈕的人數,并且通過郵件或者網頁展示出來。當我們想關注比數值本身更多的信...
摘要:小結本篇主要講述了如何生成數據集以及如何對其進行可視化如何使用創建簡單的圖表如果使用散點圖來探索隨機漫步過程如何使用創建直方圖,以及如何使用直方圖來探索同時擲兩個面數不同的骰子的結果。 《Python編程:從入門到實踐》筆記。從本篇起將用三篇的篇幅介紹如何用Python進行數據可視化。 1. 前言 從本篇開始,我們將用三篇的篇幅來初步介紹如何使用Python來進行數據可視化操作。本篇的...
摘要:當數據發生變化時,這種演變過程隨之發生。是一種統計報告圖,由一系列高度不等的縱向條紋或線段表示數據分布的情況。 showImg(https://segmentfault.com/img/bVbnkP1?w=751&h=558); python相關 基礎概念 數據:離散的,客觀事實的數字表示 信息:處理后的數據,為實際問題提供答案 - 為數據提供一種關系或一個關聯后,數據就成了信...
閱讀 3735·2023-01-11 11:02
閱讀 4244·2023-01-11 11:02
閱讀 3050·2023-01-11 11:02
閱讀 5180·2023-01-11 11:02
閱讀 4737·2023-01-11 11:02
閱讀 5534·2023-01-11 11:02
閱讀 5313·2023-01-11 11:02
閱讀 3986·2023-01-11 11:02