使用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操作MySQL数据库的三种方法总结
Jan 30 Python
使用pygame模块编写贪吃蛇的实例讲解
Feb 05 Python
Python贪心算法实例小结
Apr 22 Python
Python get获取页面cookie代码实例
Sep 12 Python
Python创建一个空的dataframe,并循环赋值的方法
Nov 08 Python
浅谈python实现Google翻译PDF,解决换行的问题
Nov 28 Python
Python企业编码生成系统之系统主要函数设计详解
Jul 26 Python
flask框架url与重定向操作实例详解
Jan 25 Python
使用python处理题库表格并转化为word形式的实现
Apr 14 Python
pytorch加载自己的图像数据集实例
Jul 07 Python
python中HTMLParser模块知识点总结
Jan 25 Python
python实现语音常用度量方法的代码详解
May 25 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在引号前面添加反斜杠(PHP去除反斜杠)
2013/09/28 PHP
PHP基于CURL进行POST数据上传实例
2014/11/10 PHP
php+Mysqli利用事务处理转账问题实例
2015/02/11 PHP
PHP使用第三方即时获取物流动态实例详解
2017/04/27 PHP
laravel返回统一格式错误码问题
2019/11/04 PHP
javascript 解析url的search方法
2010/02/09 Javascript
跟着Jquery API学Jquery之一 选择器
2010/04/07 Javascript
JavaScript 布尔操作符解析  && || !
2012/08/10 Javascript
jqplot通过ajax动态画折线图的方法及思路
2013/12/08 Javascript
使用jQuery实现图片遮罩半透明坠落遮挡
2015/03/16 Javascript
基于JavaScript实现Tab选项卡切换效果
2016/11/24 Javascript
jQuery EasyUI 获取tabs的实例解析
2016/12/06 Javascript
详解如何使用vue-cli脚手架搭建Vue.js项目
2017/05/19 Javascript
基于Vue实例对象的数据选项
2017/08/09 Javascript
Vue波纹按钮组件制作
2018/04/30 Javascript
vue实现键盘输入支付密码功能
2018/08/18 Javascript
使用angular-cli webpack创建多个包的方法
2018/10/16 Javascript
jQuery-Citys省市区三级菜单联动插件使用详解
2019/07/26 jQuery
Ant Design Vue 添加区分中英文的长度校验功能
2020/01/21 Javascript
解决vue项目中某一页面不想引用公共组件app.vue的问题
2020/08/14 Javascript
Flask入门教程实例:搭建一个静态博客
2015/03/27 Python
Python中使用第三方库xlrd来读取Excel示例
2015/04/05 Python
python传递参数方式小结
2015/04/17 Python
python 添加用户设置密码并发邮件给root用户
2016/07/25 Python
python+opencv实现高斯平滑滤波
2020/07/21 Python
python爬取Ajax动态加载网页过程解析
2019/09/05 Python
利用python绘制数据曲线图的实现
2020/04/09 Python
分解成质因数(如435234=251*17*17*3*2,据说是华为笔试题)
2014/07/16 面试题
字符串str除首尾字符外的其他字符按升序排列
2013/03/08 面试题
购房意向书
2014/08/30 职场文书
绵山导游词
2015/02/05 职场文书
中英文求职信范文
2015/03/19 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书
创业计划书之烤红薯
2019/09/26 职场文书
react 项目中引入图片的几种方式
2021/06/02 Javascript
Springboot中如何自动转JSON输出
2022/06/16 Java/Android