免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 3754|回复: 17
收起左侧

利用Python Matplotlib实现数据动态可视化

[复制链接]

13

主题

8790

铜板

16

好友

教授级高工

Rank: 12Rank: 12Rank: 12

积分
1358
QQ
发表于 2019-10-15 13:41 | 显示全部楼层 |阅读模式
本帖最后由 斩之浪 于 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基础

对于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


附数据静态图:







突然发觉,还有很多事等我去做。

13

主题

8790

铜板

16

好友

教授级高工

Rank: 12Rank: 12Rank: 12

积分
1358
QQ
 楼主| 发表于 2019-10-15 14:43 | 显示全部楼层
我只是保存了草稿,也会贴出来:funk::funk:
突然发觉,还有很多事等我去做。
回复 支持 反对

使用道具 举报

0

主题

598

铜板

1

好友

助理工程师

Rank: 5Rank: 5

积分
114
发表于 2019-10-16 16:03 | 显示全部楼层
学习一下,不影响吧
回复 支持 反对

使用道具 举报

13

主题

8790

铜板

16

好友

教授级高工

Rank: 12Rank: 12Rank: 12

积分
1358
QQ
 楼主| 发表于 2019-10-16 16:37 | 显示全部楼层
逆着光 发表于 2019-10-16 16:03
学习一下,不影响吧

不是,只是还没编辑好,暂时保存了,再打开发现已经贴出来了,可能是我点错哪里了
突然发觉,还有很多事等我去做。
回复 支持 反对

使用道具 举报

3

主题

1万

铜板

4

好友

高级工程师

Rank: 9Rank: 9Rank: 9

积分
792
发表于 2019-11-19 15:17 | 显示全部楼层
呵呵,不明觉厉~先支持一个
回复 支持 反对

使用道具 举报

0

主题

110

铜板

0

好友

技术员

Rank: 3Rank: 3

积分
15
发表于 2019-11-25 11:05 | 显示全部楼层
十分感谢
回复

使用道具 举报

0

主题

3141

铜板

6

好友

地信院士

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
2491
发表于 2021-5-27 09:37 | 显示全部楼层
学习一下!
回复

使用道具 举报

5

主题

4402

铜板

3

好友

高级工程师

Rank: 9Rank: 9Rank: 9

积分
983
发表于 2021-9-22 16:27 | 显示全部楼层
英文不好
学习编程好难
回复 支持 反对

使用道具 举报

0

主题

3967

铜板

1

好友

教授级高工

Rank: 12Rank: 12Rank: 12

积分
1713
发表于 2021-10-7 17:42 | 显示全部楼层
谢谢分享
回复

使用道具 举报

0

主题

1万

铜板

2

好友

地信院士

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
2542
发表于 2021-12-16 10:49 | 显示全部楼层
感谢分享,支持
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表