数据可视化: matplotlib绘制动态图及3维动画

动画可以有趣地展示某种现象。相比于静态图表,人们更容易被动画和交互式的图表所吸引。在描绘时间序列数据时,动画更有意义,例如多年来股票价格的波动,过去十年气候的季节性变化和和趋势,因为我们可以看到特定参数如何随时间变化。

 

上图是用Matplotlib实现的雨滴模拟,Matplotlib库被人们亲切地称为Python可视化包的祖父。Matplotlib通过设置50个散射点的比例和不透明度的动画来模拟地表的雨滴。如今,python拥有大量强大的可视化工具,如plotly、bokeh、altair等等。这些库能够实现最先进的动画和交互。本文的目在于介绍matlibplot这个库的中不为人熟悉的一面,那就是动画。让我们一窥matplotlib的动画绘制。

概述

Matplotlib是一个python 2D绘图库,也是最流行的库之一。大多数人都是从Matplotlib开始他们的数据可视化之旅。使用matplotlib可以轻松生成plot图、柱状图、功率谱、柱状图、误差图、散点图等。它还与Pandas和Seaborn等库无缝集成,以创建更复杂的可视化效果。

Matplotlib的一些优点是:

  • 它的设计类似于matlab,因此在两者之间切换相当容易。
  • 包含许多渲染后端。
  • 几乎可以绘制任何种类的图表。
  • 已经存在了十多年世界,具有巨大的用户基础。

然而,也有一些方面,Matplotlib并没有那么耀眼,落后于其强大的对手。

  • Matplotlib有一个命令式API,它通常过于冗长。
  • 有时风格欠佳。
  • 对Web和交互式图形的支持不足。
  • 对于大型和复杂的数据,速度通常较慢。

为了快速复习一下matplotlib的用法,这里有一个来自Datacamp的Cheat sheet.

动起来

matplotlib的动画基础类实现了动画的绘制。它提供了一个框架,内建动画功能。由两个主要的接口的实现:

  • FuncAnimation 通过周期性地调用函数func来制作动画。
  • ArtistAnimation:使用一个固定的 Artist对象绘制动画.

在这两种方法中, FuncAnimation用起来最方便,这是它的文档。

环境依赖

必要:安装numpy和matplotlib

可选:为了保存动画为mp4或gif格式,需要 ffmpeg or imagemagick (很多linux发行版自带).

入门:移动的sin曲线

这个例子来自于Matplotlib Animation tutorial,展示如何使用FuncAnimation创建一个基本的动画。

import numpy as np
from matplotlib import pyplot as plt
from matplotlib.animation import FuncAnimation
plt.style.use('seaborn-pastel')fig = plt.figure()
ax = plt.axes(xlim=(0, 4), ylim=(-2, 2))
line, = ax.plot([], [], lw=3)def init():line.set_data([], [])return line,
def animate(i):x = np.linspace(0, 4, 1000)y = np.sin(2 * np.pi * (x - 0.01 * i))line.set_data(x, y)return line,anim = FuncAnimation(fig, animate, init_func=init,frames=100, interval=20, blit=True)anim.save('sine_wave.gif', writer='imagemagick')

运行之后,将在当前目录下生成一个gif文件。

解析:

在第7-9行,我们创建了一个图像窗口,设置了坐标轴的范围。关键在于,在第9行创建了一个空的line对象,之后将通过更新line的数据,实现动画效果。

在第11-13行,我们创建了初始化函数init,这个函数其实什么也没干,给了line对象空的数据。

第14-18行,我们第难以了动画函数animate,入参i是动画帧序号,根据i计算新的sin曲线数据,更新到line对象。

在第20行,我们利用之前所说的FuncAnimation()函数创建了对象anim,初始化时传入了figure对象,init()函数和animate()函数,以及帧数和更新时间。由于我们的sin函数是波长为1,显示4个周期,因此循环一个周期,也就是100帧,就可以实现前后相接的循环效果了。

 

示波器上的李萨如图形

画一个一个正弦信号毕竟too simple. 大学课堂的物理课使用示波器,肯定做过这样的实验:在阴极射线管示波器上使用x-y模式,x通道的正弦信号频率为f1,y通道的频率为f2,两者之间存在关系\frac{f_1}{f_2}=\frac{n}{m} \quad n,m \subseteq Z,随着n和m的不同,残留的光辉会变幻出各种图形,称之为李萨如(Liaasjous)图形。不管大家还记不记得,我们这就来画一个,直接上代码。

import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
import numpy as np 
plt.style.use('dark_background')fig = plt.figure() 
ax = plt.axes(xlim=(-50, 50), ylim=(-50, 50)) 
line, = ax.plot([], [], lw=2) # initialization function 
def init(): # creating an empty plot/frame line.set_data([], []) return line, # lists to store x and y axis points 
xdata, ydata = [], [] #simulate ghost effect of oscilloscope
def ghostImage(x,y):xdata.append(x)ydata.append(y)if len(xdata)>60:del xdata[0]del ydata[0]return xdata,ydata# animation function 
def animate(i): # t is a parameter t = i/100.0 # x, y values to be plotted x = 40*np.sin(2*2*np.pi*(t+0.3)) y = 40*np.cos(3*2*np.pi*t) # appending new points to x, y axes points list line.set_data(ghostImage(x,y)) return line, # setting a title for the plot 
plt.title('Creating a Lissajous figure with matplotlib') 
# hiding the axis details 
plt.axis('off') # call the animator	 
anim = animation.FuncAnimation(fig, animate, init_func=init, frames=400, interval=20, blit=True) # save the animation as gif file 
anim.save('figure.gif',writer='imagemagick') 

 

三维动画

三维图像具有更多的信息,如果让三维图像的观察角度运动起来,那将十分有意思。

现在我们用另外一种暴力的思路制作三维动画:首先绘制一幅三维图,然后每次改变一下视角,成为一帧。这里不再使用什么FuncAnimation函数了,直接将每帧保存成静态图片,然后合成为gif图。这样的好处在于,只要在原来的基础上增加一个循环,保存成多幅图像,就能合成动画。

我们来读入一幅图片test.jpg,用plot_surface画成3D图;然后在程序中改变视角,保存成多幅图片(运行前要新建一个目录animFram,用于写入图像)。

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt 
from PIL import Image
#import matplotlib.animation as animation 
import numpy as np img = Image.open('test.jpg')
grayImg = img.convert('L')
width, height = grayImg.size
X, Y = np.meshgrid(np.arange(0,width), np.arange(0,height))
#print(X)
Z = np.array(grayImg)
fig = plt.figure() 
ax = fig.gca(projection='3d')
ax.plot_surface(X,Y,Z, rstride=1, cstride=1, cmap='viridis')
transition = lambda x,N: (1+np.sin(-0.5*np.pi+2*np.pi*x / (1.0*N)))/2.0
for i in range (40):horiAngle=45+50*transition(i,40)vertAngle=50+43*transition(i,40)ax.view_init(vertAngle,horiAngle)filename='animFram/'+str('%03d'%i)+'.png'plt.savefig(filename, dpi=96)

然后使用ImageMagick的convert命令,将多幅静态帧转换成gif,使用以下命令:

convert -delay 10 *.png gif.gif

好了那就介绍到这,足够用了,外面有人敲门。

Ref:

https://towardsdatascience.com/animations-with-matplotlib-d96375c5442c

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/70110.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web移动端-part02(3D效果+动画)

一、空间转换(3D) 1、空间位移 transform:translate3d(x,y,z); 左手手心朝下握拳,大拇指方向为x轴正值方向,往下为y轴正值,往自己的方向为z轴正值记得写3d否则不生效 透视 近大远小,近实远虚&#xf…

Facebook广告效果差,转化低?跑赢同行的一手资源维睿互动奉上

每次上新都像参加一场没有出题范围的考试?想要提高新品广告投资回报率(ROAS),却不知道哪些广告操作才是提速“催化剂”? 很多时候跑facebook广告,但是出来的效果比较差,ctr很低,cpm很…

【Three.js】手把手教你在三维场景中实现人物行走动画效果

three.js的官方例程里面有个人物行走的案例,链接如下: three.js官方案例-人物行走 这里简单剖析下人物行走的原理: (1) 首先需要有个动画素材。gltf是可以集成动画的,像行人行走的动画,一般…

【Unity3D插件】Alembic插件分享《abc动画文件导入Unity》

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客QQ群:1040082875 文章目录 一、前言二、参考网站及下载三、正文abc文件导入abc导入Unity之后的格式AlembicStreamPlayer组件AlembicExporter组件 一、前言 今天分享一下Alembic插件的使用教程&…

Unity角色动画之面部动画——SALSA插件

目录 概述组件LipSyncEmoteREyes 2D面部动画搭建2D模型添加SALSA 2D组件添加RandomEyes2D组件运行效果 3D面部动画添加SALSA 3D组件添加RandomEyes3D组件运行效果 概述 SALSA(简单自动唇形同步近似)是一种实时系统,用于从音频输入创建唇形同…

家里两个孩子,你们会一个跟爸姓,一个跟妈姓吗?

生老大的时候,刚开始不知道男女,就取了好几个名字,四个月四维查出男孩,就确定了一个,把剩下的名字分给以后的弟弟或妹妹!后来意外二胎,没有查男女,老公就说要不二胎跟我姓吧&#xf…

Mother and child 妈妈与孩子

我拿起那条链子。她用双手接过它,向前探了探身,在我的脖子后把简易的项链钩系好。然后她向后退了几步,好像在看看是否合适。我低下头看着闪闪发亮的玻璃珠和已失去光泽的金色链子,然后抬起头望着她。我很认真地轻声说道&#xff1…

怎样要一个儿子和女儿

[转] 女人的最佳生育年限 及怎样要一个儿子和女儿 2011.11.30 阅读(4) 返回日志列表 转载(10.62万)分享评论复制地址更多 教你如何生一个漂亮宝宝,怕以后找不到,先收藏了1.教你如何生一个漂亮宝宝 2.男人的最佳生育年限 及怎样要一个儿子 3.受用一生的维…

Surrogate mother是代孕妈妈,那么,Surrogate parent呢?

文 / 王不留(微信公众号:王不留) 上午有位同学找我探讨了一个问题。 2021年3月20号刊《经济学人》有一篇文章《Panic Womb》(恐慌的子宫)。引言中有一段话“Conservatives fret that surrogate parents may be gay or …

Android开发之向桌面添加快捷方式

Android开发之向桌面添加快捷方式 对于一个希望拥有更多用户的应用来说,用户桌面可以说是所有软件的必争之地,如果用户在手机桌面上建立了该软件的快捷方式,用户将会更频繁地使用该软件。因此,所有 Android程序都应该允许用户把软…

如何为Android App 添加快捷方式

文章目录 概述效果好处 添加方式静态添加动态添加 概述 效果 好处 可以方便用户直接在桌面跳到目标页面可以让你的App显得更加专业(不过切忌添加过多,1-3个就够了) 添加方式 静态添加 在资源文件中添加 xml 目录,并在里面创建 shortcuts.xml 文件 …

Android之添加固定图标到桌面

我的QQ群 1 需求 Android之添加固定图标到桌面 2 部分实现 在AndroidManifest.xml里面添加如下权限 <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /><uses-permission android:name="com.android.launcher.perm…

Android中程序向桌面和Launcher添加快捷方式【安卓进化三十二】

最近感觉这个添加快捷方式挺有趣的&#xff0c;就查资料自己写了个demo---简单的例子&#xff0c;这个例子就是有两个按钮&#xff0c;点击“将此程序添加到快捷方式”&#xff0c;则手机桌面增加一个快捷方式&#xff0c;同时launcher中也多了一个快捷方式&#xff0c;点击退出…

Android 在Launcher桌面添加应用快捷图标(适用于Android 7.0(API24) 及以下)

Launcher为了应用程序能够定制自己的快捷图标&#xff0c;就注册了一个 BroadcastReceiver 专门接收其他应用程序发来的快捷图标定制信息。所以只需要根据该BroadcastReceiver构造出相对应的Intent并装入我们的定制信息&#xff0c;最后调用 sendBroadcast 方法就可以创建一个快…

Android 桌面工具,安卓怎样添加桌面工具

桌面工具(Widget)是Android系统的一大特色&#xff0c;通过桌面工具可以快速得到所需的信息&#xff0c;不必打开程序即可了解最新的内容。Android系统自带了一些常用的桌面工具&#xff0c;其他一些经过定制的系统也带有具有特色的桌面工具&#xff0c;同时&#xff0c;有很多…

【答辩问题】计算机专业本科毕业设计答辩技巧

下面是总结的一些答辩期间的问题&#xff08;结合论文中出现过的整理&#xff09; 1、MVC设计模式是指什么&#xff0c;其优缺点&#xff0c;怎样用到在你的程序里 2、SSM/SSH框架是指什么&#xff0c;其优缺点&#xff0c;怎样用到在你的程序里 3、前端用到了什么技术&…

基于SSM的毕业论文答辩系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

计算机专业毕业答辩问代码吗,计算机专业毕业论文答辩技巧

在做计算机毕业设计的整个过程中&#xff0c;一般有三个答辩&#xff0c;即开始答辩、中期答辩和最终答辩。有些学校简化为两个&#xff0c;即开题答辩和期末答辩。还有的学校将直接保留了最终答辩&#xff0c;省略了开始答辩和中期答辩。 当然不管你要参加几次答辩&#xff0c…

计算机专业毕业设计论文答辩PPT模板,10套计算机毕业设计答辩PPT模板

计算机专业毕业设计论文答辩PPT模板,10套计算机毕业设计答辩PPT模板 完整PPT模板包下载地址&#xff1a;计算机专业毕业设计论文答辩PPT模板 PPT模板预览 完整PPT模板包下载地址&#xff1a;10套计算机毕业设计答辩PPT模板

【答辩问题】计算机专业本科毕业设计答辩自述

各位老师,你们好!我叫XXX,来自计算机XX,我的论文题目是《在线考试系统》,论文是在XXX老师的指点下完成的,在这里我向X老师表示深深的谢意,向参加我的论文答辩各位老师表示衷心的感谢,并对我三年来的各位授课老师表示由衷的敬意。下面我将本论文设计的目的和主要内容向各位老师作…