前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Matplotlib创建动画

使用Matplotlib创建动画

作者头像
fanjy
发布2022-04-13 14:02:54
1.4K0
发布2022-04-13 14:02:54
举报
文章被收录于专栏:完美Excel

标签:Python,Matplotlib库

Matplotlib是一个强大的Python绘图库,但许多人可能不知道它能够创建动画图。

图1

什么是动画?

简单地说,动画由一系列略微有些变化的静态图像组成。当把这些静态图像放在一起并快速翻阅时,我们的眼睛和大脑会欺骗我们,让我们觉得这些图像在移动(尽管它们不是)。

基于这种理解,要制作动画绘图,需要:

1.创建大量静态图像/图表

2.把它们按顺序翻动

可以使用pip安装matplotlib,只需在命令提示符/终端窗口中键入以下内容:

pip install matplotlib

使用Matplotlib制作动画

将用matplotlib制作一个简单的动画:一个在半径为1.5的圆中移动的红点。

首先,需要一个函数来计算圆的x和y坐标。这里没有使用x^2+y^2=r^2公式,而是使用圆的参数表示:

x = cos(t)

y = sin(t)

其中t是一个角度量

代码语言:javascript
复制
%matplotlib notebook
import matplotlib.pyplot as plt
import math
from matplotlib.animation import FuncAnimation
def circle_coords(r, step):
   coords = []
   t = 0
   while t < 2 * math.pi:
        coords.append((r*math.cos(t),r*math.sin(t)))
        t += step
   return coords
coords = circle_coords(1.5, 0.1)

代码运行后,coords内的结果如下图2所示。

图2

步骤1:创建一个静态图表

为坐标系coords中的第一组(x,y)坐标创建一个带有红点的图表。

代码语言:javascript
复制
fig, ax = plt.subplots()
ax.scatter(x=coords[0][0],y=coords[0][1],c='red', marker = 'o')

此代码在(1.5,0)处创建一个红点:

图3

步骤2:创建许多静态图表

下一步是创建大量略有变化的静态图表。将使用前5个坐标创建5个图表来说明这一点:

代码语言:javascript
复制
fig, axs = plt.subplots(nrows = 1,ncols = 5, figsize = (10, 5), tight_layout = True)
for i, ax in enumerate(axs):
   ax.scatter(x=coords[i][0],y=coords[i][1], c='red', marker='o')
   ax.set_xlim([0,2])
   ax.set_ylim([-0.5,2])

结果如下图4所示。

图4

如此狭窄的图表上是想说明,当浏览每个图表时,圆点是向上和向右移动的。

Matplotlib中的FuncAnimation模块

从技术上讲,只需要创建多个静态图表(每个坐标对应一个),然后将它们组合在一起,就会有一个动画。然而,matplotlib库提供了一个FuncAnimation模块来实现这一点。

要使用FuncAnimation,需要一个函数来绘制静态图表。绘图函数的名称无关紧要,这里将其命名为update():

1.绘图函数接受1个参数i,这意味着帧编号。

2.该函数将在每次调用开始时清除图表,因此在每一帧只会看到一个红点。

3.ax.set_xlim()和ax.set_ylim()函数以确保修复x轴和y轴。

4.ax.scatter()一次只画一个红点。

代码语言:javascript
复制
from matplotlib.animation import FuncAnimation
def update(i):
   ax.clear()
   ax.set_facecolor(plt.cm.Blues(.2))
   ax.set_xlim([-2,2])
   ax.set_ylim([-2,2])
   ax.set_title('circling')
   ax.scatter(x=coords[i][0],y=coords[i][1],c='red',marker='o')
   [spine.set_visible(False) for spine in ax.spines.values()] #移除图表轮廓

现在,有了绘图函数,可以创建FuncAnimation对象,它接受以下参数:

1.fig:要绘制的图形对象

2.func:绘图/更新函数

3.frames:要创建的帧数(静态图像)

4.interval:帧间延迟(毫秒)

甚至可以将动画保存为gif文件并发送给其他人:

代码语言:javascript
复制
fig, ax =plt.subplots(figsize=(6,6))
anime = FuncAnimation(
   fig = fig,
   func = update,
   frames = len(coords),
   interval = 50
)
anime.save('circle.gif')

有兴趣的朋友可以试试看!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档