以1850-2018年近170年的全球平均氣溫距基準(zhǔn)平均氣溫(1961-1990年)的變化數(shù)據(jù)為例,利用matplotlib python庫(kù),繪制數(shù)據(jù)動(dòng)態(tài)可視化圖。
原文博客地址:http://gaohr.win/site/blogs/2019/2019-10-08-dynamic-plot-matplotlib.html
先預(yù)覽一下動(dòng)態(tài)效果圖:
Matplotlib基礎(chǔ)
對(duì)于Matplotlib的安裝、基本使用等,網(wǎng)絡(luò)上資源很多,此處不再過(guò)多的介紹,在此附上官網(wǎng)鏈接,足夠?qū)W習(xí)使用~
* 官方主頁(yè):https://matplotlib.org
* 官方示例:https://matplotlib.org/gallery/index.html
* 官方API:https://matplotlib.org/api/index.html
如何繪制動(dòng)態(tài)圖
一般情況下,利用Matplotlib繪制動(dòng)態(tài)圖時(shí),通常選擇使用Matplotlib的animation模塊,但是該模塊的函數(shù)使用比較繁瑣,不易學(xué)習(xí),開(kāi)發(fā)不靈活。因此,本文介紹一種相對(duì)比較簡(jiǎn)單的辦法,利用動(dòng)態(tài)繪圖和暫停功能來(lái)實(shí)現(xiàn),具體看代碼和相應(yīng)的注釋。
繪制動(dòng)態(tài)圖的函數(shù)如下:
def Plot(x, y1, y2):
'''
Create plot
:param x: 時(shí)間變量數(shù)組
:param y1: 數(shù)據(jù)數(shù)組1
:param y2: 數(shù)據(jù)數(shù)組2
:return:
'''
fig, ax = plt.subplots(figsize=(14, 5)) # 創(chuàng)建窗口和子圖
plt.tick_params(labelsize=16) # 設(shè)置刻度字體
# 設(shè)置時(shí)間軸格式
fig.autofmt_xdate(rotation=30, ha='center')
dateFmt = mdate.DateFormatter('%Y')
ax.xaxis.set_major_formatter(dateFmt)
years = numpy.arange(int(x[0]), int(x[-1]) + 1)
yearsDate = GetDateArr(years) # 獲取年份列表
xs = [yearsDate[0], yearsDate[0
ys = [y1[0], y1[0
ys2 = [y2[0], y2[0
# 添加text
plt.text(yearsDate[-22], -0.7, 'Made by GaoHR', fontsize=14, color='#1E90FF')
plt.text(yearsDate[0], -0.7, 'Global temperature anomaly datasets (http://www.cru.uea.ac.uk/cru/data/temperature/)',
fontsize=14, fontfamily='Times New Roman', color='#333333')
plt.text(yearsDate[0], 0.5, 'The global record data were provided by Climatic Research Unit',
fontsize=14, fontfamily='Times New Roman', color='#333333')
plt.text(yearsDate[0], 0.15, 'The time series shows the combined global land and marine surface temperature record\n'
'from 1850 to 2018. The base period is 1961-1990.\n'
'This year was the 4rd warmest on record.',
fontsize=14, fontfamily='Times New Roman', color='#666666')
# 設(shè)置x、y軸范圍
# plt.xlim(x_min, x_max)
plt.ylim(-0.75, 1)
# 設(shè)置標(biāo)簽、添加刻度標(biāo)線
ax.set_xlabel('Year', fontsize=16, fontfamily='Times New Roman')
ax.set_ylabel('Temperature anomaly ($^o$C)', fontsize=16, fontfamily='Times New Roman')
plt.grid(True, linestyle='--', alpha=0.5)
# 動(dòng)態(tài)讀取數(shù)據(jù),繪制圖形
for i in range(years[0], years[-1]):
# 更新x, y1, y2
xs[0] = xs[1
ys[0] = ys[1
ys2[0] = ys2[1
xs[1] = yearsDate[i - int(x[0
ys[1] = y1[i - int(x[0
ys2[1] = y2[i - int(x[0
ax.bar(xs, ys, width=150, color=getColor(y1[i - int(x[0])])) # 繪制條狀圖
ax.plot(xs, ys2, color='#555555') # 繪制曲線圖
plt.legend(['Smoothed'], loc='upper left', fontsize=14) # 添加圖例
plt.pause(0.1) # 設(shè)置時(shí)間間隔
plt.tight_layout()
plt.show()
補(bǔ)充
本示例數(shù)據(jù)(1850-2018年全球平均氣溫距基準(zhǔn)平均氣溫的變化數(shù)據(jù))可以從 Global temperature anomaly datasets 網(wǎng)站上獲取。
函數(shù)調(diào)用方式、數(shù)據(jù)格式,以及上述代碼中用到的一些函數(shù)等,可以參見(jiàn)原博客: http://gaohr.win/site/blogs/2019/2019-10-08-dynamic-plot-matplotlib.html
附數(shù)據(jù)靜態(tài)圖:
聯(lián)系客服