優(yōu)質(zhì)文章,第一時(shí)間送達(dá)!
作者:Costas Andreou
機(jī)器之心編譯
參與:Jamin、張倩
在讀技術(shù)博客的過(guò)程中,我們會(huì)發(fā)現(xiàn)那些能夠把知識(shí)、成果講透的博主很多都會(huì)做動(dòng)態(tài)圖表。他們的圖是怎么做的?難度大嗎?這篇文章就介紹了 Python 中一種簡(jiǎn)單的動(dòng)態(tài)圖表制作方法。
import matplotlib.animation as ani
animator = ani.FuncAnimation(fig, chartfunc, interval = 100)
fig 是用來(lái) 「繪制圖表」的 figure 對(duì)象;
chartfunc 是一個(gè)以數(shù)字為輸入的函數(shù),其含義為時(shí)間序列上的時(shí)間;
interval 這個(gè)更好理解,是幀之間的間隔延遲,以毫秒為單位,默認(rèn)值為 200。
import matplotlib.animation as ani
import matplotlib.pyplot as plt
import numpy as np
import pandas as pdurl = 'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv'
df = pd.read_csv(url, delimiter=',', header='infer')df_interest = df.loc[
df['Country/Region'].isin(['United Kingdom', 'US', 'Italy', 'Germany'])
& df['Province/State'].isna()]df_interest.rename(
index=lambda x: df_interest.at[x, 'Country/Region'], inplace=True)
df1 = df_interest.transpose()df1 = df1.drop(['Province/State', 'Country/Region', 'Lat', 'Long'])
df1 = df1.loc[(df1 != 0).any(1)]
df1.index = pd.to_datetime(df1.index)
import numpy as np
import matplotlib.pyplot as pltcolor = ['red', 'green', 'blue', 'orange']
fig = plt.figure()
plt.xticks(rotation=45, ha='right', rotation_mode='anchor') #rotate the x-axis values
plt.subplots_adjust(bottom = 0.2, top = 0.9) #ensuring the dates (on the x-axis) fit in the screen
plt.ylabel('No of Deaths')
plt.xlabel('Dates')
def buildmebarchart(i=int):
plt.legend(df1.columns)
p = plt.plot(df1[:i].index, df1[:i].values) #note it only returns the dataset, up to the point i
for i in range(0,4):
p[i].set_color(color[i]) #set the colour of each curveimport matplotlib.animation as ani
animator = ani.FuncAnimation(fig, buildmebarchart, interval = 100)
plt.show()
import numpy as np
import matplotlib.pyplot as pltfig,ax = plt.subplots()
explode=[0.01,0.01,0.01,0.01] #pop out each slice from the piedef getmepie(i):
def absolute_value(val): #turn % back to a number
a = np.round(val/100.*df1.head(i).max().sum(), 0)
return int(a)
ax.clear()
plot = df1.head(i).max().plot.pie(y=df1.columns,autopct=absolute_value, label='',explode = explode, shadow = True)
plot.set_title('Total Number of Deaths\n' + str(df1.index[min( i, len(df1.index)-1 )].strftime('%y-%m-%d')), fontsize=12)import matplotlib.animation as ani
animator = ani.FuncAnimation(fig, getmepie, interval = 200)
plt.show()
df1.head(i).max()
fig = plt.figure()
bar = ''def buildmebarchart(i=int):
iv = min(i, len(df1.index)-1) #the loop iterates an extra one time, which causes the dataframes to go out of bounds. This was the easiest (most lazy) way to solve this :)
objects = df1.max().index
y_pos = np.arange(len(objects))
performance = df1.iloc[[iv]].values.tolist()[0]
if bar == 'vertical':
plt.bar(y_pos, performance, align='center', color=['red', 'green', 'blue', 'orange'])
plt.xticks(y_pos, objects)
plt.ylabel('Deaths')
plt.xlabel('Countries')
plt.title('Deaths per Country \n' + str(df1.index[iv].strftime('%y-%m-%d')))
else:
plt.barh(y_pos, performance, align='center', color=['red', 'green', 'blue', 'orange'])
plt.yticks(y_pos, objects)
plt.xlabel('Deaths')
plt.ylabel('Countries')animator = ani.FuncAnimation(fig, buildmebarchart, interval=100)plt.show()
animator.save(r'C:\temp\myfirstAnimation.gif')
回復(fù)下方「關(guān)鍵詞」,獲取優(yōu)質(zhì)資源
回復(fù)關(guān)鍵詞「 pybook03」,立即獲取主頁(yè)君與小伙伴一起翻譯的《Think Python 2e》電子版
回復(fù)關(guān)鍵詞「入門(mén)資料」,立即獲取主頁(yè)君整理的 10 本 Python 入門(mén)書(shū)的電子版
回復(fù)關(guān)鍵詞「m」,立即獲取Python精選優(yōu)質(zhì)文章合集
回復(fù)關(guān)鍵詞「book 數(shù)字」,將數(shù)字替換成 0 及以上數(shù)字,有驚喜好禮哦~
題圖:pexels,CC0 授權(quán)。
聯(lián)系客服