使用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中用Decorator来简化元编程的教程
Apr 13 Python
Python中处理字符串的相关的len()方法的使用简介
May 19 Python
python实现多线程的方式及多条命令并发执行
Jun 07 Python
Python中死锁的形成示例及死锁情况的防止
Jun 14 Python
python 对类的成员函数开启线程的方法
Jan 22 Python
详解python深浅拷贝区别
Jun 24 Python
python按行读取文件并找出其中指定字符串
Aug 08 Python
Python 中如何实现参数化测试的方法示例
Dec 10 Python
python 删除excel表格重复行,数据预处理操作
Jul 06 Python
python中doctest库实例用法
Dec 31 Python
python用tkinter开发的扫雷游戏
Jun 01 Python
Python软件包安装的三种常见方法
Jul 07 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 SPL使用方法和他的威力
2013/11/12 PHP
php生成固定长度纯数字编码的方法
2015/07/09 PHP
PHP实现数据分页显示的简单实例
2016/05/26 PHP
php基于openssl的rsa加密解密示例
2016/07/11 PHP
JavaScript 弹出窗体点击按钮返回选择数据的实现
2010/04/01 Javascript
JavaScript自定义DateDiff函数(兼容所有浏览器)
2012/03/01 Javascript
javascript随机将第一个dom中的图片添加到第二个div中示例
2013/10/08 Javascript
使用jQuery实现图片遮罩半透明坠落遮挡
2015/03/16 Javascript
JavaScript使用function定义对象并调用的方法
2015/03/23 Javascript
easyui-combobox 实现简单的自动补全功能示例
2016/11/08 Javascript
jQuery无缝轮播图代码
2016/12/22 Javascript
jQuery实现一个简单的验证码功能
2017/06/26 jQuery
vue路由跳转时判断用户是否登录功能的实现
2017/10/26 Javascript
js断点调试心得分享(必看篇)
2017/12/08 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
python代码检查工具pylint 让你的python更规范
2012/09/05 Python
举例讲解Python中装饰器的用法
2015/04/27 Python
python实现类的静态变量用法实例
2015/05/08 Python
Python3处理文件中每个词的方法
2015/05/22 Python
python Crypto模块的安装与使用方法
2017/12/21 Python
python实现屏保计时器的示例代码
2018/08/08 Python
详解Python 解压缩文件
2019/04/09 Python
基于Python pyecharts实现多种图例代码解析
2020/08/10 Python
python实现xml转json文件的示例代码
2020/12/30 Python
Python截图并保存的具体实例
2021/01/14 Python
服装机修工岗位职责
2013/12/26 职场文书
网上签名寄语活动留言
2014/01/18 职场文书
山东省召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
优秀团员自我评价
2015/03/10 职场文书
经济纠纷起诉状
2015/05/20 职场文书
银行柜员工作心得体会
2016/01/23 职场文书
python Polars库的使用简介
2021/04/21 Python
k-means & DBSCAN 总结
2021/04/27 Python
超详细Python解释器新手安装教程
2021/05/10 Python
详细总结Python常见的安全问题
2021/05/21 Python
Nginx部署vue项目和配置代理的问题解析
2021/08/04 Servers