使用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调用shell的方法
Nov 20 Python
用Python实现一个简单的能够上传下载的HTTP服务器
May 05 Python
用Python遍历C盘dll文件的方法
May 06 Python
基于Python和Scikit-Learn的机器学习探索
Oct 16 Python
Python实现的端口扫描功能示例
Apr 08 Python
Python3实现的字典遍历操作详解
Apr 18 Python
Python3连接SQLServer、Oracle、MySql的方法
Jun 28 Python
Python简单I/O操作示例
Mar 18 Python
Python字符串、列表、元组、字典、集合的补充实例详解
Dec 20 Python
Python爬虫分析微博热搜关键词的实现代码
Feb 22 Python
Python Numpy库的超详细教程
Apr 06 Python
Python加密与解密模块hashlib与hmac
Jun 05 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图像处理类分享
2014/11/18 PHP
php实现猴子选大王问题算法实例
2015/04/20 PHP
php防止网站被攻击的应急代码
2015/10/21 PHP
浅谈PHP错误类型及屏蔽方法
2017/05/27 PHP
JavaScript Event学习第二章 Event浏览器兼容性
2010/02/07 Javascript
基于JQUERY的多级联动代码
2012/01/24 Javascript
JavaScript中的slice()方法使用详解
2015/06/06 Javascript
详解AngularJS中的表达式使用
2015/06/16 Javascript
avalon js实现仿微博拖动图片排序
2015/08/14 Javascript
angularjs自定义ng-model标签的属性
2016/01/21 Javascript
js计算时间差代码【包括计算,天,时,分,秒】
2016/04/26 Javascript
JS阻止事件冒泡行为和闭包的方法
2016/06/16 Javascript
JS刷新父窗口的几种方式小结(推荐)
2016/11/09 Javascript
JS中Array数组学习总结
2017/01/18 Javascript
JS常用知识点整理
2017/01/21 Javascript
jQuery加载及解析XML文件的方法实例分析
2017/01/22 Javascript
JS Testing Properties 判断属性是否在对象里的方法
2017/10/01 Javascript
Vue数据双向绑定原理及简单实现方法
2018/05/18 Javascript
浅谈HTTP 缓存的那些事儿
2018/10/17 Javascript
详解puppeteer使用代理
2018/12/27 Javascript
vue点击按钮动态创建与删除组件功能
2019/12/29 Javascript
node.js使用http模块创建服务器和客户端完整示例
2020/02/10 Javascript
[04:54]DOTA2 2017国际邀请赛:上届冠军WINGS采访短片
2017/08/09 DOTA
[37:03]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第二场 12.16
2020/12/18 DOTA
python好玩的项目—色情图片识别代码分享
2017/11/07 Python
Python如何使用函数做字典的值
2019/11/30 Python
python中format函数如何使用
2020/06/22 Python
Python常用库Numpy进行矩阵运算详解
2020/07/21 Python
利用CSS3实现文本框的清除按钮相关的一些效果
2015/06/23 HTML / CSS
Notino法国:购买香水和化妆品
2019/04/15 全球购物
幼儿园教师岗位职责
2014/03/17 职场文书
学生安全责任书模板
2014/07/25 职场文书
2014年幼儿园工作总结
2014/11/10 职场文书
市直属机关2016年主题党日活动总结
2016/04/05 职场文书
golang 实用库gotable的具体使用
2021/07/01 Golang
MySQL如何快速创建800w条测试数据表
2022/03/17 MySQL