成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

用 Matplotlib 庫(kù)生成動(dòng)畫圖表

不知名網(wǎng)友 / 1786人閱讀

摘要:相對(duì)于靜態(tài)圖表,人類總是容易被動(dòng)畫和交互式圖表所吸引??梢允褂幂p松生成圖表直方圖功率譜,條形圖,錯(cuò)誤圖表,散點(diǎn)圖等。然而,也有一些方面落后于同類的庫(kù)。動(dòng)畫使用一組固定的對(duì)象。稍后將用數(shù)據(jù)對(duì)行對(duì)象進(jìn)行填充?,F(xiàn)在用將它們轉(zhuǎn)換為動(dòng)畫。

翻譯:瘋狂的技術(shù)宅
https://towardsdatascience.co...


更多文章請(qǐng)關(guān)注微信公眾號(hào):硬核智能


動(dòng)畫是一種展示現(xiàn)象的有趣方式。相對(duì)于靜態(tài)圖表,人類總是容易被動(dòng)畫和交互式圖表所吸引。在描述多年來(lái)的股票價(jià)格、過(guò)去十年的氣候變化、季節(jié)性和趨勢(shì)等時(shí)間序列數(shù)據(jù)時(shí),動(dòng)畫更有意義,因?yàn)槲覀兛梢钥吹教囟ǖ膮?shù)是怎樣隨時(shí)間變化的。

上面的圖是雨滴的模擬并且已經(jīng)使用 Matplotlib 庫(kù)實(shí)現(xiàn),該庫(kù)是一個(gè)廣為人知的祖父級(jí)別的 python 可視化包。 Matplotlib 通過(guò)對(duì) 50 個(gè)散點(diǎn)的比例和透明度進(jìn)行設(shè)置來(lái)模擬雨滴。今天,Python 擁有大量強(qiáng)大的可視化工具,如 Plotly、Bokeh、Altair等等。這些庫(kù)能夠?qū)崿F(xiàn)最先進(jìn)的動(dòng)畫和交互特性。盡管如此,本文的目的是強(qiáng)調(diào)這個(gè)庫(kù)的另一個(gè)方面,這個(gè)方面沒(méi)有人進(jìn)行過(guò)太多的探索,這就是動(dòng)畫。


概述

Matplotlib 是一個(gè)廣受歡迎的 Python 2D 繪圖庫(kù)。很多人都是從 Matplotlib 開(kāi)始數(shù)據(jù)可視化之旅的。可以使用matplotlib輕松生成圖表、直方圖、功率譜,條形圖,錯(cuò)誤圖表,散點(diǎn)圖等。它還與 Pandas 和 Seaborn 等庫(kù)無(wú)縫集成,創(chuàng)造出更加復(fù)雜的可視化效果。

matplotlib 的優(yōu)點(diǎn)是:

它的設(shè)計(jì)類似于 MATLAB,因此很容易在在兩者之間切換。

在后端進(jìn)行渲染。

可以重現(xiàn)任何圖表(需要一點(diǎn)努力)。

已經(jīng)存在了十多年,擁有龐大的用戶群。

然而,也有一些方面 Matplotlib 落后于同類的庫(kù)。

Matplotlib 有一個(gè)過(guò)于冗長(zhǎng)的規(guī)則 API。

有時(shí)候風(fēng)格很差。

對(duì) Web 和交互式圖表的支持不佳。

對(duì)于大型復(fù)雜數(shù)據(jù)而言通常很慢。

這份復(fù)習(xí)資料是來(lái)自 Datacamp 的 Matplotlib 小抄,你可以通過(guò)它來(lái)提高自己的基礎(chǔ)知識(shí)。


動(dòng)畫

Matplotlib 的 animation 基類負(fù)責(zé)處理動(dòng)畫部分。它提供了一個(gè)構(gòu)建動(dòng)畫功能的框架。使用下面兩個(gè)接口來(lái)實(shí)現(xiàn):

FuncAnimation 通過(guò)重復(fù)調(diào)用函數(shù) func 來(lái)產(chǎn)生動(dòng)畫。

ArtistAnimation: 動(dòng)畫使用一組固定的 Artist 對(duì)象。

但是,在這兩個(gè)接口中,FuncAnimation 是最方便使用的。你可以通過(guò)閱讀文檔 得到的更多信息,因?yàn)槲覀冎魂P(guān)注 FuncAnimation 工具。

要求

安裝 numpymatplotlib 。

要將動(dòng)畫保存為 mp4 或 gif,需要安裝 ffmpegimagemagick。

準(zhǔn)備好之后,我們就可以在 Jupyter note 中開(kāi)始創(chuàng)建第一個(gè)動(dòng)畫了??梢詮?Github 得到本文的代碼。

基本動(dòng)畫:移動(dòng)的正弦波

我們先用 FuncAnimation 創(chuàng)建一個(gè)在屏幕上移動(dòng)的正弦波的動(dòng)畫。動(dòng)畫的源代碼來(lái)自 Matplotlib 動(dòng)畫教程。首先看一下輸出,然后我們會(huì)分析代碼以了解幕后的原理。

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)建一個(gè)帶有單個(gè)軸的圖形窗口。然后創(chuàng)建一個(gè)空的行對(duì)象,它實(shí)際上是動(dòng)畫中要修改的對(duì)象。稍后將用數(shù)據(jù)對(duì)行對(duì)象進(jìn)行填充。

在第(11-13)行中,我們創(chuàng)建了 init 函數(shù),它將使動(dòng)畫開(kāi)始。 init 函數(shù)對(duì)數(shù)據(jù)進(jìn)行初始化并設(shè)置軸限制。

在第(14-18)行中,我們最終定義了動(dòng)畫函數(shù),該函數(shù)將幀編號(hào)( i )作為參數(shù)并創(chuàng)建正弦波(或任何其他動(dòng)畫),這取決于 i 的值。此函數(shù)返回一個(gè)已修改的繪圖對(duì)象的元組,它告訴動(dòng)畫框架哪些部分應(yīng)該屬于動(dòng)畫。

在第 20 行中,我們創(chuàng)建了實(shí)際的動(dòng)畫對(duì)象。 blit 參數(shù)確保只重繪那些已經(jīng)改變的圖塊。

這是在 Matplotlib 中創(chuàng)建動(dòng)畫的基本方法。通過(guò)對(duì)代碼進(jìn)行一些調(diào)整,可以創(chuàng)建有趣的可視化圖表。接下來(lái)看看更多的可視化案例。


一個(gè)不斷增長(zhǎng)的線圈

同樣,在 GeeksforGeeks 中有一個(gè)很好的例子?,F(xiàn)在讓我們?cè)?matplotlib 的 animation 類的幫助下創(chuàng)建一個(gè)緩慢展開(kāi)的動(dò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") 


實(shí)時(shí)更新圖表

在繪制動(dòng)態(tài)數(shù)量(如庫(kù)存數(shù)據(jù),傳感器數(shù)據(jù)或任何其他時(shí)間相關(guān)數(shù)據(jù))時(shí),實(shí)時(shí)更新的圖表會(huì)派上用場(chǎng)。我們繪制了一個(gè)簡(jiǎn)單的圖表,當(dāng)有更多數(shù)據(jù)被輸入系統(tǒng)時(shí),該圖表會(huì)自動(dòng)更新。下面讓我們繪制一家假想公司在一個(gè)月內(nèi)的股票價(jià)格。

# 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)在,打開(kāi)終端并運(yùn)行 python 腳本。你將得到如下圖所示的圖表,該圖表會(huì)自動(dòng)更新:

這里的間隔是 1000 毫秒或一秒。


3D 圖動(dòng)畫

創(chuàng)建 3D 圖形是很常見(jiàn)的,但如果我們想要為這些圖形的視角設(shè)置動(dòng)畫,該怎么辦呢?我們的想法是更改攝像機(jī)視圖,然后用每個(gè)生成的圖像來(lái)創(chuàng)建動(dòng)畫。在 Python Graph Gallery 上有一個(gè)很好的例子。

在與 jupyter notebook 相同的目錄中創(chuàng)建名為 volcano 的文件夾。所有圖片文件都將存儲(chǔ)在這里,然后將在動(dòng)畫中使用。

# 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()

這將會(huì)在 Volcano 文件夾中創(chuàng)建多個(gè) PNG 文件?,F(xiàn)在用 ImageMagick 將它們轉(zhuǎn)換為動(dòng)畫。打開(kāi)終端并切換到 Volcano 目錄下輸入以下命令:

convert -delay 10 Volcano*.png animated_volcano.gif


使用 Celluloid 模塊創(chuàng)建的動(dòng)畫

Celluloid 是一個(gè)Python模塊,它簡(jiǎn)化了在 matplotlib 中創(chuàng)建動(dòng)畫的過(guò)程。這個(gè)庫(kù)創(chuàng)建一個(gè) matplotlib 圖,并從中再創(chuàng)建一個(gè) Camera。然后重新處理數(shù)據(jù),并在創(chuàng)建每個(gè)幀后,用 camera 拍攝快照。最后創(chuàng)建包含所有幀的動(dòng)畫。

安裝
pip install celluloid

以下是使用 Celluloid 模塊的一些示例。

Minimal
from 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")


總結(jié)

動(dòng)畫有助于突出顯示無(wú)法通過(guò)靜態(tài)圖表輕松傳達(dá)的某些功能。盡管如此,不必要的過(guò)度使用有時(shí)會(huì)使事情復(fù)雜化,應(yīng)該明智地使用數(shù)據(jù)可視化中的每個(gè)功能以產(chǎn)生最佳效果。

更多文章請(qǐng)關(guān)注微信公眾號(hào):硬核智能

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/19995.html

相關(guān)文章

  • Matplotlib 庫(kù)生成動(dòng)畫圖表

    摘要:相對(duì)于靜態(tài)圖表,人類總是容易被動(dòng)畫和交互式圖表所吸引??梢允褂幂p松生成圖表直方圖功率譜,條形圖,錯(cuò)誤圖表,散點(diǎn)圖等。然而,也有一些方面落后于同類的庫(kù)。動(dòng)畫使用一組固定的對(duì)象。稍后將用數(shù)據(jù)對(duì)行對(duì)象進(jìn)行填充。現(xiàn)在用將它們轉(zhuǎn)換為動(dòng)畫。 翻譯:瘋狂的技術(shù)宅https://towardsdatascience.co... showImg(https://segmentfault.com/img...

    call_me_R 評(píng)論0 收藏0
  • 快速入門 Matplotlib 繪圖庫(kù)

    摘要:概述是使用開(kāi)發(fā)的一個(gè)繪圖庫(kù),是界進(jìn)行數(shù)據(jù)可視化的首選庫(kù)??梢酝ㄟ^(guò)圖形示例來(lái)快速瀏覽所有支持的圖形。最后,調(diào)用把繪制好的圖形顯示出來(lái)。對(duì)應(yīng)于三個(gè)參數(shù),表示行,表示列,表示位置。因此,表示在圖表中總共有個(gè)圖形,當(dāng)前新增的圖形添加到位置。 showImg(https://segmentfault.com/img/bV6EPD?w=542&h=130); 概述 Matplotlib 是使用 P...

    Hujiawei 評(píng)論0 收藏0
  • Python繪制精美圖表之雙柱形圖

    摘要:圖表是比干巴巴的表格更直觀的表達(dá),簡(jiǎn)潔有力。當(dāng)我們想關(guān)注比數(shù)值本身更多的信息像數(shù)值的變化對(duì)比或異常,圖表就非常有用了。把數(shù)值轉(zhuǎn)化為圖片要依賴第三方庫(kù)的幫忙,在之中最好的圖表庫(kù)叫。 圖表是比干巴巴的表格更直觀的表達(dá),簡(jiǎn)潔、有力。工作中經(jīng)常遇到的場(chǎng)景是,有一些數(shù)值需要定時(shí)的監(jiān)控,比如服務(wù)器的連接數(shù)、活躍用戶數(shù)、點(diǎn)擊某個(gè)按鈕的人數(shù),并且通過(guò)郵件或者網(wǎng)頁(yè)展示出來(lái)。當(dāng)我們想關(guān)注比數(shù)值本身更多的信...

    beita 評(píng)論0 收藏0
  • Python學(xué)習(xí)之路14-生成數(shù)據(jù)

    摘要:小結(jié)本篇主要講述了如何生成數(shù)據(jù)集以及如何對(duì)其進(jìn)行可視化如何使用創(chuàng)建簡(jiǎn)單的圖表如果使用散點(diǎn)圖來(lái)探索隨機(jī)漫步過(guò)程如何使用創(chuàng)建直方圖,以及如何使用直方圖來(lái)探索同時(shí)擲兩個(gè)面數(shù)不同的骰子的結(jié)果。 《Python編程:從入門到實(shí)踐》筆記。從本篇起將用三篇的篇幅介紹如何用Python進(jìn)行數(shù)據(jù)可視化。 1. 前言 從本篇開(kāi)始,我們將用三篇的篇幅來(lái)初步介紹如何使用Python來(lái)進(jìn)行數(shù)據(jù)可視化操作。本篇的...

    wanglu1209 評(píng)論0 收藏0
  • Python學(xué)習(xí)筆記:數(shù)據(jù)可視化(一)

    摘要:當(dāng)數(shù)據(jù)發(fā)生變化時(shí),這種演變過(guò)程隨之發(fā)生。是一種統(tǒng)計(jì)報(bào)告圖,由一系列高度不等的縱向條紋或線段表示數(shù)據(jù)分布的情況。 showImg(https://segmentfault.com/img/bVbnkP1?w=751&h=558); python相關(guān) 基礎(chǔ)概念 數(shù)據(jù):離散的,客觀事實(shí)的數(shù)字表示 信息:處理后的數(shù)據(jù),為實(shí)際問(wèn)題提供答案   - 為數(shù)據(jù)提供一種關(guān)系或一個(gè)關(guān)聯(lián)后,數(shù)據(jù)就成了信...

    Crazy_Coder 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<