本帖最后由 斩之浪 于 2019-10-15 13:57 编辑
以1850-2018年近170年的全球平均气温距基准平均气温(1961-1990年)的变化数据为例,利用matplotlib python库,绘制数据动态可视化图。
原文博客地址:http://gaohr.win/site/blogs/2019/2019-10-08-dynamic-plot-matplotlib.html
先预览一下动态效果图:
对于Matplotlib的安装、基本使用等,网络上资源很多,此处不再过多的介绍,在此附上官网链接,足够学习使用~ * 官方主页:https://matplotlib.org * 官方示例:https://matplotlib.org/gallery/index.html * 官方API:https://matplotlib.org/api/index.html
一般情况下,利用Matplotlib绘制动态图时,通常选择使用Matplotlib的animation模块,但是该模块的函数使用比较繁琐,不易学习,开发不灵活。因此,本文介绍一种相对比较简单的办法,利用动态绘图和暂停功能来实现,具体看代码和相应的注释。
绘制动态图的函数如下:
def Plot(x, y1, y2):
'''
Create plot
:param x: 时间变量数组
:param y1: 数据数组1
:param y2: 数据数组2
:return:
'''
fig, ax = plt.subplots(figsize=(14, 5)) # 创建窗口和子图
plt.tick_params(labelsize=16) # 设置刻度字体
# 设置时间轴格式
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')
# 设置x、y轴范围
# plt.xlim(x_min, x_max)
plt.ylim(-0.75, 1)
# 设置标签、添加刻度标线
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)
# 动态读取数据,绘制图形
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) # 设置时间间隔
plt.tight_layout()
plt.show()
本示例数据(1850-2018年全球平均气温距基准平均气温的变化数据)可以从 Global temperature anomaly datasets 网站上获取。
函数调用方式、数据格式,以及上述代码中用到的一些函数等,可以参见原博客: http://gaohr.win/site/blogs/2019/2019-10-08-dynamic-plot-matplotlib.html
附数据静态图:
|