ddxygq 2018-09-04
点击上方关注,All in AI中国
作者:Viviane K
在Python中使用Seaborn创建的美国吸食海洛因死亡人数趋势动画
Matplotlib和Seaborn是Python中的一些很好的绘图库,可以创建漂亮的图形。但这些图都是静态的,很难以动态和令人愉悦的方式描绘数据值的变化。如果在演示文稿、视频或社交媒体帖子中可以使用短视频剪辑来展示数据的发展,那该有多好?此外,你可以继续使用Matplotli、Seaborn或任何喜欢用于描述动态情节的库。
我最近为一部关于美国阿片类药物危机的简短纪录片制作了一些动态情节,所以我将在这篇文章中使用这些数据。 这些数据由美国国家药物滥用研究所和疾病预防控制中心公布,可在此处下载:https://www.drugabuse.gov/sites/default/files/overdose_data_1999-2015.xls。
在这篇文章中,我使用了Matplotlib,并添加Seaborn进行绘图,将Numpy与Pandas一起用于数据处理。对于动画,Matplotlib提供了一些我们可以使用的功能。因此,我们继续实施并导入所有依赖项。
现在,为了准备动画数据,我们只需加载它并将其放入Pandas DataFrame中。在制作关于不同阿片类药物过量的几个图表时,也可以方便地编写一个函数,来加载感兴趣的行中的数据。
现在让我们开始制作动画。
首先,如果你正在使用像我这样的jupyte记事本,那么最好使用matplotlib notebook记事本启动这个单元,这样你就可以立即在记事本中看到动画,而不仅仅是在保存之后。
在这个例子中,我现在使用get_data函数从表中检索海洛因过量数字,并将其打包到具有两列的Pandas DataFrame中。一列为年份,另一列为过量用药而死亡的人数。
接下来,我们初始化一个使用ffmpeg并以20 fps记录比特率为1800的编写器。你当然可以自己选择这些值。
现在我们创建一个带有一些标签的图形。确保设置x和y轴的限制,以便动画不会随当前显示的数据范围跳转。
动画的核心部分是动画函数,你可以在其中定义视频每帧中发生的事情。这里我表示动画中帧的索引。使用此索引,你可以选择应在此框架中可见的数据范围。在这之后我使用seaborn线性图来绘制这个数据选择。最后两行只是为了使情节看起来更令人愉悦。
要启动动画,请使用matplotlib.animation.FuncAnimation,在其中链接动画函数并定义动画应包含的帧数。因此,帧定义了动画(i)被调用的频率。
要将此动画保存为mp4,只需调用ani.save()即可。如果只想在保存之前查看它,请调用plt.show()
所以现在动画看起来像这样:
吸食海洛因过量死亡人数的动画—跃升
这种做法很有效,但它跳跃仍然非常频繁。为了避免它的跳跃,我们需要在已经拥有的数据点之间提供更多的数据点。为此,我们可以使用另一个函数,在这里称之为augment。
现在我们只需要将此函数应用于我们的数据,并增加matplotlib.animation.FuncAnimation函数中的帧数。在这里,采用numsteps = 10来调用augment,这意味着将训练数据增加到160个数据点,并且必须设置frames=160。其结果看起来更加平滑,但仍有一些尖锐的边缘,数据值会发生变化。
吸食海洛因过量死亡人数上升的动画—锋利边缘
为了消除这些缺陷,我们可以实现如下所述的平滑函数:
https://www.swharden.com/wp/2008-11-17-linear-data-smoothing-in-python/
此外,我们可以添加一些颜色和样式参数,使其情节看起来更加个性化。
这就是我们如何获得上面显示的最终结果。
这篇文章只是在一个例子中显示了matplotlib动画函数。当然,你可以将它用于任何想要动画的绘图。简单调整animate函数内的参数和绘图类型,而其可能性是无穷的。
我希望你会喜欢matplotlib这个功能,并且可以把应用到更多、更好的用途。如果你想查看我制作的所有图形的完整纪录片,并获得灵感,你可以在这里找到它:https://youtu.be/7xrvuSDLHiY