ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

ManimCE 函数绘制与数据可视化实战:从坐标轴到参数曲线的完整指南

2026/9/10 2:37:37 拓冰建站 浏览量
ManimCE 函数绘制与数据可视化实战:从坐标轴到参数曲线的完整指南 ManimCE 函数绘制与数据可视化实战从坐标轴到参数曲线的完整指南【免费下载链接】OpenMontageWorlds first open-source, agentic video production system. 12 production pipelines, 100 tools, 700 agent skill and production-knowledge files. Turn your AI coding assistant into a full video production studio.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMontage在 OpenMontage 视频生产系统中Manim Community EditionManimCE承担着数学动画与科普类视频的生成任务其核心能力之一就是函数绘图与数据可视化——将数学表达式、数据点和几何曲线转换为可直接渲染的动画场景。本文以仓库内.claude/skills/manimce-best-practices/rules/graphing.md为基础结合配套的完整示例 graph_plotting.py 与 math_animate 工具 的源码实现系统讲解坐标轴配置、函数绘制、参数曲线、面积可视化、动态动画与 3D 曲面等实战技术。读完本文你将能够独立编写从简单抛物线到复杂参数曲线、再到 3D 曲面的完整 Manim 绘图场景并理解其在 OpenMontage 视频生产管线中的实际落地方案。前置准备坐标轴Axes是绘图的地基在 ManimCE 中所有函数绘图都建立在坐标轴Axes之上。Axes本质上是两条数轴NumberLine的组合它将数学坐标空间映射到屏幕像素空间。from manim import * class BasicPlot(Scene): def construct(self): axes Axes(x_range[-3, 3], y_range[-2, 8]) # Plot a function graph axes.plot(lambda x: x**2, colorBLUE) self.add(axes, graph)x_range与y_range接受[min, max, step]三元组第三个元素控制刻度步长x_length与y_length控制坐标轴在屏幕上的物理长度。来自 axes.md 的完整配置示例展示了更精细的控制class CustomAxes(Scene): def construct(self): axes Axes( x_range[-5, 5, 1], # [min, max, step] y_range[-3, 3, 1], x_length10, # Physical length on screen y_length6, axis_config{ color: BLUE, include_tip: True, include_numbers: True, }, x_axis_config{ numbers_to_include: [-4, -2, 0, 2, 4], }, y_axis_config{ numbers_to_include: [-2, 0, 2], }, ) self.add(axes)坐标转换三件套c2p、p2c 与 i2gpAxes提供了两个方向的坐标转换方法以及一个专门服务于函数图形的查询方法这在后续绘制切点、标注数据点时至关重要# c2p coords_to_point数学坐标 - 屏幕位置 point axes.c2p(2, 1) # p2c point_to_coords屏幕位置 - 数学坐标 coords axes.p2c(point) # i2gp input_to_graph_point给定 x求 graph 上对应点的屏幕位置 dot Dot(axes.i2gp(1.5, graph))plot() 参数详解控制定义域、颜色与线宽axes.plot()接受一个Callable[[float], float]形式的函数对象lambda 或具名函数均可并通过参数控制其绘制细节。原文档的PlotParameters场景展示了三个最常用参数class PlotParameters(Scene): def construct(self): axes Axes(x_range[-5, 5], y_range[-2, 2]) graph axes.plot( lambda x: np.sin(x), x_range[-PI, PI], # Limit domain colorYELLOW, stroke_width4, ) self.add(axes, graph)各参数的作用与取值建议参数作用说明x_range限定绘制定义域用于避免函数在无定义区间如对数、开根号、分式的奇点被错误连线color曲线颜色使用 ManimCE 预置颜色常量如BLUE、YELLOW、GREENstroke_width曲线线宽默认约为 4放大强调时可以提高discontinuities标记不连续点配合dt参数跳过断点处连线需要说明的是axes.plot()传入的可以是任意单参数函数——np.sin、np.cos这类 numpy 函数也可以直接传入而无需 lambda 包装仓库示例 graph_plotting.py 中正是这样使用axes.plot(np.sin, colorBLUE, x_range[-2*PI, 2*PI])。多函数叠加在同一坐标轴上对比曲线将多个函数绘制在同一个Axes上是数学可视化中最常见的对比手法。原文档的MultiplePlots场景直接给出了正弦、余弦、二次函数三线同框的写法class MultiplePlots(Scene): def construct(self): axes Axes(x_range[-3, 3], y_range[-2, 10]) sin_graph axes.plot(lambda x: np.sin(x), colorBLUE) cos_graph axes.plot(lambda x: np.cos(x), colorRED) quad_graph axes.plot(lambda x: x**2, colorGREEN) self.add(axes, sin_graph, cos_graph, quad_graph)配套示例 graph_plotting.py 进一步演示了“多曲线 分步动画 图例标签”的完整模式先Create(axes)再依次Create(sine)与Create(cosine)同时用MathTex配合to_corner(UR)与next_to(..., DOWN)摆放图例实现 3Blue1Brown 风格的渐进式揭示。为图形添加标签get_graph_labelget_graph_label是Axes提供的高层 API它会在曲线指定位置自动摆放标签并处理好偏移方向class GraphLabels(Scene): def construct(self): axes Axes(x_range[-3, 3], y_range[-2, 10]) graph axes.plot(lambda x: x**2, colorBLUE) # Add label to graph label axes.get_graph_label( graph, labelMathTex(y x^2), x_val2, directionUR ) self.add(axes, graph, label)参数含义label为标签内容MathTex或普通字符串x_val指定标签锚定在曲线上的横坐标位置direction控制标签相对该点的偏移方向UR、UL、DR、DL等。这与 graph_plotting.py 中手动MathTex(...).next_to(parabola, UR)的方式殊途同归——前者锚定更精确后者布局更灵活。参数曲线plot_parametric_curve 与 ParametricFunction基于坐标轴绘制参数曲线通过plot_parametric_curve绘制其函数返回三维数组[x(t), y(t), z(t)]t_range控制参数t的扫描范围。原文档用圆形给出了最小示例class ParametricExample(Scene): def construct(self): axes Axes(x_range[-3, 3], y_range[-3, 3]) # Circle: x cos(t), y sin(t) curve axes.plot_parametric_curve( lambda t: np.array([np.cos(t), np.sin(t), 0]), t_range[0, 2 * PI], colorYELLOW ) self.add(axes, curve)经典参数曲线三例原文档附带了三组可直接复用的经典参数曲线分别对应利萨茹曲线、螺旋线与心形线# Lissajous curve curve axes.plot_parametric_curve( lambda t: np.array([np.sin(3*t), np.sin(2*t), 0]), t_range[0, 2*PI], ) # Spiral curve axes.plot_parametric_curve( lambda t: np.array([t*np.cos(t), t*np.sin(t), 0]), t_range[0, 4*PI], ) # Heart curve curve axes.plot_parametric_curve( lambda t: np.array([ 16 * np.sin(t)**3, 13*np.cos(t) - 5*np.cos(2*t) - 2*np.cos(3*t) - np.cos(4*t), 0 ]) / 10, t_range[0, 2*PI], )配套示例 graph_plotting.py 还展示了参数曲线的进阶玩法在同一坐标轴上先绘制圆形再绘制利萨茹曲线最后用self.play(Transform(circle, lissajous))实现曲线之间的平滑形变——这是 Manim 视觉叙事中“同源概念相互转化”的标准手法。此外隐函数如x^2 y^2 4在 Manim 中没有直接的隐式绘图 API标准做法正是将其参数化为圆/椭圆后绘制见示例中的ImplicitFunction场景。脱离坐标轴的独立绘制当只需要一条曲线而不需要坐标网格时可以直接使用独立的ParametricFunctionmobjectclass StandaloneParametric(Scene): def construct(self): curve ParametricFunction( lambda t: np.array([np.cos(t), np.sin(t), 0]), t_range[0, 2*PI], colorBLUE ) self.add(curve)面积与黎曼矩形可视化积分概念曲线下方面积get_areaget_area用于在曲线与 x 轴之间填充半透明色块是讲解定积分几何意义的标配工具class AreaUnderCurve(Scene): def construct(self): axes Axes(x_range[-1, 5], y_range[-1, 10]) graph axes.plot(lambda x: x**2, x_range[0, 3], colorBLUE) # Shade area under curve area axes.get_area( graph, x_range[0, 2], colorBLUE, opacity0.5 ) self.add(axes, graph, area)配套示例 graph_plotting.py 将其扩展为完整的“微积分叙事”绘制0.5x²的曲线后填充[1, 3]区间面积并在右上角用MathTex(r\int_1^3 \frac{x^2}{2} \, dx)写出积分式先Create(func)、再FadeIn(area)、最后Write(integral)实现“图形 - 面积 - 符号”的三级递进。黎曼矩形get_riemann_rectanglesget_riemann_rectangles将曲线下方的区域离散化为矩形dx控制矩形宽度宽度越小越逼近真实面积class RiemannRectangles(Scene): def construct(self): axes Axes(x_range[-1, 5], y_range[-1, 10]) graph axes.plot(lambda x: x**2, colorBLUE) rects axes.get_riemann_rectangles( graph, x_range[0, 3], dx0.5, colorYELLOW, stroke_width1 ) self.add(axes, graph, rects)graph_plotting.py 中的RiemannSum场景给出了动画版遍历dx_values [1, 0.5, 0.25]矩形逐次加密直观演示黎曼和收敛于定积分的过程是数学课堂视频的经典桥段。动态绘图动画图形与沿曲线运动的点用 Create 动画绘制曲线静态图形远不如动态绘制有表现力。Create(graph)会沿曲线路径逐段描画run_time控制时长class AnimatedGraph(Scene): def construct(self): axes Axes(x_range[-3, 3], y_range[-2, 2]) self.add(axes) graph axes.plot(lambda x: np.sin(x), colorBLUE) # Animate the graph being drawn self.play(Create(graph), run_time3)沿曲线移动的点ValueTracker always_redraw i2gp原文档的MovingPointOnGraph场景是“函数图像上运动质点”的标准模板用ValueTracker保存当前横坐标always_redraw保证每一帧重新计算点的位置i2gp负责把横坐标映射为曲线上的屏幕坐标class MovingPointOnGraph(Scene): def construct(self): axes Axes(x_range[-3, 3], y_range[-2, 2]) graph axes.plot(lambda x: np.sin(x), colorBLUE) # Point that follows graph x_tracker ValueTracker(-3) dot always_redraw(lambda: Dot( axes.i2gp(x_tracker.get_value(), graph), colorYELLOW )) self.add(axes, graph, dot) self.play(x_tracker.animate.set_value(3), run_time4)配套示例 graph_plotting.py 展示了更强的动态模式——参数化图形本身用ValueTracker保存振幅always_redraw内重新调用axes.plot(lambda x: amplitude.get_value() * np.sin(x))随后依次play(amplitude.animate.set_value(2))等让整条正弦曲线的振幅连续变化同时右上角实时显示A 2.0。这也印证了 updaters.md 中的核心思想ValueTrackeralways_redraw是构建动态数学可视化的通用组合。3D 曲面绘制ThreeDAxes 与 plot_surface当需要表达z f(x, y)的空间曲面时使用ThreeDScene与plot_surface。曲面函数接收二维参数(u, v)并返回标量zcolorscale可以传入颜色列表生成渐变着色class SurfacePlot(ThreeDScene): def construct(self): axes ThreeDAxes() surface axes.plot_surface( lambda u, v: np.sin(u) * np.cos(v), u_range[-PI, PI], v_range[-PI, PI], colorscale[BLUE, GREEN, YELLOW], ) self.set_camera_orientation(phi75*DEGREES, theta-45*DEGREES) self.add(axes, surface)注意三个要点场景类必须继承ThreeDSceneset_camera_orientation通过phi/theta极角与方位角控制相机视角3D 场景默认使用 Cairo 渲染器。仓库技能 manim-usage.md 明确建议默认使用 2D仅当“空间关系本身就是概念”时才使用 3D——3D 渲染速度明显慢于 2D且曲面类场景应配合相机轨道运动来揭示隐藏结构。详细的 3D 相机控制可参考 3d.md。进阶实战来自仓库示例的完整模式切线可视化graph_plotting.py 的TangentLine场景是“导数可视化”的经典实现对y x²在x 2处取切点用点斜式4*(x-2)4绘制切线并用MathTex(rm 2x 4)标出斜率# Point of tangency at x 2 point Dot(axes.c2p(x_val, x_val ** 2), colorRED) # Tangent line: derivative of x^2 is 2x, at x2 slope is 4 tangent axes.plot( lambda x: 4 * (x - 2) 4, # Point-slope form colorYELLOW, x_range[0.5, 3.5] )数据点标注CoordinateLabeling场景演示了数据点标注的标准流程用c2p定位点用DashedLine向坐标轴引辅助虚线用next_to摆放横纵坐标标签。NumberPlaneExample场景则演示了在NumberPlane网格上从原点向目标点画Arrow向量配合GrowArrow动画实现向量可视化。极坐标绘图PolarPlot场景使用PolarPlane与plot_polar_graph绘制极坐标曲线心形线r 1 sin(θ)与玫瑰线r 2·cos(3θ)两者之间同样可以用Transform动画切换polar_plane PolarPlane(radius_max3, size6) cardioid polar_plane.plot_polar_graph( lambda theta: 1 np.sin(theta), theta_range[0, 2 * PI], colorBLUE )在 OpenMontage 中的落地math_animate 工具上述绘图模式在 OpenMontage 中通过 math_animate 工具 统一封装。该工具基于 ManimCE 本地运行无需 API Key成本为零其input_schema接受scene_code定义Scene类的 Python 代码、qualitylow/medium/high/4k/preview预设、formatmp4/gif/png/webm、background_color等参数其中质量预设直接映射到 Manim CLI 的质量旗标见 QUALITY_PRESETS。值得特别说明的是其安全边界scene_code会在宿主机上被 Manim 实际执行因此工具内置静态扫描拦截os、subprocess、socket、requests、eval、open等危险导入与危险标识符并默认拒绝所有双下划线属性访问仅放行__init__与__name__见 math_animate.py。只有当allow_unsafe_codeTrue时才绕过该扫描。对应的安全契约由 test_math_animate_safety.py 全量覆盖验证。在 OpenMontage 生产实践中见 manim-usage.md绘图场景还需遵循以下约定一个场景一个概念复杂证明拆分为多个 Manim 场景每次画面揭示不超过 34 个新视觉元素配色语义化未知量用YELLOW、已知常量用BLUE_C、矩阵/算子用RED、标注用GREEN、弱化元素用GREYopacity0.5时序规范方程书写Write用 1.52.0s图形Create用 0.81.2s重大揭示后至少self.wait(1.5)背景统一始终使用深色背景BLACK或#1a1a2e视频输出为 1080p。渲染与发布CLI 命令速查绘图场景编写完成后通过 Manim CLI 渲染。来自 cli.md 的完整命令体系如下# 开发迭代低质量 预览快 manim -pql scene.py MyScene # 草稿审查中等质量 manim -pqm scene.py MyScene # 成片输出1080p60OpenMontage 的 YouTube 横屏标准 manim -qh scene.py MyScene # 分享用 GIF manim --format gif -qm scene.py MyScene # 只存最后一帧缩略图 manim -s scene.py MyScene # 渲染文件中所有场景 manim -a scene.py # 自定义分辨率与帧率 manim -r 1920,1080 --fps 30 scene.py MyScene质量旗标对照-ql854x480/15fps测试用、-qm1280x720/30fps、-qh1920x1080/60fps、-qp2560x1440/60fps、-qk3840x2160/60fps。若直接使用math_animate工具则无需手写 CLI只需在scene_code中定义好Scene子类并指定quality参数即可。最佳实践总结结合原文档的规则清单与仓库中的实际示例函数绘图场景应遵循以下五条准则为不连续函数显式设置x_range避免在无定义区域对数、开方、分式奇点被自动连线产生误导善用get_graph_label函数曲线务必配标签x_val锚定位置、direction控制方向保证可读性让颜色匹配概念同一视频内保持一致的语义化配色如未知量一律黄色避免颜色歧义绘制曲线上的点一律使用i2gp由 Manim 自动处理坐标转换杜绝手工换算导致的像素级偏差用动画代替静态展示Create描画曲线、ValueTracker always_redraw驱动动态参数让数学“活”起来。完整的可运行参考实现位于 graph_plotting.py含 12 个场景坐标轴、函数绘制、多函数、面积、NumberPlane、参数曲线、切线、动态振幅、黎曼和、隐函数、坐标标注、极坐标可直接以manim -pql graph_plotting.py SceneName运行验证。配套的坐标系统基础可参考 axes.md场景规划方法论可参考 manim-composer 技能渲染参数与 CLI 细节见 cli.md。【免费下载链接】OpenMontageWorlds first open-source, agentic video production system. 12 production pipelines, 100 tools, 700 agent skill and production-knowledge files. Turn your AI coding assistant into a full video production studio.项目地址: https://gitcode.com/GitHub_Trending/op/OpenMontage创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考