在Manim中坐标系的创建和使用
1.创建坐标轴
Axes(x_range=None, y_range=None, x_length=12, y_length=6, axis_config=None,
x_axis_config=None, y_axis_config=None, tips=True, **kwargs)
Axes
是一个用于创建坐标轴的函数,通常用于数学可视化或动画库中,比如 Manim。这个函数定义了一个坐标系,并允许用户自定义各种参数以满足特定的可视化需求。以下是各个参数的详细解释:
-
x_range
:设置 x 轴的范围,通常是一个包含两个元素的元组,例如(xmin, xmax)
。这将确定绘图时 x 轴的起始和结束值。 -
y_range
:设置 y 轴的范围。类似于x_range
,也是一个包含两个元素的元组,例如(ymin, ymax)
。 -
x_length
:设定 x 轴的长度(通常以单位为长度的像素或任意其他度量单位)。 -
y_length
:设定 y 轴的长度。 -
axis_config
:一个字典,用于定义整个坐标轴的通用配置选项,比如颜色、线条样式等。 -
x_axis_config
:一个字典,用于定义 x 轴的特定配置选项,例如轴线颜色、刻度的样式等。 -
y_axis_config
:一个字典,用于定义 y 轴的特定配置选项,设置与y_axis_config
类似。 -
tips
:布尔值,指示是否在轴的末端添加箭头(tip)。默认情况下为True
。 -
**kwargs
:其他关键字参数,可以传入更多配置选项,用于更进一步自定义 Axes 对象的外观和行为。
示例1:
-
from manim import * class LogScalingExample(Scene): def construct(self): ax = Axes( x_range=[0, 10, 1], y_range=[-2, 6, 1], tips=False, axis_config={"include_numbers": True, "stroke_color": WHITE}, # 这里设置坐标轴颜色 y_axis_config={"scaling": LogBase(), "stroke_color": GREEN}, # y轴颜色设置 ) # 设置 x 轴和 y 轴的标签 x_label = ax.get_x_axis_label("X") y_label = ax.get_y_axis_label("Y") # 手动设置标签颜色 x_label.set_color(BLUE) # 设置 x 轴标签的颜色 y_label.set_color(YELLOW) # 设置 y 轴标签的颜色 # x_min must be > 0 because log is undefined at 0. graph = ax.plot(lambda x: x ** 2, x_range=[0.001, 10], use_smoothing=False, color=ORANGE) # 设置图形的颜色 # 将坐标轴、标签和图形添加到场景 self.add(ax, graph, x_label, y_label)
函数和参数解释:
Axes
类:x_range
: 定义 x 轴的范围。第一个元素是起始值,第二个元素是结束值,第三个元素是步长。y_range
: 定义 y 轴的范围。参数意义同x_range
。tips
: 设置为False
时不显示坐标轴的箭头尾。axis_config
: 用于配置坐标轴的属性。这包括:include_numbers
: 如果设置为True
,坐标轴上将显示数字。stroke_color
: 设置坐标轴线的颜色。
y_axis_config
: 用于单独配置 y 轴的属性,特别是这里使用了scaling: LogBase()
来设置 y 轴为对数坐标。
标签的获取和设置:
get_x_axis_label("X")
: 获取 x 轴的标签,并设置其文本为 "X"。get_y_axis_label("Y")
: 获取 y 轴的标签,并设置其文本为 "Y"。set_color(color)
: 此函数用于设置 Mobject 的颜色。在这里用来分别设置 x 和 y 轴标签的颜色。
绘制图形:
ax.plot()
: 根据给定的数学函数绘制图形,在这里是lambda x: x ** 2
,表示 y = x²。x_range
用于指定 x 的取值范围。use_smoothing
: 决定绘制的线条是否要进行平滑处理。color
: 设置绘制的图形颜色,此处为橙色。
添加到场景:
self.add(...)
: 将创建的坐标轴(ax
)、图形(graph
)和标签(x_label
和y_label
)添加到场景中,从而在动画中显示。
总结:
这段代码实现了一个简单的坐标系,展示了一个对数刻度的 y 轴和一个抛物线函数(y = x²),同时还设置了坐标轴和标签的颜色。该示例展示了 Manim 中如何使用坐标轴和图形绘制以及自定义样式的基本用法。
运行结果:
示例2:
class AxesWithDifferentTips(Scene):def construct(self):self.camera.background_color = WHITEax = Axes(axis_config={'tip_shape': StealthTip,"stroke_color": BLACK})self.add(ax)
运行结果:
2.Axes._create_axis(range_terms, axis_config, length)的使用
_create_axis(range_terms, axis_config, length)
是一个函数,用于在 Manim 中创建坐标轴。根据传入的参数,可以设置坐标轴的范围、风格(配置)和长度。
参数解释:
-
range_terms
- 这是关于坐标轴范围的序列,通常是一个长度为 2 或 3 的列表,定义了坐标轴的起始值、结束值和可选的步长(如果需要)。例如,
[x_min, x_max]
或[y_min, y_max, step]
。
- 这是关于坐标轴范围的序列,通常是一个长度为 2 或 3 的列表,定义了坐标轴的起始值、结束值和可选的步长(如果需要)。例如,
-
axis_config
- 这是一个字典,用于定义坐标轴的样式和属性。典型的配置可能包括:
stroke_color
: 指定坐标轴的颜色。include_numbers
: 指定是否在坐标轴上显示数字。line_width
: 坐标轴线的宽度等。
- 这是一个字典,用于定义坐标轴的样式和属性。典型的配置可能包括:
-
length
- 表示坐标轴的长度。它的值决定了坐标轴在屏幕上占用的视觉长度。
示例:
from manim import * class CreateAxes(Scene): def construct(self): # 创建x轴和y轴的范围 x_range = [-3, 3,0.5] # x轴的范围从 -3 到 3 y_range = [-2, 2,0.5] # y轴的范围从 -2 到 2 # 创建坐标系 x_axis = Axes( x_range=x_range, y_range=y_range, axis_config={ "stroke_color": BLUE, "stroke_width": 2, # 使用 stroke_width 替代 line_width "include_numbers": True,} ) # 添加坐标系到场景中 self.add(x_axis) # 在坐标系中绘制 sin 函数 graph = x_axis.plot(lambda x: np.sin(x), color=ORANGE) self.play(Create(graph)) # 显示场景 self.wait(2)
运行结果:
3. _origin_shift(axis_range)的使用方法
_origin_shift(axis_range)
是一个静态方法(static method),通常用于计算坐标轴的原点(origin)偏移量,其输入是 axis_range
,而输出则是计算后得到的偏移量。虽然具体的实现和用法可能会因不同的库或 API 而异,通常来讲,axis_range
会是一个描述坐标轴显示范围的参数,如 [min, max]
。
解释
-
函数作用: 该函数用于确定坐标轴的起点(0点)相对于其范围的位置。在某些情境下,可能需要对坐标轴进行偏移,以便更好地显示图形或数据。
-
参数:
axis_range
: 一般是一个列表或元组,包含两个元素,分别是坐标轴的最小值和最大值。例如,[-3, 3]
表示坐标轴的范围从 -3 到 3。
示例:
from manim import *
import numpy as npclass OriginShift(Scene):def _origin_shift(self, axis_range):"""根据给定的坐标轴范围计算原点的偏移量。"""if len(axis_range) != 3: # 检查长度是否为3raise ValueError(f"Expected axis_range with 3 values, got {axis_range}")min_val, max_val, _ = axis_range # 解构为三个值origin = (min_val + max_val) / 2offset = origin- min_valreturn offsetdef construct(self):self.add(Dot())# 创建坐标轴axes = Axes(x_range=[-3, 3, 1], y_range=[-2, 2, 1], axis_config={"color": BLUE})# 获取原点偏移x_offset = self._origin_shift(axes.x_range) # [-3, 3, 1]print(f"x_range: {axes.x_range}")y_offset = self._origin_shift(axes.y_range) # [-2, 2, 1]print(f"y_range: {axes.y_range}")# 设置坐标轴位置axes.shift(DOWN * y_offset + RIGHT * x_offset)# 创建正弦函数图形graph = axes.plot(lambda x: np.sin(x), color=ORANGE, x_range=[-3, 3]) # 指定 x_rangegraph_label = axes.get_graph_label(graph, label='\\sin(x)')# 添加坐标轴和图形到场景self.add(axes, graph, graph_label)# 显示场景self.wait(2)
运行结果:
4._original__init__() 的使用方法
构造函数
_original__init__(x_range=None, y_range=None, x_length=12, y_length=6,axis_config=None, x_axis_config=None, y_axis_config=None, tips=True, **kwargs)
参数说明
-
x_range
:- 类型:
Sequence[float]
(通常是一个列表或元组) - 描述: 定义 x 轴的范围,通常是
[x_min, x_max, x_step]
。x_min
是 x 轴的最小值,x_max
是最大值,x_step
是在绘制时使用的步长。
- 类型:
-
y_range
:- 类型:
Sequence[float]
- 描述: 定义 y 轴的范围,通常是
[y_min, y_max, y_step]
。与x_range
类似。
- 类型:
-
x_length
:- 类型:
float
- 描述: x 轴的长度,单位通常是场景的单位。
- 类型:
-
y_length
:- 类型:
float
- 描述: y 轴的长度。
- 类型:
-
axis_config
:- 类型:
dict
, 可选 - 描述: 用于定义坐标轴的配置,例如颜色、线条样式等。可以在整体上应用于 x 轴和 y 轴。
- 类型:
-
x_axis_config
:- 类型:
dict
, 可选 - 描述: 用于特定于 x 轴的配置设置,覆盖
axis_config
中的设置。
- 类型:
-
y_axis_config
:- 类型:
dict
, 可选 - 描述: 用于特定于 y 轴的配置设置,覆盖
axis_config
中的设置。
- 类型:
-
tips
:- 类型:
bool
- 描述: 是否在轴的两端添加箭头(tips)。
- 类型:
-
**kwargs
:- 描述: 其他可选参数,可以用于进一步定制。
示例代码:
from manim import *class QuadraticGraph01(Scene):def construct(self):# 创建坐标轴axes = Axes(x_range=[-3, 3, 1], # x轴范围y_range=[0, 9, 1], # y轴范围axis_config={"color": BLUE}, # 坐标轴颜色x_length=6, # x轴长度y_length=4, # y轴长度)# 创建二次函数的图形graph = axes.plot(lambda x: x**2, color=YELLOW)# 添加标签graph_label = axes.get_graph_label(graph, label='y=x^2')# 显示坐标轴self.play(Create(axes))self.play(Create(graph), Write(graph_label))# 添加提示信息if True: # tips参数示例mt = MathTex(r"y=x^{2}") # 创建数学文本tips_text = Text("Graph of ", font_size=24) # 组合文本和数学表达式t10=VGroup(tips_text,mt).arrange(RIGHT)a1=t10.to_edge(UP)self.play(Write(a1))self.wait(2)self.play(FadeOut(tips_text))# 等待一段时间以便观看最终图形self.wait(2)
运行结果: