python多张图片生成ppt_天呐,还能这么玩!用 Python 生成动态 PPT
在工作的过程中,我们会发现那些能够把知识、成果讲透的人很多都会做动态图表。
这篇文章就介绍了 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相关推荐
- python中df head_10招!看骨灰级Pythoner如何玩转Python
原标题:10招!看骨灰级Pythoner如何玩转Python pandas是基于numpy构建的,使数据分析工作变得更快更简单的高级数据结构和操作工具.本文为大家带来10个玩转Python的小技巧,学 ...
- 【原来python还可以这么玩】python逆向爬取网易云评论进行情感分析
遥遥微光,与我同行 好久不见,各位小伙伴们!嗐,春节真滴快啊!祝大家新年快乐! 书山有路勤为径,学海无涯苦作舟!又得开始愉快滴学习了! 小夜斗今天给大家伙分享一期干货,芜湖起飞! JS逆向网易云爬取评 ...
- python教学视频a_2019何老师一个月带你玩转Python分布式爬虫实战教程视频(视频+源码)...
├─章节1-爬虫前奏(官网免费) │ 001.爬虫前奏_什么是网络爬虫.mp4 │ 002.爬虫前奏_HTTP协议介绍.mp4 │ 003.爬虫前奏_抓包工具的使用网络请求.mp4 │ ├─章节2-网 ...
- python手势控制游戏_欢乐的计算机视觉-隔空玩游戏(python手势控制飞机大战)
每个人儿时都有一个武侠梦,梦想自己有一天10块钱买到一本如来神掌,从此仗剑走天涯,不过在桃花岛,真的有一本秘籍:隔空玩游戏,今天,就带领大家翻阅翻阅这本秘籍. 这本秘籍全部都是用python来完成的哦 ...
- python课堂点名_Python制作课堂点名器,原来还能这么玩!
Python制作课堂点名器,原来还能这么玩! 作者:PHPYuan 时间:2019-03-19 03:40:36 我们用的是Python中的Tkinter模块,我们大概做的功能有三个:随机点名 惩罚 ...
- 微课|玩转Python轻松过二级:第3章课后习题解答6
适用教材: 董付国.<玩转Python轻松过二级>.清华大学出版社,2018. 第3章 详解Python序列结构 课后习题解答227-236题 课后习题解答237-247题 书购买链接 ...
- 微课|玩转Python轻松过二级:第3章课后习题解答5
适用教材: 董付国.<玩转Python轻松过二级>.清华大学出版社,2018. 第3章 详解Python序列结构 课后习题解答180-200题 课后习题解答201-214题 课后习题解答 ...
- 微课|玩转Python轻松过二级:第3章课后习题解答4
2019年3月8日-10日公众号送书活动:中小学生Python课应该学什么 =============== 适用教材: 董付国.<玩转Python轻松过二级>.清华大学出版社,2018. ...
- 微课|玩转Python轻松过二级:第3章课后习题解答3
适用教材: 董付国.<玩转Python轻松过二级>.清华大学出版社,2018. 第3章 详解Python序列结构 课后习题解答103-115 课后习题解答116-129 课后习题解答13 ...
最新文章
- iOS 自定义UITabBar
- Attention!注意力机制模型最新综述(附下载)
- kubernetes的Service Account
- Create C++ Windows Forms Application in Visual Studio 2017
- vb初学者编程代码大全_学习VB编程第14天,一个简单的排序代码把我难住了
- bootstraptable控制分页_bootstrap table分页(前后端两种方式实现)
- 远控免杀专题(29)-C#加载shellcode免杀-5种方式(VT免杀率8-70)
- java 调用对象的方法_JAVA调用对象方法的执行过程
- Linux 下的Core Dump
- MySQL5.6优化了Order by排序limit
- 以命令行的方式运行activity
- mysql表分区数量限制_MySQL分区表的局限和限制详解
- java 19 - 5 Throwable的几个常见方法
- Unicode 编码表下载
- CrossApp_01
- mysql课设体会_课程设计心得体会8篇
- 半监督学习:semi-supervised learning 直推学习:transductive learning 主动学习:active learning
- 3.识别AP版本与胖转瘦
- 仅需一步,完美解决 0xc000007b 报错
- Excel中将人民币金额小写转成大写(转)
热门文章
- i3 1215U 和 i5 1235U选哪个好
- xzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- Neural Ordinary Differential Equations(NIPS2018)
- Monkey框架(测试方法篇) - monkey测试实例
- 英特尔OpenVINO使用入门(C++集成方式)
- zoj 3725 Painting Storages dp
- java visual linux,如何在 Linux 中安装 Visual Studio Code
- 【笔记】 node.js - 开启本地服务器,返回json数据
- 2014年爆火的脸萌,真的消失了吗?
- java接入顺丰快递api(有可运行demo)(包括下单、路由查询、路由推送、查询订单状态、取消订单)