使用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读取Excel的方法实例分析
Jul 11 Python
深入理解Python中字典的键的使用
Aug 19 Python
python中input()与raw_input()的区别分析
Feb 27 Python
Python断言assert的用法代码解析
Feb 03 Python
python调用系统ffmpeg实现视频截图、http发送
Mar 06 Python
python把数组中的数字每行打印3个并保存在文档中的方法
Jul 17 Python
python 实现对数据集的归一化的方法(0-1之间)
Jul 17 Python
解决python2 绘图title,xlabel,ylabel出现中文乱码的问题
Jan 29 Python
django的聚合函数和aggregate、annotate方法使用详解
Jul 23 Python
PageFactory设计模式基于python实现
Apr 14 Python
pycharm中选中一个单词替换所有重复单词的实现方法
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中抽象类和接口的概念以及区别
2013/06/27 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
2016/03/21 PHP
PHP文件类型检查及fileinfo模块安装使用详解
2019/05/09 PHP
一直复略了的一个问题,关于表单重复提交
2007/02/15 Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
nodejs中exports与module.exports的区别详细介绍
2013/01/14 NodeJs
用js模拟struts2的多action调用示例
2014/05/19 Javascript
js中document.write的那点事
2014/12/12 Javascript
JS控制FileUpload的上传文件类型实例代码
2016/10/07 Javascript
easyui-datagrid特殊字符不能显示的处理方法
2017/04/12 Javascript
AngularJS的脏检查深入分析
2017/04/22 Javascript
H5基于iScroll实现下拉刷新和上拉加载更多
2017/07/18 Javascript
CKEditor4配置与开发详细中文说明文档
2018/10/08 Javascript
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
使用vue脚手架(vue-cli)搭建一个项目详解
2019/05/09 Javascript
利用JS响应式修改vue实现页面的input值
2019/09/02 Javascript
原生JS无缝滑动轮播图
2019/10/22 Javascript
JS实现横向轮播图(中级版)
2020/01/18 Javascript
Vue实现购物小球抛物线的方法实例
2020/11/22 Vue.js
vue调用微信JSDK 扫一扫,相册等需要注意的事项
2021/01/03 Vue.js
python判断图片宽度和高度后删除图片的方法
2015/05/22 Python
python实现udp聊天窗口
2020/03/31 Python
pyinstaller打包找不到文件的问题解决
2020/04/15 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
2020/05/23 Python
基于python获取本地时间并转换时间戳和日期格式
2020/10/27 Python
澳大利亚小众服装品牌:Maurie & Eve
2018/03/27 全球购物
英国最大的在线时尚眼镜店:Eyewearbrands
2019/03/12 全球购物
学生会主席事迹材料
2014/01/28 职场文书
技术合作协议书范本
2014/04/18 职场文书
装修协议书范本
2014/04/21 职场文书
小学教师师德师风演讲稿
2014/08/22 职场文书
环卫处个人工作总结
2015/03/04 职场文书
职称评定个人总结
2015/03/05 职场文书
2019企业文化管理制度范本!
2019/08/06 职场文书
创业计划书之酒吧
2019/12/02 职场文书
评测 | 大屏显示带收音机的高端音箱,JBL TUNE2便携式插卡音箱实测
2021/04/24 无线电