摘要:相對于靜態(tài)圖表,人類總是容易被動畫和交互式圖表所吸引。可以使用輕松生成圖表直方圖功率譜,條形圖,錯誤圖表,散點圖等。然而,也有一些方面落后于同類的庫。動畫使用一組固定的對象。稍后將用數(shù)據(jù)對行對象進(jìn)行填充?,F(xiàn)在用將它們轉(zhuǎn)換為動畫。
翻譯:瘋狂的技術(shù)宅
https://towardsdatascience.co...
更多文章請關(guān)注微信公眾號:硬核智能
動畫是一種展示現(xiàn)象的有趣方式。相對于靜態(tài)圖表,人類總是容易被動畫和交互式圖表所吸引。在描述多年來的股票價格、過去十年的氣候變化、季節(jié)性和趨勢等時間序列數(shù)據(jù)時,動畫更有意義,因為我們可以看到特定的參數(shù)是怎樣隨時間變化的。
上面的圖是雨滴的模擬并且已經(jīng)使用 Matplotlib 庫實現(xiàn),該庫是一個廣為人知的祖父級別的 python 可視化包。 Matplotlib 通過對 50 個散點的比例和透明度進(jìn)行設(shè)置來模擬雨滴。今天,Python 擁有大量強大的可視化工具,如 Plotly、Bokeh、Altair等等。這些庫能夠?qū)崿F(xiàn)最先進(jìn)的動畫和交互特性。盡管如此,本文的目的是強調(diào)這個庫的另一個方面,這個方面沒有人進(jìn)行過太多的探索,這就是動畫。
Matplotlib 是一個廣受歡迎的 Python 2D 繪圖庫。很多人都是從 Matplotlib 開始數(shù)據(jù)可視化之旅的??梢允褂胢atplotlib輕松生成圖表、直方圖、功率譜,條形圖,錯誤圖表,散點圖等。它還與 Pandas 和 Seaborn 等庫無縫集成,創(chuàng)造出更加復(fù)雜的可視化效果。
matplotlib 的優(yōu)點是:
它的設(shè)計類似于 MATLAB,因此很容易在在兩者之間切換。
在后端進(jìn)行渲染。
可以重現(xiàn)任何圖表(需要一點努力)。
已經(jīng)存在了十多年,擁有龐大的用戶群。
然而,也有一些方面 Matplotlib 落后于同類的庫。
Matplotlib 有一個過于冗長的規(guī)則 API。
有時候風(fēng)格很差。
對 Web 和交互式圖表的支持不佳。
對于大型復(fù)雜數(shù)據(jù)而言通常很慢。
這份復(fù)習(xí)資料是來自 Datacamp 的 Matplotlib 小抄,你可以通過它來提高自己的基礎(chǔ)知識。
Matplotlib 的 animation 基類負(fù)責(zé)處理動畫部分。它提供了一個構(gòu)建動畫功能的框架。使用下面兩個接口來實現(xiàn):
FuncAnimation 通過重復(fù)調(diào)用函數(shù) func 來產(chǎn)生動畫。
ArtistAnimation: 動畫使用一組固定的 Artist 對象。
但是,在這兩個接口中,FuncAnimation 是最方便使用的。你可以通過閱讀文檔 得到的更多信息,因為我們只關(guān)注 FuncAnimation 工具。
要求安裝 numpy 和 matplotlib 。
要將動畫保存為 mp4 或 gif,需要安裝 ffmpeg 或 imagemagick。
準(zhǔn)備好之后,我們就可以在 Jupyter note 中開始創(chuàng)建第一個動畫了??梢詮?Github 得到本文的代碼。
基本動畫:移動的正弦波我們先用 FuncAnimation 創(chuàng)建一個在屏幕上移動的正弦波的動畫。動畫的源代碼來自 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)行中,我們只需在圖中創(chuàng)建一個帶有單個軸的圖形窗口。然后創(chuàng)建一個空的行對象,它實際上是動畫中要修改的對象。稍后將用數(shù)據(jù)對行對象進(jìn)行填充。
在第(11-13)行中,我們創(chuàng)建了 init 函數(shù),它將使動畫開始。 init 函數(shù)對數(shù)據(jù)進(jìn)行初始化并設(shè)置軸限制。
在第(14-18)行中,我們最終定義了動畫函數(shù),該函數(shù)將幀編號( i )作為參數(shù)并創(chuàng)建正弦波(或任何其他動畫),這取決于 i 的值。此函數(shù)返回一個已修改的繪圖對象的元組,它告訴動畫框架哪些部分應(yīng)該屬于動畫。
在第 20 行中,我們創(chuàng)建了實際的動畫對象。 blit 參數(shù)確保只重繪那些已經(jīng)改變的圖塊。
這是在 Matplotlib 中創(chuàng)建動畫的基本方法。通過對代碼進(jìn)行一些調(diào)整,可以創(chuàng)建有趣的可視化圖表。接下來看看更多的可視化案例。
同樣,在 GeeksforGeeks 中有一個很好的例子。現(xiàn)在讓我們在 matplotlib 的 animation 類的幫助下創(chuàng)建一個緩慢展開的動圈。該代碼非常類似于正弦波圖,只需稍作調(diào)整即可。
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")
在繪制動態(tài)數(shù)量(如庫存數(shù)據(jù),傳感器數(shù)據(jù)或任何其他時間相關(guān)數(shù)據(jù))時,實時更新的圖表會派上用場。我們繪制了一個簡單的圖表,當(dāng)有更多數(shù)據(jù)被輸入系統(tǒng)時,該圖表會自動更新。下面讓我們繪制一家假想公司在一個月內(nèi)的股票價格。
# 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()
現(xiàn)在,打開終端并運行 python 腳本。你將得到如下圖所示的圖表,該圖表會自動更新:
這里的間隔是 1000 毫秒或一秒。
創(chuàng)建 3D 圖形是很常見的,但如果我們想要為這些圖形的視角設(shè)置動畫,該怎么辦呢?我們的想法是更改攝像機視圖,然后用每個生成的圖像來創(chuàng)建動畫。在 Python Graph Gallery 上有一個很好的例子。
在與 jupyter notebook 相同的目錄中創(chuàng)建名為 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 文件夾中創(chuàng)建多個 PNG 文件?,F(xiàn)在用 ImageMagick 將它們轉(zhuǎn)換為動畫。打開終端并切換到 Volcano 目錄下輸入以下命令:
convert -delay 10 Volcano*.png animated_volcano.gif
Celluloid 是一個Python模塊,它簡化了在 matplotlib 中創(chuàng)建動畫的過程。這個庫創(chuàng)建一個 matplotlib 圖,并從中再創(chuàng)建一個 Camera。然后重新處理數(shù)據(jù),并在創(chuàng)建每個幀后,用 camera 拍攝快照。最后創(chuàng)建包含所有幀的動畫。
安裝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")
動畫有助于突出顯示無法通過靜態(tài)圖表輕松傳達(dá)的某些功能。盡管如此,不必要的過度使用有時會使事情復(fù)雜化,應(yīng)該明智地使用數(shù)據(jù)可視化中的每個功能以產(chǎn)生最佳效果。
更多文章請關(guān)注微信公眾號:硬核智能
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/43671.html
摘要:相對于靜態(tài)圖表,人類總是容易被動畫和交互式圖表所吸引??梢允褂幂p松生成圖表直方圖功率譜,條形圖,錯誤圖表,散點圖等。然而,也有一些方面落后于同類的庫。動畫使用一組固定的對象。稍后將用數(shù)據(jù)對行對象進(jìn)行填充?,F(xiàn)在用將它們轉(zhuǎn)換為動畫。 翻譯:瘋狂的技術(shù)宅https://towardsdatascience.co... showImg(https://segmentfault.com/img...
摘要:概述是使用開發(fā)的一個繪圖庫,是界進(jìn)行數(shù)據(jù)可視化的首選庫。可以通過圖形示例來快速瀏覽所有支持的圖形。最后,調(diào)用把繪制好的圖形顯示出來。對應(yīng)于三個參數(shù),表示行,表示列,表示位置。因此,表示在圖表中總共有個圖形,當(dāng)前新增的圖形添加到位置。 showImg(https://segmentfault.com/img/bV6EPD?w=542&h=130); 概述 Matplotlib 是使用 P...
摘要:圖表是比干巴巴的表格更直觀的表達(dá),簡潔有力。當(dāng)我們想關(guān)注比數(shù)值本身更多的信息像數(shù)值的變化對比或異常,圖表就非常有用了。把數(shù)值轉(zhuǎn)化為圖片要依賴第三方庫的幫忙,在之中最好的圖表庫叫。 圖表是比干巴巴的表格更直觀的表達(dá),簡潔、有力。工作中經(jīng)常遇到的場景是,有一些數(shù)值需要定時的監(jiān)控,比如服務(wù)器的連接數(shù)、活躍用戶數(shù)、點擊某個按鈕的人數(shù),并且通過郵件或者網(wǎng)頁展示出來。當(dāng)我們想關(guān)注比數(shù)值本身更多的信...
摘要:小結(jié)本篇主要講述了如何生成數(shù)據(jù)集以及如何對其進(jìn)行可視化如何使用創(chuàng)建簡單的圖表如果使用散點圖來探索隨機漫步過程如何使用創(chuàng)建直方圖,以及如何使用直方圖來探索同時擲兩個面數(shù)不同的骰子的結(jié)果。 《Python編程:從入門到實踐》筆記。從本篇起將用三篇的篇幅介紹如何用Python進(jìn)行數(shù)據(jù)可視化。 1. 前言 從本篇開始,我們將用三篇的篇幅來初步介紹如何使用Python來進(jìn)行數(shù)據(jù)可視化操作。本篇的...
摘要:當(dāng)數(shù)據(jù)發(fā)生變化時,這種演變過程隨之發(fā)生。是一種統(tǒng)計報告圖,由一系列高度不等的縱向條紋或線段表示數(shù)據(jù)分布的情況。 showImg(https://segmentfault.com/img/bVbnkP1?w=751&h=558); python相關(guān) 基礎(chǔ)概念 數(shù)據(jù):離散的,客觀事實的數(shù)字表示 信息:處理后的數(shù)據(jù),為實際問題提供答案 - 為數(shù)據(jù)提供一種關(guān)系或一個關(guān)聯(lián)后,數(shù)據(jù)就成了信...
閱讀 712·2021-09-29 09:34
閱讀 2565·2019-08-30 15:53
閱讀 3371·2019-08-29 17:17
閱讀 771·2019-08-29 16:08
閱讀 1132·2019-08-29 13:03
閱讀 960·2019-08-27 10:54
閱讀 694·2019-08-26 13:39
閱讀 2865·2019-08-26 13:34