Python实现动态绘图的示例详解
作者:微小冷 发布时间:2021-07-08 16:44:40
示例
matplotlib
中的animation
提供了动态绘图功能,下面列举一个最简单的动态绘制三角函数的例子,来初步演示一下。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
fig, ax = plt.subplots(figsize=(5,3))
line, = ax.plot([], [], lw=1)
ax.grid()
def init():
ax.set_ylim(-1, 1)
ax.set_xlim(0, 10)
line.set_data([],[])
plt.tight_layout()
return line,
def animate(N):
x = np.arange(N)/10
y = np.sin(x)
line.set_data(x, y)
return line,
ani = animation.FuncAnimation(fig, animate, range(100), init_func=init, interval=40)
ani.save("ani_test_0.gif")
plt.show()
效果如下
其中,fig, ax
为绘图窗口和坐标轴,这是在任何绘图操作中都涉及到的元素,但在本例中的动态绘图操作中,ax
是以一种"全局变量"的形式存在的,将在后米娜的init
和animate
函数中被直接调用。
line
即为绘制在ax
之上的曲线,由于ax.plot
默认返回一个曲线列表,通过line,=
这样的方法,可以提取出曲线列表中的第0条曲线,其结果等价于
line = ax.plot([], [], lw=1)[0]
接下来init
函数用于绘图曲线的初始化,animate
用于调整绘图函数的动态变化,其输入N
暂时可以简单地理解为第N
张图像的曲线。
接下来,就是动态绘图的核心对象FuncAnimation
。
FuncAnimation
FuncAnimation
是一个类,其构造函数为
FuncAnimation(fig, func, frames=None, init_func=None, fargs=None, save_count=None, *, cache_frame_data=True, **kwargs)
前面的4个参数在示例程序中已经用到,fig
为绘图窗口;func
为图像更新函数;frames
为绘图帧号;init_func
为图像的初始化函数。
其绘图逻辑写成伪代码类似于
for n in frames:
if n>0:
draw(func(n))
else:
draw(init(n))
如果frames
是一个整数,则在调用时会自动转为range(frames)
。
而用于绘图的主要对象,就是坐标轴ax
,故而在示例中的animate
以及init
函数的返回对象是line,
,当然也可以写成return [line]
。
FuncAnimation
中的其他参数含义如下:
fargs
为绘图函数func
的其他输入参数save_count
缓存帧数interval
帧延时,默认200毫秒,帧率25fps对应40毫秒。repeat_delay
重复延时,单位是微秒repeat
为False
时,动画将只演示一遍。
三维情况
三维情况的动图绘制函数,机理与二维是相同的,下面引用官方画廊中的示例,来演示一下三维动图的绘制流程,首先生成一组随机行走的曲线
np.random.seed(19680801) # 随机数种子,便于复现
def random_walk(N, L=0.05):
st = np.random.random(3)
steps = np.random.uniform(-L, L, size=(N, 3))
walk = st + np.cumsum(steps, axis=0)
return walk
walks = [random_walk(30) for index in range(40)]
random_walk
可生成一条随机行走的三维曲线,walks
通过调用这个函数,共生成了40条曲线,下面就是对这40条曲线的调用
def animate(num, walks, lines):
for line, walk in zip(lines, walks):
line.set_data(walk[:num, :2].T)
line.set_3d_properties(walk[:num, 2])
return lines
fig = plt.figure(figsize=(5,4))
ax = fig.add_subplot(projection="3d")
lines = [ax.plot([], [], [], lw=1)[0] for _ in walks]
ax.set(xlim3d=(0, 1), xlabel='X')
ax.set(ylim3d=(0, 1), ylabel='Y')
ax.set(zlim3d=(0, 1), zlabel='Z')
ani = animation.FuncAnimation(
fig, animate, 30, fargs=(walks, lines), interval=100)
plt.show()
效果如下
来源:https://blog.csdn.net/m0_37816922/article/details/130482233


猜你喜欢
- 目前在网上搜到的利用 PyCharm 调试远程服务器程序的教程大多都是针对 PyCharm 2020、2019,甚至更早版本,PyCharm
- 引言本文讨论 ChatGTP 与 Node.js 的结合,由于最近在学 Remix, 考虑到 Remix 可以单独的作为 API 来使用,并
- 本文实例讲述了python实现string和dict的相互转换方法。分享给大家供大家参考,具体如下:字典(dict)转为字符串(string
- 在Python中,生成器和函数很像,都是在运行的过程中才会去确定各种变量的值,所以在很多情况下,会导致各种各样的问题。def generat
- 本文以实例形式简述了Python中字符串类型与字典类型相互转换的方法,是比较实用的功能。具体方法如下:一、字典(dict)转为字符串(str
- 今天天气"刚刚好"(薛之谦么么哒),无聊的我翻到了一篇关于csv文件读取与写入的帖子,作为测试小白的我一直对python
- 前言go不要求类型显示地声明实现了哪个接口,只要实现了相关的方法即可,编译器就能检测到空接口类型可以接收任意类型的数据:type eface
- 主要我是要解决一下几个问题: 1. apply和call的区别在哪里 2. apply的其他巧妙
- 本文实例讲述了Python装饰器decorator用法。分享给大家供大家参考。具体分析如下:1. 闭包(closure)闭包是Python所
- mysql的root账户,我在连接时通常用的是localhost或127.0.0.1,公司的测试服务器上的mysql也是localhost所
- JavaScript中,对象的extensible属性用于表示是否允许在对象中动态添加新的property。ECMAScript 3标准中,
- 前言随着Python3的普及,Selenium3也跟上了行程。而Selenium3最大的变化是去掉了Selenium RC,另外就是Webd
- 一、案例分析我们先思考一下,实现扫码工具需要写什么操作。在扫码过程中我们需要打开摄像头,如何由手机或者电脑识别二维码。所以我们要实现两个关键
- 本文实例讲述了python通过colorama模块在控制台输出彩色文字的方法。分享给大家供大家参考。具体分析如下:colorama是一个py
- 前言typescript作为未来前端开发的主流框架,在前端开发的过程中也会越来越主要,相信这篇文章会对你有很大的帮助!开发环境搭建创建min
- bcp是SQL Server中负责导入导出数据的一个命令行工具,它是基于DB-Library的,并且能以并行的方式高效地导入导出大批量的数据
- 手写数字识别算法import pandas as pdimport numpy as npfrom sklearn.neural_netwo
- flash_url : "../swfupload/swfupload_f8.swf" upload_url: &quo
- 组合集总计: group by with rollup/cube grouping sets 子查询按执行方式分:标准子查询、关联子查询 标
- 实例如下所示:import osimport stringpath = "/Users/U/workspace/python le