大数据分析之matplotlib秘技:让可视化图形动起来
沉沙 2019-02-20 来源 : 阅读 1528 评论 0

摘要:本篇文章探讨了大数据分析之matplotlib秘技:让可视化图形动起来,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。

本篇文章探讨了大数据分析之matplotlib秘技:让可视化图形动起来,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。

大数据分析之matplotlib秘技:让可视化图形动起来

其实matplotlib有一个少有人知的功能animation.FuncAnimation,可以接受你编写的动画函数创建动图。Viviane Kakerbeck通过一个例子展示了这一功能的用法,并介绍了通过增强数据和高斯平滑,让动图更美观的技巧。


美国的过量服用海洛因致死数,使用seaborn创建

Python的matplotlib和seaborn是非常好用的绘图库。但它们创建的都是静态图像,难以通过动态、美观的方式描述数据值的变化。如果你的下一次演示或者下一篇博客文章,能用动态图形展示数据的发展,该有多好?更妙的是,你可以继续使用matplotlib、seaborn或者其他你喜欢用的库。

我最近为一部关于美国的阿片样物质危机的纪录片制作了一些动态图形,所以我会在这篇文章中使用相关的数据。数据来自美国国家药物滥用研究所和CDC的公开数据,可以从以下网址下载:https://www.drugabuse.gov/sites/default/files/overdose_data_1999-2015.xls

本文将使用matplotlib和seaborn绘制图形,同时使用numpy和pandas处理数据。matplotlib提供了一些可以用来制作动画的函数。闲话少叙,让我们开始吧,首先,是引入所有依赖。

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.animation as animation

然后我们加载数据,将其转换成pandas的DataFrame。我还编写了一个辅助函数,可以从感兴趣的行加载数据,之后绘图会用到。

overdoses = pd.read_excel('overdose_data_1999-2015.xls',sheetname='Online',skiprows =6)

def get_data(table,rownum,title):
    data = pd.DataFrame(table.loc[rownum][2:]).astype(float)
    data.columns = {title}
    return data

准备就绪,下面是本文主要部分,如何绘制动画。

首先,如果你和我一样,用的是jupyter notebook,那么我建议你使用%matplotlib notebook指令,这样可以直接在notebook中查看动画效果,无需等待保存后再查看。

我使用了之前编写的辅助函数get_data取得海洛因服用过量数,并将其封装入一个两列的pandas DataFrame,一列表示年份,一列表示服用过量数。

%matplotlib notebook
title = 'Heroin Overdoses'
d = get_data(overdoses,18,title)
x = np.array(d.index)
y = np.array(d['Heroin Overdoses'])
overdose = pd.DataFrame(y,x)
#XN,YN = augment(x,y,10)
#augmented = pd.DataFrame(YN,XN)
overdose.columns = {title}

接着我们初始化一个写入器(writer),基于ffmpeg记录20 fps(比特率为1800)。当然,你可以按照需要调整这些参数。

Writer = animation.writers['ffmpeg']
writer = Writer(fps=20, metadata=dict(artist='Me'), bitrate=1800)

接下来创建一个带标签的图形。别忘了限定x轴和y轴的范围,以免动画在显示数据时出现跳跃现象。

fig = plt.figure(figsize=(10,6))
plt.xlim(19992016)
plt.ylim(np.min(overdose)[0], np.max(overdose)[0])
plt.xlabel('Year',fontsize=20)
plt.ylabel(title,fontsize=20)
plt.title('Heroin Overdoses per Year',fontsize=20)

制作动画的关键是定义一个动画函数,指定视频的每一帧发生了什么。这里i表示动画帧的索引。你可以选择在i帧中可见的数据范围。之后我使用seaborn的线图绘制选定数据。最后两行我调整了一些尺寸,使图形看起来更美观。

def animate(i):
    data = overdose.iloc[:int(i+1)]  # 选定数据范围
    p = sns.lineplot(x=data.index, y=data[title], data=data, color="r")
    p.tick_params(labelsize=17)
    plt.setp(p.lines,linewidth=7)

定义了动画函数后,使用matplotlib.animation.FuncAnimation定义动画应当包含多少帧,也就是说,通过frames参数定义调用animate(i)的频率。


本文由职坐标整理发布,学习更多的相关知识,请关注职坐标IT知识库!

本文由 @沉沙 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved