matplotlib绘制方波圆周分解动画

news2024/12/24 20:09:38

1 方波的圆周分解

在学习傅里叶变换的时候,有一个经典的示例是方波的分解。我们知道,方波可以分解为无数个正弦波的叠加。而正弦波,又可以看作是圆周运动在一条直线上的投影。当时为了理解这个事情,恐怕大家也花了不少时间。

学习了matplotlib之后,出于学以致用的考虑,我们能不能绘制出动画,来描述上述分解,便于我们来理解呢?

先上动图:
在这里插入图片描述

前面学习中已经掌握了matplotlib如何制作动画,以及如何绘制子图。在这个例子中我们将看到以下内容的实战:

  • 分割画布为子图
  • 绘制圆和波形图
  • 调整图像的轴比例
  • 隐藏图像的刻度轴
  • 设置线型和颜色
  • 生成和保存动画

2. 绘图源码

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np

# 把半径放大3倍 画大一些
radius = 4 / np.pi * 3
t = np.deg2rad(list(range(0, 360, 1)))
tc = [tt + 8 for tt in t]

# 一级圆
x = np.cos(t) * radius
y = np.sin(t) * radius

# 二级圆
x1 = np.cos(3*t) * radius / 3
y1 = np.sin(3*t) * radius / 3

# 三级圆
x2 = np.cos(5*t) * radius / 5
y2 = np.sin(5*t) * radius / 5

# 四级圆
x3 = np.cos(7*t) * radius / 7
y3 = np.sin(7*t) * radius / 7

# 子图的切割
fig, ax = plt.subplots(4, 1)
fig.set_size_inches(5, 8)
fig.tight_layout()
ax[0].set(xlim=(-2, 10), ylim=(-6, 6))

#设置横纵坐标等比例且根据轴范围自适应
ax[0].set_aspect("equal", adjustable='datalim')
ax[0].set_axis_off() # 隐藏轴刻度线
# 绘制固定的那个圆
ax[0].plot(x, y, 'b-', linewidth=1)

ax[1].set(xlim=(-2, 10), ylim=(-6, 6))
ax[1].set_aspect("equal", adjustable='datalim')
ax[1].set_axis_off()
ax[1].plot(x, y, 'b-', linewidth=1)

ax[2].set(xlim=(-2, 10), ylim=(-6, 6))
ax[2].set_aspect("equal", adjustable='datalim')
ax[2].set_axis_off()
ax[2].plot(x, y, 'b-', linewidth=1)

ax[3].set(xlim=(-2, 10), ylim=(-6, 6))
ax[3].set_aspect("equal", adjustable='datalim')
ax[3].set_axis_off()
ax[3].plot(x, y, 'b-', linewidth=1)

# 动画准备
artists = []
for i in range(0, len(t)):
	# container用来存储每帧要绘制的内容,通过+=叠加
    container = []
    container += ax[0].plot([0, x[i]], [0, y[i]], 'b-', linewidth=1)
    yy = list(y[i:len(y)])
    yy.extend(y[0:i])
    container += ax[0].plot(tc, yy, color='blue', linewidth=1)
    container += ax[0].plot([x[i], tc[0]], [y[i], yy[0]], 'b--', linewidth=1)

    container += ax[1].plot([0, x[i]], [0, y[i]], 'b-', linewidth=1)
    container += ax[1].plot([x1i + x[i] for x1i in x1], [y1i + y[i] for y1i in y1], 'r-', linewidth=1)

    y_y1 = y+y1
    yy1 = list(y_y1[i:len(y_y1)])
    yy1.extend(y_y1[0:i])
    container += ax[1].plot([x[i], x[i]+x1[i]], [y[i], y[i]+y1[i]], 'r-', linewidth=1)
    container += ax[1].plot(tc, yy1, color='red', linewidth=1)
    container += ax[1].plot([x[i]+x1[i], tc[0]], [y[i]+y1[i], yy1[0]], 'r--', linewidth=1)
  
    container += ax[2].plot([0, x[i]], [0, y[i]], 'b-', linewidth=1)
    container += ax[2].plot([x1i + x[i] for x1i in x1], [y1i + y[i] for y1i in y1], 'r-', linewidth=1)
    container += ax[2].plot([x[i], x[i] + x1[i]], [y[i], y[i] + y1[i]], 'r-', linewidth=1)
    container += ax[2].plot([x2i + x1[i] + x[i] for x2i in x2], [y2i + y1[i] + y[i] for y2i in y2], 'g-', linewidth=1)
    container += ax[2].plot([x[i] + x1[i], x[i] + x1[i] + x2[i]], [y[i] + y1[i], y[i] + y1[i] + y2[i]], 'g-',
                            linewidth=1)

    y_y2 = y + y1 + y2
    yy2 = list(y_y2[i:len(y_y2)])
    yy2.extend(y_y2[0:i])
    container += ax[2].plot(tc, yy2, color='green', linewidth=1)
    container += ax[2].plot([x[i] + x1[i] + x2[i], tc[0]], [y[i] + y1[i] + y2[i], yy2[0]], 'g--',
                            linewidth=1)

    container += ax[3].plot([0, x[i]], [0, y[i]], 'b-', linewidth=1)
    container += ax[3].plot([x1i + x[i] for x1i in x1], [y1i + y[i] for y1i in y1], 'r-', linewidth=1)
    container += ax[3].plot([x[i], x[i] + x1[i]], [y[i], y[i] + y1[i]], 'r-', linewidth=1)
    container += ax[3].plot([x2i + x1[i] + x[i] for x2i in x2], [y2i + y1[i] + y[i] for y2i in y2], 'g-', linewidth=1)
    container += ax[3].plot([x[i] + x1[i], x[i] + x1[i] + x2[i]], [y[i] + y1[i], y[i] + y1[i] + y2[i]], 'g-',
                            linewidth=1)
    container += ax[3].plot([x3i + x2[i] + x1[i] + x[i] for x3i in x3], [y3i + y2[i] + y1[i] + y[i] for y3i in y3],
                            'c-', linewidth=1)
    container += ax[3].plot([x[i] + x1[i] + x2[i], x[i] + x1[i] + x2[i] + x3[i]],
                            [y[i] + y1[i] + y2[i], y[i] + y1[i] + y2[i] + y3[i]], 'c-', linewidth=1)

    y_y3 = y + y1 + y2 + y3
    yy3 = list(y_y3[i:len(y_y3)])
    yy3.extend(y_y3[0:i])
    container += ax[3].plot(tc, yy3, color='cyan', linewidth=1)
    container += ax[3].plot([x[i] + x1[i] + x2[i] + x3[i], tc[0]], [y[i] + y1[i] + y2[i] + y3[i], yy3[0]],
                            'c--', linewidth=1)
    artists.append(container)

# 生成并保存动图
ani = animation.ArtistAnimation(fig=fig, artists=artists, interval=40)
ani.save(filename="c:/users/admin/desktop/fourier.gif", writer="pillow")
plt.show()


这里还有一些优化空间,例如还没有为这幅图加上文字说明(涉及 LaTeX \LaTeX LATEX输入),以及也没有绘制出方波本身。作为一个练习,小白觉得主体的内容已经足够,留待后续优化。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/827830.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MyBtis】各种查询功能

目录 【MyBtis】配置和映射 11.1 示例:实现表数据的增、删、改、查 1.创建工程mybatis_DML demo 2.创建数据库操作的工具类:DBOperatorMgr.java 3.创建映射接口 4.创建XML映射文件 5.测试 【MyBtis】配置和映射 MyBatis 的真正强大之外在于它的映射语句&#xf…

jest单元测试的代码覆盖率显示不出来

jest.config.js配置文件 const path require(path)// 添加 verbose: true, testURL: http://localhost/module.exports {verbose: true,testURL: http://localhost/,rootDir: path.resolve(__dirname, ../../),moduleFileExtensions: [js,json,vue],moduleNameMapper: {^/(…

Java基础篇_1.4——程序流程控制之选择结构if语句

程序流程控制 关于程序控制的关键字: 程序控制关键字breakdowhileforcontinueswitchcasedefaultreturninstanceofifelse 程序运行时的一个顺序,程序的结构分为:顺序结构、选择结构和循环结构。 顺序结构是指按照代码的书写顺序执行。选择结…

如何手动创建EFI引导分区?

EFI系统分区是数据存储设备上的分区,供遵循统一可扩展固件接口的计算机使用。当计算机启动时,UEFI固件加载存储在可扩展系统分区上的文件,以启动安装的操作系统和各种实用程序。在GPT磁盘上启动Windows时,必须有EFI系统分区。如果…

ClickHouse(九):Clickhouse表引擎 - Log系列表引擎

进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容! 🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,Kerberos安全认证,大数据OLAP体系技术栈-CSDN博客 &…

SpringBoot引入MyBatisGenerator

1.引入插件 <plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.5</version><configuration><!--generator配置文件所在位置--><configuratio…

【echartsjs】js实现图表数据 跟动态数据联合展示 三个案例,附带源码

序幕&#xff1a; 所展示示例使用到多个js库&#xff0c;例如&#xff1a;jquery、echarts、liMarquee等等&#xff0c;我是下载到了本地&#xff0c;其他小伙伴记得自己下载相关js库&#xff0c;或者引用线上库 推荐一个获取线上资源网站&#xff1a;BootCDN - Bootstrap 中文…

fastadmin 权限管理栏目关闭了怎么恢复

目前能解决的方法就是直接url敲出来菜单配置&#xff1a;Internet Speed Test | Fast.com 然后再把这个隐藏显示出来

抄写Linux源码(Day7:读闪客文章第二回 “自己给自己挪个地儿”)

闪客文章地址&#xff1a;https://mp.weixin.qq.com/s?__bizMzk0MjE3NDE0Ng&mid2247499274&idx1&sn23885b5b1344a1425f5a971d06ad2e7d&chksmc2c584a7f5b20db1b0a75ea896e7218a9f8bcd006e68f53693bab240b13f9e2fb0ec0c9b9a6a&cur_album_id2123743679373688…

jmeter中json提取器,获取多个值,并通过beanshell组成数组

jmeter中json提取器介绍 特别说明&#xff1a;**Compute concatenation var(suffix_ALL)&#x1f617;*如果找到许多结果&#xff0c;则插件将使用’ &#xff0c; 分隔符将它们连接起来&#xff0c;并将其存储在名为 _ALL的var中 json提取器调试 在查看结果树中选择JSON Pat…

python——案例9:判断字符串的长度

案例8&#xff1a;设定列表&#xff1a;listl[0,1,2,3,4,5],求列表之和total0 list1[0,1,2,3,4,5] #列表lis1for ele in range(0,len(list1)):totaltotallist1[ele] print("列表中元素之和&#xff1a;",total) #输出结果

既要增长又要人效,零售人准备好接受老板的灵魂拷问了吗

增长对于零售行业尤其中小规模的玩家来说重要性不言而喻&#xff0c;而支撑持续增长的引擎之一就是对日常运营数据能随时进行快速、合理的解读&#xff0c;从而在瞬息万变的市场环境和有限的时间窗口内&#xff0c;根据指标背后折射的问题及时调整市场投放和客户关系维护等策略…

MySQL 极速安装使用与卸载

目录 mysql-5.6.51 极速安装使用与卸载 sqlyog工具 mysql简化 mysql-8.1.0下载配置 再完善 mysql-5.6.51 极速安装使用与卸载 mysql-8.1.0下载安装在后 mysql中国官网 MySQLhttps://www.mysql.com/cn/ 点击MySQL社区服务器 点击历史档案 下载完 解压 用管理员运行cmd&a…

原来这就是数组

原来这就是数组 数组的基本概念为什么使用数组数组的概念数组的特点数组如何初始化1.动态初始化2.静态初始化 数组的使用访问数组元素代码演示 遍历数组的几种方式1.直接打印&#xff08;不可取&#xff09;2.for循环打印&#xff08;如果有判断条件推荐&#xff09;3.转化为St…

stm32常见数据类型

stm32的数据类型的字节长度 s8 占用1个byte&#xff0c;数据范围 -2^7 到 (2^7-1) s16 占用2个byte&#xff0c;数据范围 -2^15 到 (2^15-1) s32 占用 4个byte&#xff0c;数据范围 -2^31 到 (231-1)231 2147483647 int64_t占用8个byte&#xff0c;数据范围 -2^63 到 (2^63-1)…

flutter:占位视图(骨架屏、shimmer)

前言 有时候打开美团&#xff0c;在刚加载数据时会显示一个占位视图&#xff0c;如下&#xff1a; 那么这个是如何实现的呢&#xff1f;我们可以使用shimmer来开发该功能 实现 官方文档 https://pub-web.flutter-io.cn/packages/shimmer 安装 flutter pub add shimmer示例…

渲染中回流与重绘讲解

浏览器的渲染过程 本文先从浏览器的渲染过程来讲解回流与重绘。 从上面这个图上&#xff0c;我们可以看到&#xff0c;浏览器渲染过程如下&#xff1a; 解析HTML&#xff0c;生成DOM树(DOM Tree)&#xff0c;解析CSS&#xff0c;生成CSS树(Style Rules)将DOM树和CSS树结合&am…

通过启动盘安装 SylixOS

通过启动盘安装 SylixOS 制作启动盘 将 U 盘插入电脑。 打开 RealEvo-IDE&#xff0c;并在菜单栏选择 Tools > RealEvo-SylixOS-Installer 启动安装工具。 设置启动盘各项参数&#xff0c;如下图红框所示。 单击一键安装 SylixOS。程序运行过程信息输出显示如下图所示。…

c语言~野指针

1、野指针&#xff0c;既没有初始化的指针&#xff0c;//如果没有给指针初始化&#xff0c;则指针p的内容为随机地址&#xff0c;会随机指向&#xff0c;故成为野指针&#xff0c;不可以操作野指针 #include "stdio.h" #include <stdlib.h>int main() {//1、野…

Nginx之正、反向代理

什么是代理 A同学在Ai大时代背景下开启他的创业之路&#xff0c;目前他遇到的最大的一个问题就是启动资金&#xff0c;于是他决定去找马云爸爸借钱&#xff0c;可想而知&#xff0c;最后碰一鼻子灰回来了&#xff0c;情急之下&#xff0c;他想到一个办法&#xff0c;找关系开后…