人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

利用 Python 讓圖表動(dòng)起來(lái)

發(fā)布日期:2021-12-22 10:16 | 文章來(lái)源:站長(zhǎng)之家

MatplotlibSeaborn這類Python庫(kù)可以畫(huà)出很好看的圖,但是這些圖只是靜態(tài)的,難以動(dòng)態(tài)且美觀地呈現(xiàn)數(shù)值變化。要是在你下次的演示、視頻、社交媒體Po文里能用短視頻呈現(xiàn)數(shù)據(jù)變化,是不是很贊呢?更棒的是,你還是可以在你的圖表上用Matplotlib、Seaborn或者其他庫(kù)!

本文將使用美國(guó)國(guó)家藥物濫用研究所和疾病預(yù)防控制中心公布的阿片類藥物數(shù)據(jù),可在此處下載:https://http://www.drugabuse.gov/sites/default/files/overdosedata1999-2015.xls

我們會(huì)用到的數(shù)據(jù)是這樣的:

我們將用MatplotlibSeaborn繪圖,用NumpyPandas處理數(shù)據(jù)。Matplotlib也提供了一些我們做動(dòng)畫(huà)可以的函數(shù),所以讓我們首先導(dǎo)入所有依賴項(xiàng)。

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.animation as animation

然后用Pandas載入數(shù)據(jù)并轉(zhuǎn)成DataFrame類型的數(shù)據(jù)結(jié)構(gòu)。因?yàn)槲覀円槍?duì)不同阿片類藥物的濫用畫(huà)圖,寫(xiě)個(gè)函數(shù)來(lái)載入感興趣的特定行的數(shù)據(jù)能避免重復(fù)代碼。(小編注:原文提供的代碼在讀取excel文件的時(shí)候使用了已廢棄的sheetname參數(shù),本文中已修正為sheet_name)

overdoses = pd.read_excel('overdose_data_1999-2015.xls',sheet_name='Online',skiprows =6)
def get_data(table,rownum,title):
 data = pd.DataFrame(table.loc[rownum][2:]).astype(float)
 data.columns = {title}
 return data 

現(xiàn)在讓我們來(lái)做動(dòng)畫(huà)吧!

首先,如果你和我一樣使用的是jupyter notebook,請(qǐng)?jiān)诖a首行加入 %matplotlib notebook,如此便可在notebook直接看到生成的動(dòng)畫(huà)而非保存后才可見(jiàn)。

我現(xiàn)在使用 get_data函數(shù)從表中檢索海洛因過(guò)量的數(shù)據(jù)并放在有兩列的Pandas DataFrame中,一列是年,一列是過(guò)量死亡的人數(shù)。

%matplotlib notebook
title = 'Heroin Overdoses'
d = get_data(overdoses,18,title)
x = np.array(d.index)
y = np.array(d['Heroin Overdoses'])
overdose = pd.DataFrame(y,x)
#XN,YN = augment(x,y,10)
#augmented = pd.DataFrame(YN,XN)
overdose.columns = {title}

接下來(lái)我們初始化一個(gè)ffmpeg Writer并以20幀每秒、1800比特率進(jìn)行錄屏。你也可以根據(jù)喜好自行設(shè)置這些值。

Writer = animation.writers['ffmpeg']
writer = Writer(fps=20, metadata=dict(artist='Me'), bitrate=1800)

小編注:如果出現(xiàn) RuntimeError:RequestedMovieWriter(ffmpeg)notavailable的報(bào)錯(cuò),請(qǐng)自行安裝ffmpeg,裝了brewMac可以直接: brew install ffmpeg

現(xiàn)在我們創(chuàng)建一個(gè)有幾個(gè)標(biāo)簽的圖形。確保設(shè)置x和y軸的限制,以免動(dòng)畫(huà)隨當(dāng)前顯示的數(shù)據(jù)范圍亂跳轉(zhuǎn)。

fig = plt.figure(figsize=(10,6))
plt.xlim(1999, 2016)
plt.ylim(np.min(overdose)[0], np.max(overdose)[0])
plt.xlabel('Year',fontsize=20)
plt.ylabel(title,fontsize=20)
plt.title('Heroin Overdoses per Year',fontsize=20)

動(dòng)畫(huà)的核心是動(dòng)畫(huà)函數(shù),你可以在其中定義視頻的每一幀發(fā)生什么。這里的 i表示動(dòng)畫(huà)中幀的索引。使用這個(gè)索引可以選擇應(yīng)在此幀中可見(jiàn)的數(shù)據(jù)范圍。然后我使用seaborn線圖來(lái)繪制所選的數(shù)據(jù)。最后兩行代碼只是為了讓圖表更美觀。

def animate(i):
 data = overdose.iloc[:int(i+1)] #選擇數(shù)據(jù)范圍
 p = sns.lineplot(x=data.index, y=data[title], data=data, color="r")
 p.tick_params(labelsize=17)
 plt.setp(p.lines,linewidth=7)

我們用調(diào)用了 animate 函數(shù)并定義了幀數(shù)的 matplotlib.animation.FuncAnimation來(lái)開(kāi)始動(dòng)畫(huà), frames實(shí)際上定義了調(diào)用 animate的頻率。

ani = matplotlib.animation.FuncAnimation(fig, animate, frames=17, repeat=True)

你可以用 ani.save()把動(dòng)畫(huà)保存為mp4,如果你想直接看一看動(dòng)畫(huà)效果可以用plt.show()

ani.save('HeroinOverdosesJumpy.mp4', writer=writer)

現(xiàn)在我們的圖表動(dòng)起來(lái)啦:

動(dòng)畫(huà)能夠正常運(yùn)行但是感覺(jué)有點(diǎn)跳躍,所以我們需要在已有數(shù)據(jù)點(diǎn)之間增加更多的數(shù)據(jù)點(diǎn)來(lái)使動(dòng)畫(huà)的過(guò)渡平滑。于是我們使用另一個(gè)函數(shù) augment。

def augment(xold,yold,numsteps):
 xnew = []
 ynew = []
 for i in range(len(xold)-1):
  difX = xold[i+1]-xold[i]
  stepsX = difX/numsteps
  difY = yold[i+1]-yold[i]
  stepsY = difY/numsteps
 for s in range(numsteps):
xnew = np.append(xnew,xold[i]+s*stepsX)
ynew = np.append(ynew,yold[i]+s*stepsY)
 return xnew,ynew

現(xiàn)在我們只需要對(duì)我們的數(shù)據(jù)應(yīng)用這個(gè)函數(shù)、增加 matplotlib.animation.FuncAnimation 函數(shù)的幀數(shù)。在這里我用參數(shù) numsteps=10調(diào)用 augment函數(shù),也就是增加數(shù)據(jù)點(diǎn)至160個(gè),并且設(shè)置 frames=160 。這樣以來(lái),圖表顯得更為平滑,但還是在數(shù)值變動(dòng)處有些突兀。

為了讓我們的動(dòng)畫(huà)更平滑美觀,我們可以增加一個(gè)平滑函數(shù)(具體請(qǐng)見(jiàn):https://www.swharden.com/wp/2008-11-17-linear-data-smoothing-in-python/ )。

def smoothListGaussian(listin,strippedXs=False,degree=5):  
 window=degree*2-1 
 weight=np.array([1.0]*window)  
 weightGauss=[]  
 for i in range(window):  
  i=i-degree+1 
  frac=i/float(window)  
  gauss=1/(np.exp((4*(frac))**2))  
  weightGauss.append(gauss)
 weight=np.array(weightGauss)*weight  
 smoothed=[0.0]*(len(listin)-window)  
 for i in range(len(smoothed)):  
 smoothed[i]=sum(np.array(listin[i:i+window])*weight)/sum(weight)  
 return smoothed

另外我們也可以加上一點(diǎn)顏色和樣式參數(shù),讓圖表更個(gè)性化。

sns.set(rc={'axes.facecolor':'lightgrey', 'figure.facecolor':'lightgrey','figure.edgecolor':'black','axes.grid':False})

當(dāng)當(dāng)當(dāng)!如此我們便得到了文章開(kāi)頭的動(dòng)畫(huà)圖表。

這篇文章僅僅只是matplotlib動(dòng)畫(huà)功能的一個(gè)例子,你大可以用它來(lái)實(shí)現(xiàn)任何一種圖表的動(dòng)畫(huà)效果。簡(jiǎn)單調(diào)整 animate()函數(shù)內(nèi)的參數(shù)和圖表類型,就能得到無(wú)窮無(wú)盡的可能性。

到此這篇關(guān)于利用 Python 讓圖表動(dòng)起來(lái)的文章就介紹到這了,更多相關(guān)Python 讓圖表動(dòng)起來(lái)內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開(kāi)通

自選配置、實(shí)時(shí)開(kāi)通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問(wèn)服務(wù)

1對(duì)1客戶咨詢顧問(wèn)

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部