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 | 坐标系 |
MathTex | LaTeX 公式 |
Text | 中英文文字 |
Vector | 向量箭头 |
Create / Write | 出现动画 |
Transform / TransformMatchingTex | 变换动画 |
Indicate / Flash | 强调动画 |
FadeIn / FadeOut | 淡入淡出 |
ValueTracker • always_redraw | 参数驱动动画 |