manim边学边做--通用二维坐标系
Manim的Axes对象是通用的坐标系对象,之前几篇介绍的数轴和各种坐标平面都是继承Axes对象。
Axes对象的主要作用在于创建和管理二维坐标轴,以满足我们制作数学动画时的各种需求。
具体来说,Axes对象可以帮助我们:
- 定义坐标系:定义一个明确的坐标系,通过设置x轴和y轴的范围、步长等参数,创建符合自己需求的坐标轴
- 定制坐标轴样式:可以设置坐标轴的颜色、刻度线的长度、箭头的长度等属性,还可以控制是否显示刻度线、标签和注释等
- 绘制函数曲线:绘制各种自定义的函数曲线,如二次函数、三角函数、指数函数等
- 添加图形和标签:可以添加图形元素(如圆、三角形等)和标签(如坐标轴标签、标题等)
1. 主要参数
Axes的主要参数有:
| 参数名称 | 类型 | 说明 |
|---|---|---|
| x_range | Sequence[float] | 横坐标轴范围,间隔 |
| y_range | Sequence[float] | 纵坐标轴范围,间隔 |
| x_length | float | 横轴的宽度 |
| y_length | float | 纵轴的高度 |
| axis_config | dict | 坐标轴的通用配置选项 |
| x_axis_config | dict | 横轴的配置选项 |
| y_axis_config | dict | 纵轴的配置选项 |
| tips | bool | 横轴的右边和纵轴上边是否显示箭头 |
参数axis_config和x_axis_config,y_axis_config中的可配置的项目类似,
区别在于axis_config是针对整个坐标轴的配置,
x_axis_config和y_axis_config是分别针对横轴和纵轴的配置。
如果它们设置了相同的项,那么x_axis_config和y_axis_config中的设置会覆盖axis_config中相应的设置。
可对坐标轴设置的项有很多,下面列举了一些常用的。
stroke_color:设置坐标轴线的颜色stroke_width(或line_width):设置坐标轴线的宽度include_numbers:是否在坐标轴上显示数字numbers_to_include:指定要显示数字的列表。numbers_with_elongated_ticks:指定要加长刻度线的数字列表。用于突出显示特定的刻度include_ticks:是否显示刻度线tick_size:设置刻度线的长度include_tip:是否在坐标轴的末端显示箭头tip_length:设置箭头的长度。当include_tip为True时,此选项才有效font_size:设置坐标轴上数字的字体大小label_direction:设置坐标轴标签的方向scaling:设置坐标轴的刻度缩放方式,如线性刻度、对数刻度等
2. 主要方法
Axes的方法主要是为了动态获取坐标轴上的各种信息,以及在坐标轴上绘制函数图形。
其中用的比较多的有:
| 名称 | 说明 |
|---|---|
| coords_to_point | 将坐标转换为在屏幕上点的位置 |
| point_to_coords | 将屏幕上点的位置转换为坐标 |
| get_axes | 获取各个坐标轴的信息 |
| plot_line_graph | 在坐标轴中绘制函数图形 |
3. 使用示例
下面通过由简单到复杂的示例,一步步演示如何使用Axes对象。
3.1. 基本坐标系
使用Axes对象创建一个基本的二维坐标系,设置x轴和y轴的范围,并显示坐标轴上的数字和刻度线。
下面的示例设置x轴范围[-5,5],y轴范围[-3,3],坐标轴上以1为间隔显示数字和刻度线。
# x轴范围从-5到5,间隔为1
# y轴范围从-3到3,间隔为1
# 显示坐标轴上的数字
Axes(
x_range=[-5, 5, 1],
y_range=[-3, 3, 1],
axis_config={"include_numbers": True},
)

3.2. 自定义坐标轴样式
自定义坐标轴的样式,包括轴的颜色、线条宽度、刻度线的长度和是否显示箭头等。
下面的示例将x轴设置为红色,线条宽度为2;y轴设置为蓝色,线条宽度为1.5,且x轴和y轴末端均显示不同的箭头。
axes = Axes(
x_range=[-5, 5, 1],
y_range=[-3, 3, 1],
x_axis_config={
"color": RED,
"stroke_width": 5,
"include_tip": True, # 显示箭头
"tip_shape": ArrowSquareTip,
},
y_axis_config={
"color": BLUE,
"stroke_width": 1.5,
"include_tip": True,
"tip_shape": StealthTip,
},
axis_config={
# 加长特定数字的刻度线
"numbers_with_elongated_ticks": [0, -3, 3],
"font_size": 20,
},
)

3.3. 绘制函数曲线
坐标系上绘制一个函数曲线。
比如,下面的示例绘制一个抛物线($ y=x^2 \()和一个三角函数曲线(\) y=\sin(\theta) $)。
axes = Axes(
x_range=[-5, 5, 1],
y_range=[-5, 5, 1],
x_axis_config={
"color": RED,
},
y_axis_config={
"color": BLUE,
},
axis_config={
"include_numbers": True,
"font_size": 20,
"include_tip": True,
"tip_shape": StealthTip,
"tip_length": 2,
},
)
# 抛物线
func = lambda x: x**2
graph = axes.plot(func, x_range=[-2, 2], color=GREEN)
self.play(Create(graph), run_time=run_time)
# 三角函数
func = lambda x: np.sin(x)
graph = axes.plot(func, x_range=[-5, 5], color=YELLOW)
self.play(Create(graph), run_time=run_time)

3.4. 添加标签和注释
在坐标轴上添加标签,并在函数曲线上添加注释,以解释图形的含义。
下面的示例基于上一节的函数曲线,标出坐标轴名称x和y,并且选择抛物线上的一个点,标出点的坐标。
axes = Axes(
x_range=[-5, 5, 1],
y_range=[-5, 5, 1],
x_axis_config={
"color": RED,
},
y_axis_config={
"color": BLUE,
},
axis_config={
"include_numbers": True,
"font_size": 20,
"include_tip": True,
"tip_shape": StealthTip,
"tip_length": 2,
},
)
# 绘制曲线
func = lambda x: x**2
graph = axes.plot(func, x_range=[-2, 2], color=GREEN, stroke_width=2)
# 添加标签
x_label = axes.get_x_axis_label(
MathTex("x", font_size=25, color=RED),
direction=UP,
)
y_label = axes.get_y_axis_label(
MathTex("y", font_size=25, color=BLUE),
direction=RIGHT,
)
# 标记一个点
x = 1.5
y = x * x
d = Dot(axes.coords_to_point(x, y), color=YELLOW)
txt = Matrix([[x], [y]]).scale(0.5).next_to(d.get_center(), RIGHT)

4. 附件
文中的代码只是关键部分的截取,完整的代码共享在网盘中(axes.py),
下载地址: 完整代码 (访问密码: 6872)
manim边学边做--通用二维坐标系的更多相关文章
- Codeforces Round #524 (Div. 2)C 二维坐标系求俩矩形面积交
题:https://codeforces.com/contest/1080/problem/C 题意:给n*m的二维坐标系,每个位置(xi,yi)都表示一个方格,(1,1)的位置是白色,整个坐标系黑白 ...
- javascript使用H5新版媒体接口navigator.mediaDevices.getUserMedia,做扫描二维码,并识别内容
本文代码测试要求,最新的chrome浏览器(手机APP),并且要允许chrome拍照录像权限,必须要HTTPS协议,http不支持. 原理:调用摄像头,将摄像头返回的媒体流渲染到视频标签中,再通过ca ...
- 用python随随便便做一个二维码叭~~~
Python是目前最好的编程语言之一.由于其可读性和对初学者的友好性,已被广泛使用. 那么要想学会并掌握Python,可以实战的练习项目是必不可少的. 接下来,我将给大家介绍非常实用的Python项目 ...
- 【opencv】 solvepnp 和 solvepnpRansac 求解 【空间三维坐标系 到 图像二维坐标系】的 三维旋转R 和 三维平移 T 【opencv2使用solvepnp求解rt不准的问题】
参考: pnp问题 与 solvepnp函数:https://www.jianshu.com/p/b97406d8833c 对图片进行二维仿射变换cv2.warpAffine() or 对图片进行二维 ...
- 北京地铁换乘算法(二维坐标系,图的深度搜索)开源下载Android源码、性能最优解
距离2012年11月2日下午2:05:31 已经过去158751270这么多秒了,不小心暴露了我的当前时间. java代码贴出来. private static long gettimelong() ...
- 二维坐标系极角排序的应用(POJ1696)
Space Ant Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3170 Accepted: 2029 Descrip ...
- 随手记一次利用开源zxing生成带嵌入logo的二维码图片
之前就在项目里面用过zxing生成二维码,最近另一个项目同样需要用到二维码,故重新在学了学利用zxing生成二维码 接下来先做准备工作了,因为我是用vs2013上开发的,故选择了.net4.5版本的z ...
- 二维码跳转不同的 app store
说道二维码 之前是用来跳转app store 然后在就是出来的 扫码付款什么的 用的很平常,其实里面也很简单 自己刚开始接触的时候 同事说要做一个二维码下载 应用 => 我=懵逼 ...
- POJ 2155 Matrix (二维线段树)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17226 Accepted: 6461 Descripti ...
- QR二维码生成器源码(中间可插入小图片)
二维码终于火了,现在大街小巷大小商品广告上的二维码标签都随处可见,而且大都不是简单的纯二维码,而是中间有个性图标的二维码. 我之前做了一个使用google开源项目zxing实现二维码.一维码编码解码的 ...
随机推荐
- css 样式 element.style 覆盖问题
问题: 我们在写网页定制样式的时候发现展示效果跟我们预想的不一样? 打开F12一看原来是element.style 覆盖的我定义的效果. 解决: 只要在定义的内容后面加上 !important 就行啦 ...
- 全网最适合入门的面向对象编程教程:35 Python的内置数据类型-文档字符串和__doc__属性
全网最适合入门的面向对象编程教程:35 Python 的内置数据类型-文档字符串和__doc__属性 摘要: 在 Python 中,文档字符串(Docstring)是一种用于为模块.类.方法或函数编写 ...
- grpc断路器之hystrix
上一章介绍了grpc断路器sentinel, grpc断路器之sentinel 但是由于公司线上系统用的告警与监控组件是prometheus,而sentinel暂时还没有集成prometheus,所以 ...
- WPF 设备输入事件封装
本文主要介绍WPF应用对鼠标输入.触摸屏触笔以及触摸事件的封装 之前有简单说明设备输入类型 WPF 屏幕点击的设备类型 - 唐宋元明清2188 - 博客园 (cnblogs.com) 1.鼠标 - 通 ...
- git merge 详细操作,看完就懂
[root@hostname git_test]# git init hint: Using 'master' as the name for the initial branch. This def ...
- 傅里叶级数 傅里叶变换 FFT 时域 频域 功率谱 能量谱 功率谱密度PSD
傅立叶级数是基于周期函数的,如果我们把周期推广到
- 万字长文全面详解现代C++智能指针:原理、应用和陷阱
现代C++智能指针详解:原理.应用和陷阱 智能指针是C++11引入的新特性.本篇文章详细介绍了C++智能指针的原理.应用与陷阱,通过丰富的代码实例介绍了三种智能指针:std::unique_ptr.s ...
- 深入理解JavaScript中的箭头函数
箭头函数可以使我们的代码更加简洁,如下: var sum = (a,b) => a+b; JavaScript 充满了我们需要编写在其他地方执行的小函数的情况. 例如: arr.forEach( ...
- 简单聊聊 CORS 攻击与防御
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:霁明 什么是CORS CORS(跨域资源共享)是一种基于H ...
- 升讯威在线客服系统如何高性能同时支持 MySQL 和 SQL Server
升讯威在线客服与营销系统是基于 .net core / WPF 开发的一款在线客服软件,宗旨是: 开放.开源.共享.努力打造 .net 社区的一款优秀开源产品. 前段时间我发表了一系列文章,开始介绍基 ...