在工作的过程中,我们会发现那些能够把知识、成果讲透的人很多都会做动态图表。

这篇文章就介绍了 Python 中一种简单的动态图表制作方法,这样生成的动图就可以丰富我们的PPT啦~

数据暴增的年代,数据科学家、分析师在被要求对数据有更深的理解与分析的同时,还需要将结果有效地传递给他人。如何让目标听众更直观地理解?当然是将数据可视化啊,而且最好是动态可视化。

本文将以线型图、条形图和饼图为例,系统地讲解如何让你的数据图表动起来

这些动态图表是用什么做的?

接触过数据可视化的同学应该对 Python 里的 Matplotlib 库并不陌生。它是一个基于 Python 的开源数据绘图包,仅需几行代码就可以帮助开发者生成直方图、功率谱、条形图、散点图等。这个库里有个非常实用的扩展包——FuncAnimation,可以让我们的静态图表动起来。

FuncAnimation 是 Matplotlib 库中 Animation 类的一部分,后续会展示多个示例。如果是首次接触,你可以将这个函数简单地理解为一个 While 循环,不停地在 “画布” 上重新绘制目标数据图。

如何使用 FuncAnimation?

这个过程始于以下两行代码:

import matplotlib.animation as anianimator = ani.FuncAnimation(fig, chartfunc, interval = 100)

从中我们可以看到 FuncAnimation 的几个输入:

fig 是用来 「绘制图表」的 figure 对象;

chartfunc 是一个以数字为输入的函数,其含义为时间序列上的时间;

interval 这个更好理解,是帧之间的间隔延迟,以毫秒为单位,默认值为 200。

这是三个关键输入,当然还有更多可选输入,感兴趣的读者可查看原文档,这里不再赘述。

下一步要做的就是将数据图表参数化,从而转换为一个函数,然后将该函数时间序列中的点作为输入,设置完成后就可以正式开始了。

在开始之前依旧需要确认你是否对基本的数据可视化有所了解。也就是说,我们先要将数据进行可视化处理,再进行动态处理。

按照以下代码进行基本调用。另外,这里将采用大型流行病的传播数据作为案例数据(包括每天的死亡人数)。

import matplotlib.animation as aniimport matplotlib.pyplot as pltimport numpy as npimport 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)

绘制三种常见动态图表

绘制动态线型图

如下所示,首先需要做的第一件事是定义图的各项,这些基础项设定之后就会保持不变。它们包括:创建 figure 对象,x 标和 y 标,设置线条颜色和 figure 边距等:

import numpy as npimport matplotlib.pyplot as pltcolor = ['red', 'green', 'blue', 'orange']fig = plt.figure()plt.xticks(rotation=45, ha="right", rotation_mode="anchor") #rotate the x-axis valuesplt.subplots_adjust(bottom = 0.2, top = 0.9) #ensuring the dates (on the x-axis) fit in the screenplt.ylabel('No of Deaths')plt.xlabel('Dates')

接下来设置 curve 函数,进而使用 .FuncAnimation 让它动起来:

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 anianimator = ani.FuncAnimation(fig, buildmebarchart, interval = 100)plt.show()

动态饼状图

可以观察到,其代码结构看起来与线型图并无太大差异,但依旧有细小的差别。

import numpy as npimport 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 anianimator = ani.FuncAnimation(fig, getmepie, interval = 200)plt.show()

主要区别在于,动态饼状图的代码每次循环都会返回一组数值,但在线型图中返回的是我们所在点之前的整个时间序列。返回时间序列通过 df1.head(i) 来实现,而. max()则保证了我们仅获得最新的数据,因为流行病导致死亡的总数只有两种变化:维持现有数量或持续上升。

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')

感兴趣的读者如想获得详细信息可参考:https://matplotlib.org/3.1.1/api/animation_api.html

-End-

python多张图片生成ppt_天呐,还能这么玩!用 Python 生成动态 PPT相关推荐

  1. python中df head_10招!看骨灰级Pythoner如何玩转Python

    原标题:10招!看骨灰级Pythoner如何玩转Python pandas是基于numpy构建的,使数据分析工作变得更快更简单的高级数据结构和操作工具.本文为大家带来10个玩转Python的小技巧,学 ...

  2. 【原来python还可以这么玩】python逆向爬取网易云评论进行情感分析

    遥遥微光,与我同行 好久不见,各位小伙伴们!嗐,春节真滴快啊!祝大家新年快乐! 书山有路勤为径,学海无涯苦作舟!又得开始愉快滴学习了! 小夜斗今天给大家伙分享一期干货,芜湖起飞! JS逆向网易云爬取评 ...

  3. python教学视频a_2019何老师一个月带你玩转Python分布式爬虫实战教程视频(视频+源码)...

    ├─章节1-爬虫前奏(官网免费) │ 001.爬虫前奏_什么是网络爬虫.mp4 │ 002.爬虫前奏_HTTP协议介绍.mp4 │ 003.爬虫前奏_抓包工具的使用网络请求.mp4 │ ├─章节2-网 ...

  4. python手势控制游戏_欢乐的计算机视觉-隔空玩游戏(python手势控制飞机大战)

    每个人儿时都有一个武侠梦,梦想自己有一天10块钱买到一本如来神掌,从此仗剑走天涯,不过在桃花岛,真的有一本秘籍:隔空玩游戏,今天,就带领大家翻阅翻阅这本秘籍. 这本秘籍全部都是用python来完成的哦 ...

  5. python课堂点名_Python制作课堂点名器,原来还能这么玩!

    Python制作课堂点名器,原来还能这么玩! 作者:PHPYuan 时间:2019-03-19 03:40:36 我们用的是Python中的Tkinter模块,我们大概做的功能有三个:随机点名 惩罚 ...

  6. 微课|玩转Python轻松过二级:第3章课后习题解答6

    适用教材: 董付国.<玩转Python轻松过二级>.清华大学出版社,2018. 第3章  详解Python序列结构 课后习题解答227-236题 课后习题解答237-247题 书购买链接 ...

  7. 微课|玩转Python轻松过二级:第3章课后习题解答5

    适用教材: 董付国.<玩转Python轻松过二级>.清华大学出版社,2018. 第3章  详解Python序列结构 课后习题解答180-200题 课后习题解答201-214题 课后习题解答 ...

  8. 微课|玩转Python轻松过二级:第3章课后习题解答4

    2019年3月8日-10日公众号送书活动:中小学生Python课应该学什么 =============== 适用教材: 董付国.<玩转Python轻松过二级>.清华大学出版社,2018. ...

  9. 微课|玩转Python轻松过二级:第3章课后习题解答3

    适用教材: 董付国.<玩转Python轻松过二级>.清华大学出版社,2018. 第3章  详解Python序列结构 课后习题解答103-115 课后习题解答116-129 课后习题解答13 ...

最新文章

  1. iOS 自定义UITabBar
  2. Attention!注意力机制模型最新综述(附下载)
  3. kubernetes的Service Account
  4. Create C++ Windows Forms Application in Visual Studio 2017
  5. vb初学者编程代码大全_学习VB编程第14天,一个简单的排序代码把我难住了
  6. bootstraptable控制分页_bootstrap table分页(前后端两种方式实现)
  7. 远控免杀专题(29)-C#加载shellcode免杀-5种方式(VT免杀率8-70)
  8. java 调用对象的方法_JAVA调用对象方法的执行过程
  9. Linux 下的Core Dump
  10. MySQL5.6优化了Order by排序limit
  11. 以命令行的方式运行activity
  12. mysql表分区数量限制_MySQL分区表的局限和限制详解
  13. java 19 - 5 Throwable的几个常见方法
  14. Unicode 编码表下载
  15. CrossApp_01
  16. mysql课设体会_课程设计心得体会8篇
  17. 半监督学习:semi-supervised learning 直推学习:transductive learning 主动学习:active learning
  18. 3.识别AP版本与胖转瘦
  19. 仅需一步,完美解决 0xc000007b 报错
  20. Excel中将人民币金额小写转成大写(转)

热门文章

  1. i3 1215U 和 i5 1235U选哪个好
  2. xzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  3. Neural Ordinary Differential Equations(NIPS2018)
  4. Monkey框架(测试方法篇) - monkey测试实例
  5. 英特尔OpenVINO使用入门(C++集成方式)
  6. zoj 3725 Painting Storages dp
  7. java visual linux,如何在 Linux 中安装 Visual Studio Code
  8. 【笔记】 node.js - 开启本地服务器,返回json数据
  9. 2014年爆火的脸萌,真的消失了吗?
  10. java接入顺丰快递api(有可运行demo)(包括下单、路由查询、路由推送、查询订单状态、取消订单)