跳到主要内容

Manim 通用坐标轴和公式动画模板

🎬 Manim 可复用模板:标准坐标系、公式动画、函数图像、几何变换与颜色规范。

目标

提供可直接复用的 Manim 代码片段,覆盖数学可视化最常见的场景,减少每次重复搭建基础设施的时间。


通用配置

from manim import *

# 全局配置
config.background_color = "#1e1e2e" # 深色背景
config.pixel_height = 1080
config.pixel_width = 1920
config.frame_rate = 60

# 颜色规范
COLOR_PRIMARY = "#89b4fa" # 蓝色 - 主要对象
COLOR_SECONDARY = "#a6e3a1" # 绿色 - 辅助/对比
COLOR_ACCENT = "#f38ba8" # 红色 - 强调/高亮
COLOR_NEUTRAL = "#6c7086" # 灰色 - 背景元素
COLOR_FORMULA = "#cdd6f4" # 白色 - 公式文字

模板 1:标准坐标轴

class AxesTemplate(Scene):
def construct(self):
# 创建坐标轴
axes = Axes(
x_range=[-4, 4, 1], # [最小, 最大, 刻度间距]
y_range=[-3, 3, 1],
x_length=8,
y_length=6,
axis_config={
"color": COLOR_NEUTRAL,
"include_tip": True,
"tip_length": 0.2,
"stroke_width": 2,
},
x_axis_config={"numbers_to_include": range(-3, 4)},
y_axis_config={"numbers_to_include": range(-2, 3)},
)

# 轴标签
labels = axes.get_axis_labels(
x_label=MathTex("x"),
y_label=MathTex("y")
)

self.play(Create(axes), Write(labels))
self.wait()

模板 2:函数图像

class FunctionPlotTemplate(Scene):
def construct(self):
axes = Axes(x_range=[-4, 4, 1], y_range=[-2, 4, 1])

# 绘制函数
func = axes.plot(
lambda x: np.sin(x),
x_range=[-4, 4],
color=COLOR_PRIMARY,
stroke_width=3,
)
func_label = axes.get_graph_label(
func, label=MathTex(r"f(x) = \sin x"), x_val=2
)

# 动态绘制(描边效果)
self.play(Create(axes))
self.play(Create(func), run_time=2)
self.play(Write(func_label))

# 面积填充
area = axes.get_area(
func,
x_range=[0, PI],
color=COLOR_PRIMARY,
opacity=0.3,
)
self.play(FadeIn(area))
self.wait()

模板 3:公式动画

class FormulaAnimation(Scene):
def construct(self):
# 逐步呈现公式
formula = MathTex(
r"e^{i\pi}", # [0]
r"+", # [1]
r"1", # [2]
r"=", # [3]
r"0", # [4]
)
formula.set_color_by_tex("e^{i\\pi}", COLOR_PRIMARY)
formula.set_color_by_tex("0", COLOR_ACCENT)

# 逐项显示
for part in formula:
self.play(Write(part), run_time=0.5)
self.wait(1)

# 公式变换(TransformMatchingTex 保持相同部分不动)
formula2 = MathTex(r"e^{i\pi} = -1")
self.play(TransformMatchingTex(formula, formula2))
self.wait()

模板 4:向量与矩阵变换

class LinearTransformTemplate(Scene):
def construct(self):
plane = NumberPlane(
background_line_style={
"stroke_color": COLOR_NEUTRAL,
"stroke_width": 1,
"stroke_opacity": 0.5,
}
)

# 定义向量
v = Vector([2, 1], color=COLOR_PRIMARY)
v_label = MathTex(r"\mathbf{v}").next_to(v.get_end(), UR)

self.play(Create(plane))
self.play(Create(v), Write(v_label))

# 应用线性变换
matrix = [[2, 1], [0, 1]] # 剪切变换
self.play(
plane.animate.apply_matrix(matrix),
v.animate.apply_matrix(matrix),
run_time=2
)
self.wait()

模板 5:动态高亮与强调

# 闪烁强调
self.play(Indicate(target_mobject, color=COLOR_ACCENT, scale_factor=1.3))

# 矩形框强调
rect = SurroundingRectangle(target, color=COLOR_ACCENT, buff=0.1)
self.play(Create(rect))

# 下划线
underline = Underline(target, color=COLOR_SECONDARY)
self.play(Create(underline))

# 颜色切换
self.play(target.animate.set_color(COLOR_ACCENT))

模板 6:文字与数学混排

class MixedTextTemplate(Scene):
def construct(self):
# 标题
title = Text("梯度下降", font="Noto Sans CJK SC", font_size=48)
title.to_edge(UP)

# 说明文字 + 公式混排
text = VGroup(
Text("更新规则:", font_size=32),
MathTex(r"\theta := \theta - \eta \nabla f(\theta)", font_size=36),
).arrange(RIGHT, buff=0.3)

self.play(Write(title))
self.play(Write(text))
self.wait()

通用动画节奏参考

场景推荐时长
坐标轴出现1.0s
函数图像描边1.5 ~ 2.0s
公式出现0.5 ~ 1.0s / 项
几何变换2.0 ~ 3.0s
强调动画0.5 ~ 0.8s
场景切换等待1.0 ~ 2.0s

常用 Manim 类速查

用途
Axes / NumberPlane坐标系
MathTexLaTeX 公式
Text中英文文字
Vector向量箭头
Create / Write出现动画
Transform / TransformMatchingTex变换动画
Indicate / Flash强调动画
FadeIn / FadeOut淡入淡出
ValueTrackeralways_redraw参数驱动动画