使用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 cookielib 登录人人网的实现代码
Dec 19 Python
Python操作json数据的一个简单例子
Apr 17 Python
用Python中的wxPython实现最基本的浏览器功能
Apr 14 Python
简单说明Python中的装饰器的用法
Apr 24 Python
Java Web开发过程中登陆模块的验证码的实现方式总结
May 25 Python
浅谈python socket函数中,send与sendall的区别与使用方法
May 09 Python
python使用adbapi实现MySQL数据库的异步存储
Mar 19 Python
Python Numpy计算各类距离的方法
Jul 05 Python
Django 实现图片上传和显示过程详解
Jul 18 Python
利用PyQt中的QThread类实现多线程
Feb 18 Python
python 装饰器功能与用法案例详解
Mar 06 Python
Flask response响应的具体使用
Jul 15 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的分页功能
2007/03/21 PHP
用PHP程序实现支持页面后退的两种方法
2008/06/30 PHP
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
2008/11/14 PHP
php 从数据库提取二进制图片的处理代码
2009/09/09 PHP
laravel 字段格式化 modle 字段类型转换方法
2019/09/30 PHP
js getElementsByTagName的简写方式
2010/06/27 Javascript
Jquery插件 easyUI属性汇总
2011/01/19 Javascript
actionscript与javascript的区别
2011/05/25 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
2015/08/06 Javascript
Javascript设计模式理论与编程实战之简单工厂模式
2015/11/03 Javascript
浅谈javascript中的三种弹窗
2016/10/21 Javascript
微信小程序开发(一) 微信登录流程详解
2017/01/11 Javascript
Angularjs上传文件组件flowjs功能
2017/08/07 Javascript
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
React 路由懒加载的几种实现方案
2018/10/23 Javascript
JS正则表达式验证密码强度
2020/03/18 Javascript
解决vue axios跨域 Request Method: OPTIONS问题(预检请求)
2020/08/14 Javascript
vue实现图片裁剪后上传
2020/12/16 Vue.js
Python中防止sql注入的方法详解
2017/02/25 Python
Python高级特性之闭包与装饰器实例详解
2019/11/19 Python
在tensorflow以及keras安装目录查询操作(windows下)
2020/06/19 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
2020/11/09 Python
CSS3实现水平居中、垂直居中、水平垂直居中的实例代码
2020/02/27 HTML / CSS
美国女士内衣在线折扣商店:One Hanes Place
2019/03/24 全球购物
澳大利亚儿童鞋在线:The Trybe
2019/07/16 全球购物
SQL SERVER面试资料
2013/03/30 面试题
大学生最常用的自我评价
2013/12/07 职场文书
2014年庆元旦活动方案
2014/02/15 职场文书
元旦红领巾广播稿
2014/02/19 职场文书
置业顾问岗位职责
2015/02/09 职场文书
暑期社会实践个人总结
2015/03/06 职场文书
让子弹飞观后感
2015/06/11 职场文书
2016年大学生党员公开承诺书
2016/03/24 职场文书
老生常谈 使用 CSS 实现三角形的技巧(多种方法)
2021/04/13 HTML / CSS
golang中切片copy复制和等号复制的区别介绍
2021/04/27 Golang