我的编程空间,编程开发者的网络收藏夹
学习永远不晚

利用 Python 让图表动起来

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

利用 Python 让图表动起来

MatplotlibSeaborn这类Python库可以画出很好看的图,但是这些图只是静态的,难以动态且美观地呈现数值变化。要是在你下次的演示、视频、社交媒体Po文里能用短视频呈现数据变化,是不是很赞呢?更棒的是,你还是可以在你的图表上用MatplotlibSeaborn或者其他库!

本文将使用美国国家药物滥用研究所和疾病预防控制中心公布的药物数据,可在此处下载:https://http://www.drugabuse.gov/sites/default/files/overdosedata1999-2015.xls

我们会用到的数据是这样的:

我们将用MatplotlibSeaborn绘图,用NumpyPandas处理数据。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类型的数据结构。因为我们要针对不同类药物的滥用画图,写个函数来载入感兴趣的特定行的数据能避免重复代码。(小编注:原文提供的代码在读取excel文件的时候使用了已废弃的sheetname参数,本文中已修正为sheet_name)


overdoses = pd.read_excel('overdose_data_1999-2015.xls',sheet_name='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}

接下来我们初始化一个ffmpeg Writer并以20帧每秒、1800比特率进行录屏。你也可以根据喜好自行设置这些值。


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

小编注:如果出现 RuntimeError:RequestedMovieWriter(ffmpeg)notavailable的报错,请自行安装ffmpeg,装了brewMac可以直接: brew install ffmpeg

现在我们创建一个有几个标签的图形。确保设置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表示动画中帧的索引。使用这个索引可以选择应在此帧中可见的数据范围。然后我使用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)


我们用调用了 animate 函数并定义了帧数的 matplotlib.animation.FuncAnimation来开始动画, frames实际上定义了调用 animate的频率。


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

你可以用 ani.save()把动画保存为mp4,如果你想直接看一看动画效果可以用plt.show()


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

现在我们的图表动起来啦:

动画能够正常运行但是感觉有点跳跃,所以我们需要在已有数据点之间增加更多的数据点来使动画的过渡平滑。于是我们使用另一个函数 augment


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 函数的帧数。在这里我用参数 numsteps=10调用 augment函数,也就是增加数据点至160个,并且设置 frames=160 。这样以来,图表显得更为平滑,但还是在数值变动处有些突兀。

为了让我们的动画更平滑美观,我们可以增加一个平滑函数(具体请见:https://www.swharden.com/wp/2008-11-17-linear-data-smoothing-in-python/ )。


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 smoothed

另外我们也可以加上一点颜色和样式参数,让图表更个性化。


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

当当当!如此我们便得到了文章开头的动画图表。

这篇文章仅仅只是matplotlib动画功能的一个例子,你大可以用它来实现任何一种图表的动画效果。简单调整 animate()函数内的参数和图表类型,就能得到无穷无尽的可能性。

到此这篇关于利用 Python 让图表动起来的文章就介绍到这了,更多相关Python 让图表动起来内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

利用 Python 让图表动起来

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么用Python让图片人物动起来

本篇内容主要讲解“怎么用Python让图片人物动起来”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Python让图片人物动起来”吧!其中通过在静止图像中动画对象产生视频有无数的应用跨越的领
2023-06-15

怎么利用Python+AI使静态图片动起来

这篇文章主要介绍“怎么利用Python+AI使静态图片动起来”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么利用Python+AI使静态图片动起来”文章能帮助大家解决问题。类似于下面这种效果:最左
2023-07-02

VUE 列表过渡:让你的页面动起来!

VUE 列表过渡是一种神奇的技术,它可以让你在页面上添加动态列表,从而让你的页面变得更加生动和有趣。VUE 列表过渡非常简单易用,即使你是前端开发的新手,也可以轻松掌握。
VUE 列表过渡:让你的页面动起来!
2024-02-11

Python first-order-model怎么实现让照片动起来

这篇文章主要介绍“Python first-order-model怎么实现让照片动起来”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python first-order-model怎么实现让照片动起
2023-07-02

VUE Nuxt.js 过渡效果:让你的应用动起来!

Nuxt.js 为 Vue.js 提供了许多开箱即用的特性,其中包括内置的过渡效果。这些过渡效果可以帮助您轻松地创建平滑的动画,让您的应用程序更具交互性。
VUE Nuxt.js 过渡效果:让你的应用动起来!
2024-02-10

AWT 动画技术揭秘:让你的用户界面动起来

AWT 动画技术赋予 Java GUI 动感元素,增强用户参与度。通过理解其原理和应用,开发者可以创建引人注目的动画效果,提升用户体验。
AWT 动画技术揭秘:让你的用户界面动起来
2024-03-08

navicat表与表之间怎么用视图连接起来

在 navicat 中通过视图连接表可实现便捷的数据访问和查询:创建视图,使用 sql 语句将所需字段从不同表中连接在一起。连接视图,将创建好的视图拖放到查询编辑器中。执行查询,输入 sql 查询并执行即可查看连接后的数据。Navicat中
navicat表与表之间怎么用视图连接起来
2024-04-24

Python利用D3Blocks绘制可动态交互的图表

今天小编给大家来介绍一款十分好用的可视化模块,D3Blocks,不仅可以用来绘制可动态交互的图表,并且导出的图表可以是HTML格式,方便在浏览器上面呈现,感兴趣的可以了解一下
2023-02-03

用 HTML5 画布标签制作动画指南:让你的网页动起来

本文将介绍如何使用 HTML5 画布标签创建动画,让您的网页动起来。我们将通过一些简单的例子来演示如何使用画布标签,包括如何创建基本形状、如何填充和描边形状,以及如何使用动画函数来创建动画效果。
用 HTML5 画布标签制作动画指南:让你的网页动起来
2024-02-25

Python如何利用D3Blocks绘制可动态交互的图表

本篇内容主要讲解“Python如何利用D3Blocks绘制可动态交互的图表”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python如何利用D3Blocks绘制可动态交互的图表”吧!热力图热力图
2023-07-05

如何利用JavaScript优化页面加载性能,让你的网站飞起来

JavaScript 可以让您的网站更具互动性,但它也可能会降低页面加载速度。本文将介绍几种利用 JavaScript 优化页面加载性能的方法,帮助您让网站飞起来。
如何利用JavaScript优化页面加载性能,让你的网站飞起来
2024-02-26

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录