news 2026/9/3 12:58:41

用Manim坐标系可视化函数图像:NumberPlane、ComplexPlane与Axes完全指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用Manim坐标系可视化函数图像:NumberPlane、ComplexPlane与Axes完全指南

用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 中,继承结构非常清晰:

类名继承自一句话定位适用场景
AxesCoordinateSystem+VGroup最基础的二维坐标轴,无背景网格画函数曲线、标坐标点
NumberPlaneAxes带淡入背景网格线的坐标平面线性变换、网格变形动画
ComplexPlaneNumberPlane把平面当复数域,支持复数坐标复变函数映射、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) # 在轴上添加刻度数字

画曲线的三个核心方法:

  1. get_graph(function, **kwargs)—— 传入一个x -> y函数即返回曲线,支持coloruse_smoothing(有尖角时设为 False)、discontinuities(不连续点,避免画出假连线)
  2. get_graph_label(graph, "label")—— 自动生成与曲线同色的函数标签,字符串按 LaTeX 渲染
  3. i2gp(x, graph)input_to_graph_point的缩写)—— 求曲线上某 x 值对应的点,配合ValueTracker可做出"点在曲线上滑动"的经典动画

example_scenes.py中的 GraphExample 场景完整演示了这三者的配合:先画2sin(x),再变形为 ReLU、阶跃函数,最后让一个红点沿抛物线滑动。

NumberPlane:带背景网格的平面,变形动画神器

NumberPlaneAxes之上叠加了两层网格线(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 实现),核心区别有两个:

  1. n2p(z)/p2n(point):直接用复数定位,例如plane.n2p(2 + 3j)
  2. 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(CoordinateSystemExampleGraphExampleOpeningManimExample
  • 官方示例文档:docs/source/getting_started/example_scenes.rst
  • 快速上手:docs/source/getting_started/quickstart.rst

一句话总结:画函数曲线选Axes,要网格变形动画选NumberPlane,演示复变映射选ComplexPlane——三者一脉相承,掌握c2pget_graphi2gp这三个方法,你的数学动画之路就已经启程了 🚀

【免费下载链接】manimAnimation engine for explanatory math videos项目地址: https://gitcode.com/GitHub_Trending/ma/manim

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 12:55:52

腾势Z9GT无人漂移体验:自动驾驶横摆稳定控制技术解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/3 12:53:10

UPX加壳脱壳管家:PE文件处理与逆向分析实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/3 12:50:55

STM32驱动TFT屏卡顿根源:SPI时序、DMA与GRAM写入深度解析

简介:本资源面向STM32嵌入式初学者与项目开发者,提供1.8寸TFT彩屏在STM32平台上的完整驱动实现方案,解决SPI接口液晶屏在标准外设库与HAL库双框架下的适配、初始化、图像显示及汉字/图形绘制等核心问题。压缩包共含多个工程文件,以…

作者头像 李华
网站建设 2026/9/3 12:48:55

大模型成本直降 50%:LiteLLM 语义缓存完整配置指南

大模型成本直降 50%:LiteLLM 语义缓存完整配置指南 【免费下载链接】litellm The fastest, litest AI Gateway. Rust core with Python SDK. Call 100 LLM APIs in OpenAI (or native) format with cost tracking, guardrails, load balancing, and logging [Bedroc…

作者头像 李华