使用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用GET方法上传文件
Mar 10 Python
Python之自动获取公网IP的实例讲解
Oct 01 Python
用python实现百度翻译的示例代码
Mar 09 Python
python调用staf自动化框架的方法
Dec 26 Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
Jan 05 Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
Mar 13 Python
对Python3中列表乘以某一个数的示例详解
Jul 20 Python
django实现支付宝支付实例讲解
Oct 17 Python
torch 中各种图像格式转换的实现方法
Dec 26 Python
PYQT5 vscode联合操作qtdesigner的方法
Mar 24 Python
python实现从ftp上下载文件的实例方法
Jul 19 Python
Python函数__new__及__init__作用及区别解析
Aug 31 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读取msn上的用户信息类
2008/12/05 PHP
PHP判断文件是否存在、是否可读、目录是否存在的代码
2012/10/03 PHP
thinkphp5引入公共部分header、footer的方法详解
2018/09/14 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
javascript 写的一个简单的timer
2009/07/30 Javascript
JavaScript 编写匿名函数的几种方法
2010/02/21 Javascript
网络之美 JavaScript中Get和Set访问器的实现代码
2010/09/19 Javascript
textarea中的手动换行处理的jquery代码
2011/02/26 Javascript
jQuery ajax 路由和过滤器使用说明
2011/08/02 Javascript
页面只能打开一次Cooike如何实现
2012/12/04 Javascript
HTML复选框和单选框 checkbox和radio事件介绍
2012/12/12 Javascript
JS完成代码前最好对其做5件事
2013/04/07 Javascript
JS日期和时间选择控件升级版(自写)
2013/08/02 Javascript
jQuery中阻止冒泡事件的方法介绍
2014/04/12 Javascript
深入浅析JavaScript中的scrollTop
2016/07/11 Javascript
js 数字、字符串、布尔值的转换方法(必看)
2017/04/07 Javascript
nodejs 终端打印进度条实例代码
2017/04/22 NodeJs
解决JS外部文件中文注释出现乱码问题
2017/07/09 Javascript
js断点调试心得分享(必看篇)
2017/12/08 Javascript
jQuery实现的滑块滑动导航效果示例
2018/06/04 jQuery
Element Input组件分析小结
2018/10/11 Javascript
Python教程之全局变量用法
2016/06/27 Python
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
详解K-means算法在Python中的实现
2017/12/05 Python
python 使用正则表达式按照多个空格分割字符的实例
2018/12/20 Python
PIL对上传到Django的图片进行处理并保存的实例
2019/08/07 Python
jupyter实现重新加载模块
2020/04/16 Python
python基于爬虫+django,打造个性化API接口
2021/01/21 Python
HTML5 embed 标签使用方法介绍
2013/08/13 HTML / CSS
24个canvas基础知识小结
2014/12/17 HTML / CSS
HTML5 SEO优化的一些建议
2020/08/27 HTML / CSS
外贸主管求职简历的自我评价
2013/10/23 职场文书
无偿献血倡议书
2014/04/14 职场文书
自动化专业大学生职业生涯规划范文:爱拚才会赢
2014/09/12 职场文书
基层党员干部四风问题整改方向和措施
2014/09/25 职场文书
关于感谢信的范文
2015/01/23 职场文书