使用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 随机数生成的代码的详细分析
May 15 Python
Python实现发送email的几种常用方法
Aug 18 Python
Python实现新浪博客备份的方法
Apr 27 Python
Python表示矩阵的方法分析
May 26 Python
python实现随机梯度下降(SGD)
Mar 24 Python
python3.5 tkinter实现页面跳转
Jan 30 Python
selenium+python自动化测试之多窗口切换
Jan 23 Python
python 自动轨迹绘制的实例代码
Jul 05 Python
Python利用matplotlib绘制约数个数统计图示例
Nov 26 Python
TensorFlow实现自定义Op方式
Feb 04 Python
在PyTorch中使用标签平滑正则化的问题
Apr 03 Python
python 发送get请求接口详解
Nov 17 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&mysql(三)
2006/10/09 PHP
php分页示例代码
2007/03/19 PHP
用来给图片加水印的PHP类
2008/04/09 PHP
php除数取整示例
2014/04/24 PHP
解决jquery的.animate()函数在IE6下的问题
2010/12/03 Javascript
使用Firebug对js进行断点调试的图文方法
2011/04/02 Javascript
js切换光标示例代码
2013/10/10 Javascript
移除AngularJS下URL中的#字符的方法
2015/06/19 Javascript
js仿黑客帝国字母掉落效果代码分享
2020/11/08 Javascript
jQuery使用中可能被XSS攻击的一些危险环节提醒
2016/05/24 Javascript
详解angularjs中的隔离作用域理解以及绑定策略
2017/05/31 Javascript
vue2.0 父组件给子组件传递数据的方法
2018/01/15 Javascript
Angular 封装并发布组件的方法示例
2018/04/19 Javascript
vue-router beforeEach跳转路由验证用户登录状态
2018/12/26 Javascript
JS实现返回上一页并刷新页面的方法分析
2019/07/16 Javascript
JS实现横向轮播图(初级版)
2020/06/24 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
Pyramid Mako模板引入helper对象的步骤方法
2013/11/27 Python
Python使用正则匹配实现抓图代码分享
2015/04/02 Python
Python sql注入 过滤字符串的非法字符实例
2020/04/03 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
2020/04/27 Python
使用CSS禁止textarea调整大小功能的方法
2015/03/13 HTML / CSS
澳大利亚手表品牌:Time IV Change
2018/10/06 全球购物
微软马来西亚官方网站:Microsoft马来西亚
2019/11/22 全球购物
草莓网中国:StrawberryNet中国
2020/08/17 全球购物
投资协议书范本
2014/04/21 职场文书
“向国旗敬礼”活动策划方案(4篇)
2014/09/27 职场文书
授权收款委托书范本
2014/10/10 职场文书
门面房租房协议书
2014/12/01 职场文书
十佳少年事迹材料
2014/12/25 职场文书
生日答谢词
2015/01/05 职场文书
投资公司董事长岗位职责
2015/04/16 职场文书
入党团支部推荐意见
2015/06/02 职场文书
《海上日出》教学反思
2016/02/23 职场文书
Python机器学习之基础概述
2021/05/19 Python
浅谈JavaScript浅拷贝和深拷贝
2021/11/07 Javascript