python动画库_创造⽣动有趣的动画,Matplotlib库⼤显⾝⼿全⽂共2153字,预计学习时长4分钟或更长
⽤Matplotlib模拟⾬
动画是呈现各种现象的有趣⽅式。在描述像过去⼏年的股票价格、过去⼗年的⽓候变化、季节性和趋势等时间序列数据时,与静态图相⽐,动画更能说明问题。因为,从动画中,我们可以看到特定参数是如何随时间⽽变化的。
上图是模拟⾬的图像。此图由Matplotlib绘图库绘制⽽成,该绘图库常常被认为是python可视化数据包的原始数据组。Matplotlib通过50个分散点的⽐例和不透明度来模拟⾬滴落在平⾯上的情景。如今,Plotly、Bokeh、Altair等⼀系列可视化⼯具均为Python中强⼤的可视化⼯具。这些库可实现最先进的动画和交互动作。但是,本⽂重点在于研究数据库的⼀个⽅⾯——动画。同时,我们也将关注实现动画的⽅法。
概述
Matplotlib是⼀个 Python 的 2D绘图库,也是Python中最受欢迎的绘图数据库。⼤多数⼈在踏上数据可视化之旅时,都是⾸选Matplotlib。这是因为它可简单地⽣成绘图,直⽅图、功率谱、条形图、错误图、散点图等。不仅如此,它还⽆缝连接了Pandas、Seaborn等数据库,甚⾄创建出更为复杂的可视化数据。
Matplotlib有⼏⼤优点:
· 其构造和MATLAB(矩阵实验室)类似,所以两者间易于切换
· 包含许多后端渲染
· 可以快速⽣成绘图
· 已存在数⼗年以上,因此,有⼤量的⽤户基础
但是,Matplotlib除了这些优点之外,也有许多不⾜之处:
· Matplotlib常常不可避免地存在冗繁的API(应⽤程序编程接⼝)
· 有时默认样式设计不如⼈意
· 对web和交互式图表的⽀持较低
· 处理⼤型及复杂的数据时速度常常较慢
对于进修者来说,Datacamp中有关于Matplotlib的必备知识可以帮助提⾼基础知识。
动画
Matplotlib的动画基类负责处理动画部分。其可提供构建动画功能的框架。有两个主要接⼝来实现此功能:
FuncAnimation:通过反复触发func.功能创建动画。
ArtistAnimation:利⽤已定义的Artist对象创建动画。
但是,在上述两种接⼝中,FuncAnimation更为⽅便。我们专注于FuncAnimation⼯具的研究。
要求
· 安装numpy和matplotlib模块。
· 安装符合要求的 ffmpeg 或imagemagick⽅可将动画以mp4或gif的形式储存。
⼀切准备就绪,就可以开始在JupyterNotebooks中制作第⼀个基本动画了。本⽂的访问密码可在GithubRepository中获取。
基本动画:移动的正弦波
在电脑中,利⽤FuncAnimation创建正弦波的基本动画。动画源代码可在Matplotlib动画教程中获取。先来看看输出代码,然后将其破译,并了解其中奥妙。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,
matplotlib中subplotanim = FuncAnimation(fig, animate, init_func=init,
frames=200, interval=20, blit=True)
anim.save('sine_wave.gif', writer='imagemagick')
· 在第7⾏到第9⾏,简单地创建⼀个图形窗⼝,图中只有⼀个轴。然后,创建⽆内容的⾏对象,其本质上是在动画中可修改的对象。稍后⽤数据来填充⾏对象。
· 在第11⾏到13⾏,创建init函数,触发动画发⽣。此函数初始化数据,并限定轴范围。
· 最后,在第14⾏到第18⾏,定义动画函数,该函数以帧数(i)作为参数,并创建⼀个正弦波(或任意其他的动画),⽽其移动取决于i的值。此函数返回⼀个已修改的plot对象的元组,告知动画框架plot中哪
些部分需要动画化。
· 在第20 ⾏,创建实际的动画对象。Blit参数确保只重新绘制已更改的部分。
· 这是在Matplolib中创建动画的基本知识。只需对代码稍作调整,就可以创建出⼀些有趣的可视化。接下来看看其中⼀些可视化的例⼦吧。
⼀个不断扩⼤的线圈
同样,在GreeksforGreeks中,有⼀个创建图形的好例⼦。我们⼀起在animation模块的帮助下创造⼀个缓慢展开的活动线圈。该代码和正弦波图极为相似,只有⼀些⼩调整。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 = [], []
# animation function
def animate(i):
# t is a parameter
t = 0.1*i
# x, y values to be plotted
x = t*np.sin(t)
y = s(t)
# appending new points to x, y axes points list
xdata.append(x)
ydata.append(y)
line.set_data(xdata, ydata)
return line,
# setting a title for the plot
plt.title('Creating a growing coil with matplotlib!')
# hiding the axis details
plt.axis('off')
# call the animator
anim = animation.FuncAnimation(fig, animate, init_func=init,
frames=500, interval=20, blit=True)
# save the animation as mp4 video file
anim.save('coil.gif',writer='imagemagick')
实时更新图
绘制股票数据、传感器数据等其他与时间相关的动态数据时,实时更新图就会派上⽤场。我们绘制⼀个基图,在更多的数据被输⼊系统后,基图就会⾃动更新。现在,来绘制某假定公司某⽉内的股价图。#importing libraries
import matplotlib.pyplot as plt
import matplotlib.animation as animation
fig = plt.figure()
#creating a subplot
ax1 = fig.add_subplot(1,1,1)
def animate(i):
data = open('','r').read()
lines = data.split('\n')
xs = []
ys = []
for line in lines:
x, y = line.split(',') # Delimiter is comma
xs.append(float(x))
ys.append(float(y))
ax1.clear()
ax1.plot(xs, ys)
plt.xlabel('Date')
plt.ylabel('Price')
plt.title('Live graph with matplotlib')
ani = animation.FuncAnimation(fig, animate, interval=1000)
plt.show()
现在,打开终端并运⾏python⽂件,可以得到如下所⽰可⾃动更新的图表:
其更新的时间间隔是1000毫秒或⼀秒。
3D图中的动画
创建3D图形⼗分常见,但是如果可以将这些图形视⾓动画化呢?其⽅法是,在改变相机视图后,利⽤⽣成后的所有图像来创建动画。⽽在PythonGraph Gallery(Python图形库)中有个专门的部分可以完成这类⼯作。
⾸先创建⼀个名为volcano的⽂件夹,放在与记事本相同的⽬录中。然后,将所有会⽤于动画化的图形储存在该⽂件夹中。# library
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
# Get the data (csv file is hosted on the web)
url = ''
data = pd.read_csv(url)
# Transform it to a long format
df=data.unstack().reset_index()
# And transform the old column name in something numeric
df['X']=pd.Categorical(df['X'])
df['X']=df['X'].des
# We are going to do 20 plots, for 20 different angles
for angle in range(70,210,2):
# Make the plot
fig = plt.figure()
ax = a(projection='3d')
ax.plot_trisurf(df['Y'], df['X'], df['Z'], viridis, linewidth=0.2)
ax.view_init(30,angle)
filename='Volcano/Volcano_step'+str(angle)+'.png'
plt.savefig(filename, dpi=96)
这样就可以在Volcano⽂件夹中创建多个PNG⽂件。接着,利⽤ImageMagick(⼀个创建、编辑、合成图⽚的软件)将这些PNG⽂件转化成动画。打开终端并导向Volcano⽂件夹,输⼊以下指令:convert -delay 10 Volcano*.pnganimated_volcano.gif
利⽤Celluloid模块动画化
Celluloid是python中的⼀个模块,其在matplotlib中可简化创建动画的进程。这个库创建⼀个matplotlib
图并从中创建相机。然后,重新启⽤该图,并在创建每帧动画后,⽤上述相机拍快照。最后,利⽤所有捕捉到的帧创建动画。
安装pip install celluloid
下⾯是利⽤Celluloid模块的例⼦:
极⼩值from matplotlib import pyplot as plt
from celluloid import Camera
fig = plt.figure()
camera = Camera(fig)
for i in range(10):
plt.plot([i] * 10)
camera.snap()
animation = camera.animate()
animation.save('celluloid_minimal.gif', writer = 'imagemagick')
⼦图import numpy as np
from matplotlib import pyplot as plt
from celluloid import Camera
fig, axes = plt.subplots(2)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。