用Manim坐标系可视化函数图像:NumberPlane、ComplexPlane与Axes完全指南
【免费下载链接】manimAnimation engine for explanatory math videos项目地址: https://gitcode.com/GitHub_Trending/ma/manim
Manim(ManimGL)是一个开源的数学动画引擎,专为制作数学科普视频而生。它的核心能力之一,就是让你用几行代码把函数图像、坐标系、网格平面变成流畅的动画:Axes负责画函数曲线,NumberPlane提供可拉伸变形的网格平面,ComplexPlane则把平面当作复数域来演示复变映射。本文带你快速上手这三个类,看懂它们的继承关系、常用参数和典型用法,无需深入源码也能写出漂亮的数学可视化动画 🎬
快速开始:5 分钟渲染第一个坐标轴场景
环境要求:Python 3.10+,系统需安装 FFmpeg 和 OpenGL(LaTeX 可选,用于渲染数学公式)。
pip install manimgl manimgl如果想从源码运行示例场景,先克隆仓库:
git clone https://gitcode.com/GitHub_Trending/ma/manim cd manim pip install -e . manimgl example_scenes.py OpeningManimExample仓库自带的 example_scenes.py 就是最佳学习材料,其中CoordinateSystemExample(坐标轴演示)和GraphExample(函数图像演示)两个场景覆盖了本文所有知识点。
三大坐标系类:一张图看懂继承关系
所有坐标系都定义在 manimlib/mobject/coordinate_systems.py 中,继承结构非常清晰:
| 类名 | 继承自 | 一句话定位 | 适用场景 |
|---|---|---|---|
Axes | CoordinateSystem+VGroup | 最基础的二维坐标轴,无背景网格 | 画函数曲线、标坐标点 |
NumberPlane | Axes | 带淡入背景网格线的坐标平面 | 线性变换、网格变形动画 |
ComplexPlane | NumberPlane | 把平面当复数域,支持复数坐标 | 复变函数映射、z→z² 动画 |
抽象基类 CoordinateSystem 定义了所有子类的通用能力:
c2p(x, y)/p2c(point):坐标 ↔ 屏幕位置互转,定位点时最常用get_origin():获取原点get_graph(func):把任意函数画成曲线get_v_line/get_h_line:从坐标轴到某点画辅助虚线- 默认范围:x 轴 (-8, 8)、y 轴 (-4, 4),步长 1(见 DEFAULT_X_RANGE)
Axes:绘制函数图像的通用坐标轴
Axes是画函数图像的"主力",它本质上是两条NumberLine组成的坐标轴,支持自定义范围、单位和刻度样式(Axes 构造函数):
axes = Axes( x_range=(-3, 10), # x 轴范围,可加第三个参数设刻度步长 y_range=(-1, 8), height=6, width=10, # 指定宽高后按单位换算 unit_size=1.0, # 或直接指定每个单位占多少米 ) axes.add_coordinate_labels(font_size=20) # 在轴上添加刻度数字画曲线的三个核心方法:
get_graph(function, **kwargs)—— 传入一个x -> y函数即返回曲线,支持color、use_smoothing(有尖角时设为 False)、discontinuities(不连续点,避免画出假连线)get_graph_label(graph, "label")—— 自动生成与曲线同色的函数标签,字符串按 LaTeX 渲染i2gp(x, graph)(input_to_graph_point的缩写)—— 求曲线上某 x 值对应的点,配合ValueTracker可做出"点在曲线上滑动"的经典动画
example_scenes.py中的 GraphExample 场景完整演示了这三者的配合:先画2sin(x),再变形为 ReLU、阶跃函数,最后让一个红点沿抛物线滑动。
NumberPlane:带背景网格的平面,变形动画神器
NumberPlane在Axes之上叠加了两层网格线(NumberPlane 实现):
- 背景线(
background_line_style):每个刻度单位一条,默认蓝色BLUE_D - 淡化线(
faded_line_style):faded_line_ratio默认 4,即每条主线之间再插入 4 条半透明细线
这个"双层网格"设计是 Manim 的招牌:先调用prepare_for_nonlinear_transform()给网格加密,再对整个平面应用函数,就能得到平滑的变形动画。
grid = NumberPlane((-10, 10), (-5, 5)) grid.prepare_for_nonlinear_transform() self.play(grid.animate.apply_matrix([[1, 1], [0, 1]]), run_time=3)NumberPlane还提供了两个实用方法:
get_vector(coords):从原点画出指向指定坐标的箭头向量apply_complex_function(func):把平面上的每个点当复数施加变换——这正是 OpeningManimExample 场景 中演示z → z²映射的原理
ComplexPlane:把平面当作复数域
ComplexPlane继承自NumberPlane,但把"坐标"升级为"复数"(ComplexPlane 实现),核心区别有两个:
n2p(z)/p2n(point):直接用复数定位,例如plane.n2p(2 + 3j)add_coordinate_labels():自动识别刻度——虚轴上的数字会带i单位(如 2i、-3i),实轴则显示普通数字
典型用法就是仓库开场示例中的复变映射动画:复制一份网格 →prepare_for_nonlinear_transform()加密 → 对副本执行animate.apply_complex_function(lambda z: z**2),你会看到复平面在 z² 映射下如何优雅地折叠变形。
新手避坑:常用参数速查
| 需求 | 写法 |
|---|---|
| 指定刻度数字 | axes.add_coordinate_labels(x_values=[...], y_values=[...]) |
| 加轴名(x、y) | axes.add_axis_labels("x", "y") |
| 点跟随坐标 | f_always(dot.move_to, lambda: axes.c2p(1, 1)) |
| 曲线带尖角 | get_graph(..., use_smoothing=False) |
| 阶跃函数 | get_graph(..., discontinuities=[3]) |
| 三维坐标轴 | 用ThreeDAxes(源码),需配ThreeDScene |
💡 小提示:c2p/p2c/i2gp这类缩写是 Manim 的惯用写法,阅读 3Blue1Brown 视频源码时见到它们不会陌生。
相关资源与文件导航
- 坐标系全部源码:manimlib/mobject/coordinate_systems.py
- 坐标轴(NumberLine)实现:manimlib/mobject/number_line.py
- 可运行示例场景:example_scenes.py(
CoordinateSystemExample、GraphExample、OpeningManimExample) - 官方示例文档:docs/source/getting_started/example_scenes.rst
- 快速上手:docs/source/getting_started/quickstart.rst
一句话总结:画函数曲线选Axes,要网格变形动画选NumberPlane,演示复变映射选ComplexPlane——三者一脉相承,掌握c2p、get_graph、i2gp这三个方法,你的数学动画之路就已经启程了 🚀
【免费下载链接】manimAnimation engine for explanatory math videos项目地址: https://gitcode.com/GitHub_Trending/ma/manim
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考