Python + matplotlib.animation 模拟斜抛运动动画(含完整代码)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- Abstract
- Introduction
- Matplotlib.animation
- Physics model and Code
- Summary
Abstract
本文用于记录,使用 python + matplotlib 库绘制模拟动画的个人笔记和经验总结。
使用 matplotlib.animation.FuncAnimation 绘制斜抛运动模拟动画。
Introduction
通常而言,对于数据的可视化呈现多以静态图主,如散点图,折线图等。这类图可用 matplotlib 库或者 seaborn 库中的对应方法实现绘制。比较好奇的是,如何用 python 绘制动态图?
上网一顿手忙脚乱,发现 matplotlib 官网文档上,就有动图的案例1。其中使用的是 matplotlib.animation 这个类。接下来我们就研究一下这个类的方法,以及应用一个简单的物理斜抛模型来进行测试。
Matplotlib.animation
先简单记录一下 matplotlib.animation:
由继承图可知,animation 类中主要由 ArtistAnimation2 和 FuncAnimation3 这两个子类继承。二者的原理(API接口)略有不同。前者是预先给定一系列固定的artist对象,再生成动画;后者则是通过反复调用我们预先给定的某个 “func” 函数,来生成模拟动画。通俗来讲,(个人理解)即是,ArtistAnimation 是类似动画片(幻灯片),预先给定每一帧的数据,然后再让画面动起来;而 FuncAnimation 则类似实时计算,实时生成动画。
本文中我们先试用 FuncAnimation3:
其中几个主要参数:
- fig:传入你的 figure 对象
- func:传入你的模型函数,理解为某个时间依赖的函数,例如 f(r,t)f(r,t)f(r,t)
- frames:即帧数,传入时间(序列) t
- init_func:初始化一些参数
Physics model and Code
方便起见 (懒,用简单的) ,模拟斜抛运动。
运动方程为:
{x=v0sin(θ)ty=v0cos(θ)t−gt22\begin{cases} x = v_0 \sin \left( \theta \right) t \\ y = v_0 \cos \left( \theta \right) t - \frac{gt^2}{2}\\ \end{cases} {x=v0sin(θ)ty=v0cos(θ)t−2gt2
python 实现:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation%matplotlib qt5
# 这里我用的是jupyter, 加上这一行,使模拟动画能以独立窗口的形式呈现。
# 若用 inline 模式,似乎会出问题。
# 运动方程
def data_generate(t, v0, theta):x = v0 * np.cos(theta) * ty = v0 * np.sin(theta) * t - 0.5 * g * t * treturn x, y# 模型 func
def model(t, v0, theta):x, y = data_generate(t, v0, theta)x_posi.append(x)y_posi.append(y)line.set_data(x_posi, y_posi)point.set_data(x, y)return line, point# 初始化画布参数
def init():ax.set_xlim(-1, 20)ax.set_ylim(-20, 10)del x_posi[:]del y_posi[:]line.set_data(x_posi, y_posi)point.set_data(x_posi, y_posi)return line, point# 设置初始条件
v0 = 10 # m/s
theta = np.radians(45) # rad
g = 9.8 # m/s2x_posi, y_posi = [], []
fig, ax = plt.subplots()
line, = ax.plot([], [], ',-')
point, = ax.plot([], [], '.')t = np.linspace(0, 5, 50)ani = animation.FuncAnimation(fig, model, frames=t, init_func=init,fargs=(v0, theta), repeat=False)
plt.show()
# 保存
ani.save('xpyd.gif', writer='imagemagick')
Summary
本文只用了 FuncAnimation 类,而 ArtistAnimation 的运用,下篇 blog 再更新。
代码根据文档中案例修修改改,举一反三。
最后的结果动图中坐标轴没画,以及一些细节改天再更新吧。
https://matplotlib.org/stable/gallery/index.html#animation ↩︎
https://matplotlib.org/stable/api/_as_gen/matplotlib.animation.ArtistAnimation.html ↩︎
https://matplotlib.org/stable/api/_as_gen/matplotlib.animation.FuncAnimation.html ↩︎ ↩︎
Python + matplotlib.animation 模拟斜抛运动动画(含完整代码)相关推荐
- python matplotlib animation制作世界人口变动动画
python matplotlib animation制作世界人口变动动画 主要利用animation 做了个世界人口动画,数据从网上下载的.做成json格式的.读入pandas.没有放数据, 只是弄 ...
- matlab模拟斜抛运动60,大学物理教学改革论文,关于大学物理教学方法改革-Matlab的妙用相关参考文献资料-免费论文范文...
导读:本文是一篇关于大学物理教学改革论文范文,可作为相关选题参考,和写作参考文献. (1.长江师范学院大学物理教研室 重庆 408100, 2.内蒙古工业大学 理学院物理系 内蒙古呼和浩特 01005 ...
- python飞机大战,感受python的乐趣(详细中文解读,含完整代码)
python飞机大战 本文章代码是根据<python编程从入门到实践>(第2版)编写而成. 1.外星人部分代码 import pygame from pygame.sprite impor ...
- 三维场景中斜抛运动顶点的生成
三维场景中斜抛运动顶点的生成 1 算法思想-斜抛运动 2 代码 3 参考文献 1 算法思想-斜抛运动 2 代码 void getparabola_vertex_2(glm::vec3 _Point, ...
- android金币动效_Android 仿余额宝数字跳动动画效果完整代码
一:想都不用想的,有图有真相,看着爽了,在看下面源码 二:实例源码分析 ①:首先定义接口 package com.demo.tools.view; /** * 数字动画自定义 * * @author ...
- android 文字跳动动画,Android 仿余额宝数字跳动动画效果完整代码
Android 仿余额宝数字跳动动画效果完整代码 发布时间:2020-08-24 06:55:30 来源:脚本之家 阅读:120 作者:曾淘 一:想都不用想的,有图有真相,看着爽了,在看下面源码 二: ...
- 老男孩Python自动化开发12期完整版(含作业代码课件)
老男孩Python自动化开发12期完整版(含作业代码课件) 链接:https://pan.baidu.com/s/1zCKn_VjstbCfTYCHCBKZgQ 密码:zujz 转载于:https:/ ...
- Python批量处理大量excel数据(含完整代码)
Python批量处理excel数据(含完整代码) pandas库可以有效的处理excel.csv和txt文件,并能多格式将数据重新保存为excel.csv和txt文件. 一.导入数据 利用pandas ...
- 【动手教你学故障诊断:Python实现Tensorflow+CNN深度学习的轴承故障诊断(西储大学数据集)(含完整代码)】
项目名称 动手教你学故障诊断:Python实现基于Tensorflow+CNN深度学习的轴承故障诊断(西储大学数据集)(含完整代码) 项目介绍 该项目使用tensorflow和keras搭建深度学习C ...
最新文章
- 安装和使用Smokeping(二)
- localhost 和 127.0.0.1
- oracle 自动补全函数,Oracle自我补充之trunc()函数的使用方法
- 四则运算表达式求值(栈的应用)
- TreeMap集合特点、排序原理
- pycharm cant open file_PyCharm
- C++ I/O 流 格式控制(上)
- matlab 小波启发式阈值滤波,小波阈值去噪
- opencv 绘制图像轮廓
- swoole各种服务器初步搭建
- MYSQL获取自增ID的四种方法
- 网易云数据库架构设计实践
- 知名公司GitHub官网
- 阿里 Lindorm 数据库联手 Hightopo ,开启工业物联超融合存储模式
- 大学十年(一个程序员的路程)(林锐博士)《1----9》【林锐的大学10年】
- java一个球左右躲避障碍_java 飞机躲避小游戏分析及实现[源码][附图]
- rimraf与windows的rmdir简单使用命令方法
- Linux-5.10源代码之网络系统简介:
- NVIDIA TensorRT (python win10)安装成功分享
- valist的使用方法(队可变参数的处理)