使用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基础教程之循环介绍
Aug 29 Python
使用Python脚本操作MongoDB的教程
Apr 16 Python
Python对数据库操作
Mar 28 Python
Python AES加密模块用法分析
May 22 Python
python实现识别手写数字 python图像识别算法
Mar 23 Python
解决Tensorflow使用pip安装后没有model目录的问题
Jun 13 Python
基于Python实现定时自动给微信好友发送天气预报
Oct 25 Python
Python遍历文件夹 处理json文件的方法
Jan 22 Python
Django后端接收嵌套Json数据及解析详解
Jul 17 Python
使用python分析统计自己微信朋友的信息
Jul 19 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
Oct 18 Python
Python数据正态性检验实现过程
Apr 18 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 采集程序原理分析篇
2010/03/05 PHP
PHP json_decode函数详细解析
2014/02/17 PHP
PHP中使用imagick实现把PDF转成图片
2015/01/26 PHP
php强制更新图片缓存的方法
2015/02/11 PHP
Zend Framework过滤器Zend_Filter用法详解
2016/12/09 PHP
laravel 中某一字段自增、自减的例子
2019/10/11 PHP
showModalDialog 和 showModelessDialog
2007/01/22 Javascript
JavaScript 撑出页面文字换行
2009/06/15 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
JavaScript中Date对象的常用方法示例
2015/10/24 Javascript
浅谈JavaScript 标准对象
2016/06/02 Javascript
简洁实用的BootStrap jQuery手风琴插件
2016/08/31 Javascript
JSON中key动态设置及JSON.parse和JSON.stringify()的区别
2016/12/29 Javascript
JavaScript获取当前时间向前推三个月的方法示例
2017/02/04 Javascript
vue2.0实现导航菜单切换效果
2017/05/08 Javascript
vue.js 左侧二级菜单显示与隐藏切换的实例代码
2017/05/23 Javascript
JavaScript实现创建自定义对象的常用方式总结
2018/07/09 Javascript
用node.js写一个jenkins发版脚本
2019/05/21 Javascript
解决layui表格内文本超出隐藏的问题
2019/09/12 Javascript
layui之数据表格--与后台交互获取数据的方法
2019/09/29 Javascript
用Angular实现一个扫雷的游戏示例
2020/05/15 Javascript
Electron整合React使用搭建开发环境的步骤详解
2020/06/07 Javascript
Python使用Matplotlib实现雨点图动画效果的方法
2017/12/23 Python
新手常见6种的python报错及解决方法
2018/03/09 Python
tensorflow模型继续训练 fineturn实例
2020/01/21 Python
pycharm中如何自定义设置通过“ctrl+滚轮”进行放大和缩小实现方法
2020/09/16 Python
HTML5验证以及日期显示的实现详解
2013/07/05 HTML / CSS
马德里著名的运动鞋商店:NOIRFONCE
2019/04/12 全球购物
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
法国亚马逊官方网站:Amazon.fr
2020/12/19 全球购物
硅酸盐工业控制专业应届生求职信
2013/11/02 职场文书
八年级语文教学反思
2014/02/11 职场文书
金融学专业大学生职业生涯规划
2014/03/07 职场文书
股东出资证明书(正规版)
2014/09/24 职场文书
2015年党风廉政建设责任书
2015/01/29 职场文书
退休职工欢送会致辞
2015/08/01 职场文书