0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python中一种简单的动态图表制作方法

数据分析与开发 来源:机器之心 作者:机器之心 2021-02-04 15:58 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在读技术博客的过程中,我们会发现那些能够把知识、成果讲透的博主很多都会做动态图表。他们的图是怎么做的?难度大吗?这篇文章就介绍了 Python 中一种简单的动态图表制作方法。

83b42286-5fd2-11eb-8b86-12bb97331649.gif

数据暴增的年代,数据科学家、分析师在被要求对数据有更深的理解与分析的同时,还需要将结果有效地传递给他人。如何让目标听众更直观地理解?当然是将数据可视化啊,而且最好是动态可视化。 本文将以线型图、条形图和饼图为例,系统地讲解如何让你的数据图表动起来。

84f19dcc-5fd2-11eb-8b86-12bb97331649.gif

这些动态图表是用什么做的? 接触过数据可视化的同学应该对 Python 里的 Matplotlib 库并不陌生。它是一个基于 Python 的开源数据绘图包,仅需几行代码就可以帮助开发者生成直方图、功率谱、条形图、散点图等。这个库里有个非常实用的扩展包——FuncAnimation,可以让我们的静态图表动起来。 FuncAnimation 是 Matplotlib 库中 Animation 类的一部分,后续会展示多个示例。如果是首次接触,你可以将这个函数简单地理解为一个 While 循环,不停地在 “画布” 上重新绘制目标数据图。 如何使用 FuncAnimation? 这个过程始于以下两行代码:

importmatplotlib.animationasani animator=ani.FuncAnimation(fig,chartfunc,interval=100) 从中我们可以看到 FuncAnimation 的几个输入:

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

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

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

这是三个关键输入,当然还有更多可选输入,感兴趣的读者可查看原文档,这里不再赘述。 下一步要做的就是将数据图表参数化,从而转换为一个函数,然后将该函数时间序列中的点作为输入,设置完成后就可以正式开始了。 在开始之前依旧需要确认你是否对基本的数据可视化有所了解。也就是说,我们先要将数据进行可视化处理,再进行动态处理。 按照以下代码进行基本调用。另外,这里将采用大型流行病的传播数据作为案例数据(包括每天的死亡人数)。

importmatplotlib.animationasani importmatplotlib.pyplotasplt importnumpyasnp importpandasaspdurl='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(['UnitedKingdom','US','Italy','Germany']) &df['Province/State'].isna()]df_interest.rename( index=lambdax: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)绘制三种常见动态图表动态曲线图

88635180-5fd2-11eb-8b86-12bb97331649.gif

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

importnumpyasnp importmatplotlib.pyplotaspltcolor=['red','green','blue','orange'] fig=plt.figure() plt.xticks(rotation=45,ha="right",rotation_mode="anchor")#rotatethex-axisvalues plt.subplots_adjust(bottom=0.2,top=0.9)#ensuringthedates(onthex-axis)fitinthescreen plt.ylabel('NoofDeaths') plt.xlabel('Dates') 接下来设置 curve 函数,进而使用 .FuncAnimation 让它动起来: defbuildmebarchart(i=int): plt.legend(df1.columns) p=plt.plot(df1[:i].index,df1[:i].values)#noteitonlyreturnsthedataset,uptothepointi foriinrange(0,4): p[i].set_color(color[i])#setthecolourofeachcurveimportmatplotlib.animationasani animator=ani.FuncAnimation(fig,buildmebarchart,interval=100) plt.show()动态饼状图

8c06c506-5fd2-11eb-8b86-12bb97331649.gif

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

importnumpyasnp importmatplotlib.pyplotaspltfig,ax=plt.subplots() explode=[0.01,0.01,0.01,0.01]#popouteachslicefromthepiedefgetmepie(i): defabsolute_value(val):#turn%backtoanumber a=np.round(val/100.*df1.head(i).max().sum(),0) returnint(a) ax.clear() plot=df1.head(i).max().plot.pie(y=df1.columns,autopct=absolute_value,label='',explode=explode,shadow=True) plot.set_title('TotalNumberofDeaths '+str(df1.index[min(i,len(df1.index)-1)].strftime('%y-%m-%d')),fontsize=12)importmatplotlib.animationasani animator=ani.FuncAnimation(fig,getmepie,interval=200) plt.show() 主要区别在于,动态饼状图的代码每次循环都会返回一组数值,但在线型图中返回的是我们所在点之前的整个时间序列。返回时间序列通过 df1.head(i) 来实现,而. max()则保证了我们仅获得最新的数据,因为流行病导致死亡的总数只有两种变化:维持现有数量或持续上升。 df1.head(i).max()动态条形图

8cdb4c72-5fd2-11eb-8b86-12bb97331649.gif

创建动态条形图的难度与上述两个案例并无太大差别。在这个案例中,作者定义了水平和垂直两种条形图,读者可以根据自己的实际需求来选择图表类型并定义变量栏。 fig=plt.figure() bar=''defbuildmebarchart(i=int): iv=min(i,len(df1.index)-1)#theloopiteratesanextraonetime,whichcausesthedataframestogooutofbounds.Thiswastheeasiest(mostlazy)waytosolvethis:) objects=df1.max().index y_pos=np.arange(len(objects)) performance=df1.iloc[[iv]].values.tolist()[0] ifbar=='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('DeathsperCountry '+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: empmyfirstAnimation.gif')责任编辑:lq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    7348

    浏览量

    95013
  • 可视化
    +关注

    关注

    1

    文章

    1363

    浏览量

    22894
  • python
    +关注

    关注

    58

    文章

    4885

    浏览量

    90301

原文标题:让数据动起来:Python动态图表制作!

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    [VirtualLab] 使用Python运行VirtualLab Fusion光学仿真

    摘要 VirtualLab Fusion允许Python外部访问其建模技术、求解器和结果。这个用例介绍了一种使用路径变量和Visual Studio代码将Python连接到VirtualLab
    发表于 03-31 09:39

    列车360°动态图像检测系统 赋能列车高效安全检测

    列车360°动态图像检测系统是套专为列车运维检修设计的智能图像检测解决方案,该系统具有360°全车成像、智能故障诊断与数据驱动运维三大核心功能,显著提升列车检测效率与安全性。
    的头像 发表于 03-09 17:33 395次阅读
    列车360°<b class='flag-5'>动态图</b>像检测系统 赋能列车高效安全检测

    指令集测试的一种纠错方法

    本文描述在进行指令集测试的一种纠错方法 1.打开测试指令集对应的dump文件 dump文件是指由汇编文件进行反汇编之后,可以供人阅读指令的反汇编文件。其包含了每条指令的具体操作的信息。指令集测试
    发表于 10-24 14:04

    负电压的产生方法和应用场景

    电子电路中,负电压的产生往往需要特殊配置,但有一种利用运算放大器和地线的简单方法,将运算放大器配置为反相放大器,输入端接地,通过调整电阻和电源电压的参数,就能得到相对于地线的负输出电压。不过这只是负电压产生的其中一种方式,实际应
    的头像 发表于 10-16 09:47 1406次阅读

    Python中字符串逆序有几种方式,代码是什么

    对于个给定的字符串,逆序输出,这个任务对于python来说是一种简单的操作,毕竟强大的列表和字符串处理的些列函数足以应付这些问题 了,
    的头像 发表于 08-28 14:44 1267次阅读

    一种适用于动态环境的自适应先验场景-对象SLAM框架

    由于传统视觉SLAM在动态场景中容易会出现严重的定位漂移,本文提出了一种新颖的基于场景-对象的可靠性评估框架,该框架通过当前帧质量指标以及相对于可靠参考帧的场景变化,全面评估SLAM的稳定性。
    的头像 发表于 08-19 14:17 995次阅读
    <b class='flag-5'>一种</b>适用于<b class='flag-5'>动态</b>环境的自适应先验场景-对象SLAM框架

    一种适用于超低噪声应用的数字线性稳压器

    线性稳压器是一种简单的电压转换器,可将较高的输入电压转换为较低的输出电压。其行为特性就像动态电阻器,总是能够准确地调节至所需数值,确保在特定的电流下使设定的输出电压保持恒定。
    的头像 发表于 08-19 09:20 1671次阅读

    求助,关于tougfx显示问题求解

    使用stm32f469idisco 移植了个自己的屏幕的项目在使用动态图表的时候显示刷新如下 怎么来优化这个问题呢 ?
    发表于 08-13 06:33

    一种新的无刷直流电机反电动势检测方法

    无位置传感器无刷直流电机的控制算法是近年来研究的热点之,有霍尔位置信号直流电机根据霍尔状态来确定通断功率器件。利用无刷直流电机的数学模型,根据反电动势检测原理,提出了一种新的线反电动势检测方法
    发表于 08-07 14:29

    一种新的无刷直流电机反电动势检测方法

    无位置传感器无刷直流电机的控制算法是近年来研究的热点之,有霍尔位置信号直流电机根据霍尔状态来确定通断功率器件。利用无刷直流电机的数学模型,根据反电动势检测原理,提出了一种新的线反电动势检测方法
    发表于 08-04 14:59

    显著改善异步电机动态性能的磁链观测方法

    为了改善传统DTC系统中电压模型定子磁链观测器的动态性能差的问题,针对传统观测器存在的直流偏移和初始相位积分误差问题,提出了一种能显著改善异步电机动态性能的定子磁链观测方法。该
    发表于 07-15 14:42

    一种适用于动态环境的实时RGB-D SLAM系统

    了UP-SLAM,这是一种适用于动态环境的实时RGB-D SLAM系统。实验结果表明,UP-SLAM在定位精度方面(高出59.8%)和渲染质量方面(峰值信噪比高出4.57分贝)均优于最先进的方法,同时保持实时性能,并在
    的头像 发表于 07-04 15:14 1456次阅读
    <b class='flag-5'>一种</b>适用于<b class='flag-5'>动态</b>环境的实时RGB-D SLAM系统

    LLSM流媒体传输模块 高动态图像带宽稳定技术突破

    高清实时视频的能力。旦控制系统设定带宽上限为500K,那么在多种场景下,尤其是高动态图像环境下,带宽的波动始终会控制在这个范围内。我们在同场景的不同情况下(正
    的头像 发表于 05-27 17:58 1266次阅读
    LLSM流媒体传输模块  高<b class='flag-5'>动态图</b>像带宽稳定技术突破

    DTMB天线制作的几种简易图纸和方法 5分钟就做出来了

    目录: 八单元DTMB扇形振子宽频带DTMB定向天线 自制DTMB扇形UHF天线 自制DTMB天线之双菱天线制作方法 VHFUHF电视天线放大器电路图 近距离DTMB接收宽频带UHF天线 款UHF频段简易环形天线
    发表于 05-09 11:46

    U盘制作

    在电脑维修中启动盘很重要,靠谱的u盘键启动制作方法
    发表于 05-06 16:10 44次下载