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

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

3天内不再提示

使用matplotlib和seaborn绘制图形

zhKF_jqr_AI 来源:未知 作者:李倩 2018-09-18 09:07 次阅读

编者按:其实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(1999, 2016)

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)的频率。

ani = matplotlib.animation.FuncAnimation(fig, animate, frames=17, repeat=True)

之后只需调用ani.save()就可以将动画保存为mp4文件。如果你想在保存之前先看下效果,那么可以使用plt.show()。

ani.save('HeroinOverdosesJumpy.mp4', writer=writer)

好了,让我们来看下效果。

看起来效果还可以,但是感觉有点抖动。为了缓解抖动的现象,我们可以在已有数据中插入一些中间值,平滑一下。为此我们定义以下的数据增强函数:

def augment(xold,yold,numsteps):

xnew = []

ynew = []

for i in range(len(xold)-1):

difX = xold[i+1]-xold[i]

stepsX = difX/numsteps

difY = yold[i+1]-yold[i]

stepsY = difY/numsteps

for s in range(numsteps):

xnew = np.append(xnew,xold[i]+s*stepsX)

ynew = np.append(ynew,yold[i]+s*stepsY)

return xnew,ynew

之后我们只需在数据上应用这一增强函数,并相应地增加matplotlib.animation.FuncAnimation函数中的帧数。这里我调用augment函数时使用了参数numsteps=10,也就是说,我将数据点增加到160个,相应地,帧数设置为frames=160。增强数据之后,结果看起来平滑了很多,但在数据值变动处,曲线仍有一些尖角,看起来不是特别美观。

为了让图像看起来更美观,我们实现了一个高斯平滑函数:

def smoothListGaussian(listin,strippedXs=False,degree=5):

window=degree*2-1

weight=np.array([1.0]*window)

weightGauss=[]

for i in range(window):

i=i-degree+1

frac=i/float(window)

gauss=1/(np.exp((4*(frac))**2))

weightGauss.append(gauss)

weight=np.array(weightGauss)*weight

smoothed=[0.0]*(len(listin)-window)

for i in range(len(smoothed)): smoothed[i]=sum(np.array(listin[i:i+window])*weight)/sum(weight)

return smoothe

我在这里不会讨论高斯平滑的细节,感兴趣的读者可以看这篇文章:https://www.swharden.com/wp/2008-11-17-linear-data-smoothing-in-python/

最后我们略微调整下颜色和风格,就得到了文章开头的动态图形:

sns.set(rc={'axes.facecolor':'lightgrey', 'figure.facecolor':'lightgrey','figure.edgecolor':'black','axes.grid':False})

本文通过一个例子展现了matplotlib动画函数的用法。当然,你可以将它用在任何你想要动画化的图形上。只需调整animate()函数中的参数和图形类型,便有无限可能。

我希望你喜欢matplotlib的整个功能,并能善加利用。另外,如果你对我之前提到的纪录片感兴趣,可以在YouTube上查看:https://youtu.be/7xrvuSDLHiY

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

    关注

    2

    文章

    1063

    浏览量

    40041
  • 可视化
    +关注

    关注

    1

    文章

    1020

    浏览量

    20554
  • python
    +关注

    关注

    51

    文章

    4675

    浏览量

    83466

原文标题:matplotlib秘技:让可视化图形动起来

文章出处:【微信号:jqr_AI,微信公众号:论智】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    VC绘制图形的示例(含源代码)

    VC绘制图形的示例(含源代码) [hide][/hide]
    发表于 05-10 10:13

    【安富莱】【STemWin教程】第10章 2-D图形库之绘制图形

    `第10章 2-D图形库之绘制图形 本期主要讲解2-D图形库的图形绘制,包括绘制多边形,
    发表于 03-25 11:21

    第10章 2-D图形库之绘制图形

    转stemwin教程本期主要讲解2-D图形库的图形绘制,包括绘制多边形,绘制圆,绘制椭圆,
    发表于 10-12 10:13

    学习Python大数据与机器学习必会Matplotlib知识

    ]5、调用plot (x,y) 绘制图形并显示6、创建figure对象,在 [0,0,1,1] 和 [0.2,0.5,.4,.4]创建两个坐标轴7、使用x,y,z数组创建图形如下图所示,注意x,y
    发表于 07-05 17:57

    国产CAD制图软件中闭合命令的使用技巧

    在使用浩辰CAD制图软件绘制图纸的过程中,如果存在不闭合的图形,有些操作就会无法进行,比如在填充时候则需要填充区域是封闭的。那么怎么才能将图形闭合呢?接下来和小编一起来看看国产CAD浩
    发表于 08-11 15:10

    CAD制图初学入门:如何在CAD制图软件中添加焊接符号?

    在使用浩辰CAD制图软件绘制图纸的过程中,有些CAD制图初学入门者不知道该如何使用正版CAD软件进行焊接标注。那么接下来小编就以浩辰CAD机械软件为例给大家详细介绍一下焊接符号的相关CAD制图
    发表于 08-20 10:47

    C语言绘制图像梯度图原理介绍

    *2401、采集原始图像配置ESP32输出灰度图,像素太高无法存储及处理。320*240= 75K。2、图像梯度计算参考代码:C语言绘制图像梯度图 原理介绍:图像的梯度 h...
    发表于 01-11 06:36

    如何将单片机摄像头读取回传的RGB数组绘制图

    咚咚咚的关于使用Matlab————将单片机摄像头读取回传的RGB数组绘制图片(一)效果展示(二)源码分享(三)需要改进的地方及不足(一)效果展示(二)源码分享(Excel部分函数)=HEX2BIN
    发表于 01-20 07:13

    如何使用emWin的API绘制图形

    应用程序: 此示例代码使用 emWin 的 API 绘制图形, 可以用作按钮, 更改面板上文字编辑的值 。 BSP 版本:M480系列BSP CMSIS V3.03.001 硬件
    发表于 08-23 07:37

    M480使用emWin的API绘制图形

    应用程序: 此示例代码使用 emWin 的 API 绘制图形, 可以用作按钮, 更改面板上文字编辑的值 。 BSP 版本:M480系列BSP CMSIS V3.03.001 硬件
    发表于 08-30 08:58

    查找和绘制图片轮廓矩

    《OpenCV3编程入门》书本配套源代码:查找和绘制图片轮廓矩
    发表于 06-06 15:20 3次下载

    OpenCV3编程入门-源码例程全集-查找和绘制图片轮廓矩

    OpenCV3编程入门-源码例程全集-查找和绘制图片轮廓矩
    发表于 09-17 22:54 2次下载

    OpenGL绘制图形单元的技巧介绍

    OpenGL要求:指定顶点的命令必须包含在glBegin函数之后,glEnd函数之前(否则指定的顶点将被忽略)。在调用glBegin函数时,我们需要传入一个参数,以告诉OpenGL我们将绘制什么类型的图元。
    发表于 05-07 08:31 2615次阅读

    在MAX32650评估板的LCD面板上如何绘制图形

    在系列视频的第三部分,学习如何寻址屏幕存储器,在MAX32650评估板的LCD面板上绘制简单图形。在下节视频“开始移动”中,学习如何设置运动的对象。
    的头像 发表于 10-11 03:34 3287次阅读

    python中matplotlibseaborn介绍

    的使用和分析,而数据的整合最好的方式就是使用可视化的方式将数据变现出来。 matplotlib和seabornde介绍 在Python中,我们可以使用matplotlib库和seaborn库来生成各种图表。
    的头像 发表于 10-07 11:16 613次阅读
    python中<b class='flag-5'>matplotlib</b>和<b class='flag-5'>seaborn</b>介绍