使用python动态生成波形曲线的实现


Posted in Python onDecember 04, 2019

效果是这个样子的:

使用python动态生成波形曲线的实现

用到的模块:

* matplotlib.pyplot
* matplotlib.animation.FuncAnimation
* numpy

三个圆的半径分别为:5, 2, 1。

三个点旋转的角频率分别为:1, 3, 5。

生成固定的圆——基础圆

xdata = np.linspace(0, 2 * np.pi, 50)
fig, ax = plt.subplots(1, 1, figsize=(8, 5))
b_cir = ax.plot(5 * np.cos(xdata), 5 * np.sin(xdata))

# 配置下画布
ax.spines['bottom'].set_visible(False)  # 清除下脊
ax.spines['top'].set_visible(False)    # 清除上脊
ax.spines['left'].set_visible(False)   # 清除左脊
ax.spines['right'].set_visible(False)   # 清除右脊
# 取消刻度和数字标签
ax.tick_params(bottom='off', left='off', labelbottom='off', labelleft='off')

使用python动态生成波形曲线的实现

生成第1个移动点

  根据圆上点的坐标公式,更新点的位置:

x = r * cos(w * t) + a 
y = r * sin(w * t) + b

def update(frame):
  movX1 = 5 * np.cos(frame * 1)
  movY1 = 5 * np.sin(frame * 1)
  movp1.set_data(movX1, movY1)  # 更新移动点数据
  return movp1,   # 还是得有','
ani = FuncAnimation(fig, update, frames=xdata, blit=True)

使用python动态生成波形曲线的实现

生成第1个移动圆

  根据坐标系中任意位置上圆的公式,计算移动的圆。

c_sub1, = ax.plot([], [], animated=True)
# 修改 update 函数生成在基础圆上移动的圆
def update(frame):
  # 计算移动点
  # 计算移动圆
  c_sub1X = 2 * np.cos(xdata) + movX1
  c_sub1Y = 2 * np.sin(xdata) + movY1
  # 更新移动点数据
  c_sub1.set_data(c_sub1X, c_sub1Y)
  return movp1, c_sub1,

使用python动态生成波形曲线的实现

生成第2个移动点和移动圆

   生成的方式和前面的类似

movp2, = ax.plot([], [], 'ro', animated=True)
c_sub2, = ax.plot([], [], animated=True)
def update(frame):
# 计算第1个移动点和圆
# 计算第2个移动点和圆
movX2 = movX1 + 2 * np.cos(frame * 3)
movY2 = movY1 + 2 * np.sin(frame * 3)
c_sub2X = 1 * np.cos(xdata) + movX2
c_sub2Y = 1 * np.sin(xdata) + movY2

# 更新第1个移动点和圆
# 更新第2个移动点和圆
movp2.set_data(movX2, movY2)
c_sub2.set_data(c_sub2X, c_sub2Y)
return movp1, c_sub1, movp2, c_sub2,

使用python动态生成波形曲线的实现

生成波形曲线

  生成的波形曲线,其实就是3个圆生成的正弦曲线的叠加值:

sineTotal = sine1 + sine2 + sine3

sine, = ax.plot(xdata + 10, np.zeros(50))
def update(frame):
# 计算第1个移动点和圆
# 计算第2个移动点和圆
# 计算波形曲线的 y 值
s = 5 * np.sin((xdata+frame) * 1) + \
  2 * np.sin((xdata+frame) * 3) + \
  1 * np.sin((xdata+frame) * 5)

# 更新第1个移动点和圆
# 更新第2个移动点和圆
# 更新波形曲线
sine.set_ydata(s)
return movp1, c_sub1, movp2, c_sub2, sine,

使用python动态生成波形曲线的实现

加条直线指示下

  直线就是,第3个移动圆上的移动点与波形末端的连线。

movp3, = ax.plot([], [], 'ro', animated=True) # 添加第3个圆上的移动点
ln, = ax.plot([], [], animated=True)
def update(frame):
# 计算第1个移动点和圆
# 计算第2个移动点和圆
# 计算波形曲线的 y 值
# 计算第3个移动点
movX3 = movX2 + 1 * np.cos(frame * 5)
movY3 = movY2 + 1 * np.sin(frame * 5)

# 更新第1个移动点和圆
# 更新第2个移动点和圆
# 更新波形曲线
ln.set_data([movX3, 10 + 2 * np.pi], [movY3, movY3])
return movp1, c_sub1, movp2, c_sub2, sine, movp3, ln

使用python动态生成波形曲线的实现

保存 gif 动图

ani.save("multiSin.gif", writer='imagemagick', fps=200, dpi=50)

  这里用到“imagemagick”来进行动图的保存。但在使用前需要配置些内容:

1. 安装 imagemagick,下载地址是:http://www.imagemagick.org/script/download.php;

2. 修改matplotlibrc文件进行配置,可通过下面语句查看文件存放路径:

import matplotlib
matplotlib.matplotlib_fname()

  在文件末尾取消“animation.convert_path”的注释;

3. 修改__init__.py文件,打开文件后查找rcParams(),在下一行添加:

rcParams['animation.convert_path'] = '[imagemagick的安装路径]\\ImageMagick-7.0.8-Q16\\magick.exe'

在以前的imagemagick版本,有个文件是convert.exe,新版本这个文件取消了,功能整合到“magick.exe”中了。

修改完成后就可以使用上面的语句生成gif动图了。

以上这篇使用python动态生成波形曲线的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用python分析git log日志示例
Feb 27 Python
Python简明入门教程
Aug 04 Python
Python利用operator模块实现对象的多级排序详解
May 09 Python
浅谈python 线程池threadpool之实现
Nov 17 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
Jun 13 Python
基于numpy中数组元素的切片复制方法
Nov 15 Python
python自动化测试之如何解析excel文件
Jun 27 Python
Django MEDIA的配置及用法详解
Jul 25 Python
利用Python检测URL状态
Jul 31 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
Jan 24 Python
PYcharm 激活方法(推荐)
Mar 23 Python
PyTorch在Windows环境搭建的方法步骤
May 12 Python
python3实现绘制二维点图
Dec 04 #Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
Dec 04 #Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
Dec 04 #Python
Python绘制二维曲线的日常应用详解
Dec 04 #Python
使用python远程操作linux过程解析
Dec 04 #Python
基于Python检测动态物体颜色过程解析
Dec 04 #Python
如何用OpenCV -python3实现视频物体追踪
Dec 04 #Python
You might like
php 如何获取数组第一个值
2013/08/06 PHP
php制作文本式留言板
2015/03/18 PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
2016/03/14 PHP
Thinkphp微信公众号支付接口
2016/08/04 PHP
AES加解密在php接口请求过程中的应用示例
2016/10/26 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
2017/07/10 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
IE DOM实现存在的部分问题及解决方法
2009/07/25 Javascript
Jquery ThickBox插件使用心得(不建议使用)
2010/09/08 Javascript
jQuery之$(document).ready()使用介绍
2012/04/05 Javascript
js制作简易年历完整实例
2015/01/28 Javascript
JavaScript调用浏览器打印功能实例分析
2015/07/17 Javascript
angularjs学习笔记之完整的项目结构
2015/09/26 Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
2015/11/04 Javascript
浅谈JavaScript正则表达式-非捕获性分组
2017/03/08 Javascript
微信小程序 图片上传实例详解
2017/05/05 Javascript
Bootstrap与Angularjs的模态框实例代码
2017/08/03 Javascript
详解Ubuntu安装angular-cli遇到的坑
2018/09/08 Javascript
详解webpack打包nodejs项目(前端代码)
2018/09/19 NodeJs
Vue 3.0 全家桶抢先体验
2020/04/28 Javascript
python查询mysql中文乱码问题
2014/11/09 Python
python中的装饰器详解
2015/04/13 Python
修改Python的pyxmpp2中的主循环使其提高性能
2015/04/24 Python
在Python中append以及extend返回None的例子
2019/07/20 Python
python的time模块和datetime模块实例解析
2019/11/29 Python
如何基于Python制作有道翻译小工具
2019/12/16 Python
在python中使用pyspark读写Hive数据操作
2020/06/06 Python
python中rb含义理解
2020/06/18 Python
Python lxml库的简单介绍及基本使用讲解
2020/12/22 Python
Python Selenium库的基本使用教程
2021/01/04 Python
美国尼曼百货官网:Neiman Marcus
2019/09/05 全球购物
用Java语言将一个键盘输入的数字转化成中文输出
2013/01/25 面试题
学习雷锋寄语大全
2014/04/11 职场文书
党员剖析材料范文
2014/09/30 职场文书
初中班长竞选稿
2015/11/20 职场文书
django注册用邮箱发送验证码的实现
2021/04/18 Python