使用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画图学习入门教程
Jul 01 Python
多版本Python共存的配置方法
May 22 Python
python实现BackPropagation算法
Dec 14 Python
Python中一个for循环循环多个变量的示例
Jul 16 Python
python 扩展print打印文件路径和当前时间信息的实例代码
Oct 11 Python
python隐藏类中属性的3种实现方法
Dec 19 Python
Python socket处理client连接过程解析
Mar 18 Python
Python 炫技操作之合并字典的七种方法
Apr 10 Python
Python爬虫入门有哪些基础知识点
Jun 02 Python
python和C++共享内存传输图像的示例
Oct 27 Python
python安装sklearn模块的方法详解
Nov 28 Python
pycharm安装深度学习pytorch的d2l包失败问题解决
Mar 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
wamp下修改mysql访问密码的解决方法
2013/05/07 PHP
解析yahoo邮件用phpmailer发送的实例
2013/06/24 PHP
浅谈PDO的rowCount函数
2015/06/18 PHP
利用php生成验证码
2017/02/23 PHP
yii2 resetful 授权验证详解
2017/05/18 PHP
JavaScript 获取当前时间戳的代码
2010/08/05 Javascript
jQuery版Tab标签切换
2011/03/16 Javascript
浅析document.createDocumentFragment()与js效率
2013/07/08 Javascript
深入理解JSON数据源格式
2014/01/10 Javascript
jquery加载图片时以淡入方式显示的方法
2015/01/14 Javascript
微信中一些常用的js方法汇总
2015/03/12 Javascript
JavaScript中Textarea滚动条不能拖动的解决方法
2015/12/15 Javascript
Bootstrap CSS布局之表单
2016/12/17 Javascript
Javascript下拉刷新的简单实现
2017/02/14 Javascript
解决浏览器会自动填充密码的问题
2017/04/28 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
2017/05/27 Javascript
Angularjs单选框相关的示例代码
2017/08/17 Javascript
Vue.js+Layer表格数据绑定与实现更新的实例
2018/03/07 Javascript
微信小程序使用component自定义toast弹窗效果
2018/11/27 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
vue 父组件通过v-model接收子组件的值的代码
2019/10/27 Javascript
Vue切换div显示隐藏,多选,单选代码解析
2020/07/14 Javascript
python自动化测试之从命令行运行测试用例with verbosity
2014/09/28 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
2018/06/01 Python
Python装饰器模式定义与用法分析
2018/08/06 Python
用CSS3绘制三角形的简单方法
2015/07/17 HTML / CSS
CSS3毛玻璃效果(blur)有白边问题的解决方法
2016/11/15 HTML / CSS
Beauty Expert美国/加拿大:购买奢侈美容产品
2018/12/05 全球购物
个性化皮包、小袋、生活配件:Mon Purse
2019/03/26 全球购物
戴森比利时官方网站:Dyson BE
2020/10/03 全球购物
事业单位绩效考核实施方案
2014/03/27 职场文书
关于安全演讲稿
2014/05/09 职场文书
五水共治捐款倡议书
2014/05/14 职场文书
CSS3实现的3D隧道效果
2021/04/27 HTML / CSS
Vue.js中v-bind指令的用法介绍
2022/03/13 Vue.js
pytorch分类模型绘制混淆矩阵以及可视化详解
2022/04/07 Python