- AI 技能/插件
- 音视频
- 视频处理
- 人工智能
【免费下载链接】video-use
Edit videos with coding agents
本指南以 skills/manim-video/references/graphs-and-data.md 为核心骨架,系统讲解用 Manim Community Edition 制作坐标轴、函数曲线、柱状图、动态计数器、算法可视化、图论与矢量场等数据类动画的完整技法。在 video-use 项目中,这套技能是「算法可视化」与「数据故事」两种视频模式的底层动画引擎(见 SKILL.md 的 Modes 表)。读完本文,你将掌握从搭建坐标轴到驱动动态参数、再到图论与矢量场渲染的每一段可运行代码,并能把数据动画作为 overlay 叠加进最终的final.mp4成片。
环境准备:在 video-use 中启用 Manim 动画槽
本参考文档面向 Manim Community Edition v0.20+,文档中的 API 在 Manim CE v0.20.1 上验证通过(见 manim-video/SKILL.md 的 Prerequisites)。前置依赖包括:
- Python 3.10+
- Manim CE:
pip install manim - LaTeX(Linux 用
texlive-full,macOS 用mactex),用于MathTex渲染公式 - ffmpeg,用于场景拼接与格式转换
仓库提供了依赖自检脚本 skills/manim-video/scripts/setup.sh,它会依次检查python3、manim、pdflatex、ffmpeg四个命令是否就绪并汇总缺失项:
bash skills/manim-video/scripts/setup.sh在 video-use 的动画工作流中,每个 Manim 动画是edit/animations/slot_<id>/下的一个独立槽位:子 Agent 在槽目录内编写场景脚本、渲染出render.mp4,再由render.py依据 EDL 中的overlays字段以setpts=PTS-STARTPTS+T/TB平移到输出时间轴上的指定窗口(详见 SKILL.md 的 Animations 章节)。本指南的所有代码片段都对应这类槽位中可独立渲染的Scene子类。
Axes:数据可视化的地基
任何图表动画的第一步都是搭建坐标系。Axes负责把数学坐标映射到屏幕坐标,后续的plot、get_area、c2p都以它为基准:
axes = Axes( x_range=[-3, 3, 1], y_range=[-2, 2, 1], x_length=8, y_length=5, axis_config={"include_numbers": True, "font_size": 24} ) axes.set_opacity(0.15) # structural element x_label = axes.get_x_axis_label(r"x")参数语义如下:
| 参数 | 取值 | 作用 |
|---|---|---|
x_range/y_range | [min, max, step] | 数学坐标系的范围与刻度步长,如[-3, 3, 1]表示从 -3 到 3、每 1 个单位一个刻度 |
x_length/y_length | 数值(屏幕单位) | 坐标轴在屏幕上的像素长度,决定图表在画面中的占比 |
axis_config | 字典 | 透传给坐标轴的配置,include_numbers=True显示刻度数字,font_size控制刻度字号 |
这里有一个贯穿整个技能的设计约定值得注意:结构元素要降透明度。在 visual-design.md 的视觉层次清单 中,主元素亮度为 1.0、上下文元素为 0.3–0.4、结构性元素(坐标轴、网格)为 0.15。axes.set_opacity(0.15)正是这一原则的落实——坐标轴是参照系而非主角,让观众的目光始终落在数据曲线上。同理,刻度字号 24 也对应 SKILL.md 的排版字号表 中的 Label 档。
Plotting:函数绘图三板斧
在坐标轴上绘制函数是数据动画的核心操作,Manim 提供了曲线、标签、面积三个配套 API:
graph = axes.plot(lambda x: x**2, color=BLUE) graph_label = axes.get_graph_label(graph, label=r"x^2", x_val=2) area = axes.get_area(graph, x_range=[0, 2], color=BLUE, opacity=0.3)axes.plot(func, color=...)接受一个 Python 可调用对象(lambda 或np.sin等),在坐标轴范围内采样生成曲线 mobject;get_graph_label(graph, label=..., x_val=...)把标签放置在曲线上指定 x 位置附近,label用 LaTeX 原始字符串书写(r"..."前缀是硬性要求,见 SKILL.md 的 Critical Implementation Notes);get_area(graph, x_range=[0, 2], ...)生成曲线与 x 轴围成的填充区域,配合低透明度(0.3)即可实现「积分面积」的经典视觉。
x_range的[min, max, step]三元组、axis_config字典、以及透明度分层(结构 0.15 / 面积填充 0.3)构成了整套图表动画的可复用视觉语言。从源码结构看,get_area返回的是由曲线与坐标轴闭合而成的填充 mobject,因此它可以像普通 mobject 一样被always_redraw重建——这正是下一节动态绘图的基础。
Animated Plotting:让曲线活起来
数据动画的价值在于「过程」。Manim 提供三种由浅入深的动态手法:描线、轨迹移动、参数驱动。
描线(Create)——Create(graph)沿曲线轮廓逐段绘制,是「函数如何被画出」的直观演示:
self.play(Create(graph), run_time=3) # trace the graph轨迹移动(MoveAlongPath)——让一个小圆点沿曲线滑行,配合axes.c2p把数学坐标换算成屏幕坐标:
# Moving dot along curve dot = Dot(color=YELLOW).move_to(axes.c2p(0, 0)) self.play(MoveAlongPath(dot, graph), run_time=3)MoveAlongPath接受任意VMobject作为路径,位置由path.point_from_proportion()计算(见 animations.md)。
动态参数(ValueTracker + always_redraw)——这是数据动画最强大的模式:用一个不可见的ValueTracker充当「滑块」,让曲线随参数实时变形:
# Dynamic parameter tracker = ValueTracker(1) dynamic = always_redraw(lambda: axes.plot(lambda x: tracker.get_value() * x**2, color=BLUE)) self.add(dynamic) self.play(tracker.animate.set_value(3), run_time=2)其原理在 updaters-and-trackers.md 中有完整阐述:ValueTracker是一个不出现在画面上的 mobject,只存一个浮点数;always_redraw让 Manim每一帧(15–60 fps,取决于渲染质量)都重新执行 lambda 重建 mobject。这里的执行链条是:
- 创建
tracker(隐形滑块); - 创建读取 tracker 的可视对象(
always_redraw(lambda: axes.plot(...))); self.play(tracker.animate.set_value(3))平滑推动滑块,曲线自动跟随。
注意always_redraw每次都会完整重建 mobject,适合「结构随参数变化」的场景;若只是位置、颜色等属性变化,用add_updater更省性能(详见 updaters-and-trackers.md 的取舍建议)。另外,用always_redraw创建的对象仍需self.add()加入场景,否则更新器不会运行。
Bar Charts:柱状图的创建与数值突变
BarChart是数据故事中最常用的现成图表 mobject,一条命令即可生成一组可动画的柱体:
chart = BarChart( values=[4, 6, 2, 8, 5], bar_names=["A", "B", "C", "D", "E"], y_range=[0, 10, 2], bar_colors=[RED, GREEN, BLUE, YELLOW, PURPLE] ) self.play(Create(chart), run_time=2) self.play(chart.animate.change_bar_values([6, 3, 7, 4, 9]))| 参数 | 作用 |
|---|---|
values | 每个柱子的初始数值列表 |
bar_names | 柱底部的名称标签 |
y_range | 纵轴范围与刻度步长([min, max, step]),控制柱体高度比例 |
bar_colors | 逐柱颜色列表,与values一一对应 |
chart.animate.change_bar_values([...])会在动画时间内平滑地把每根柱子拉伸/压缩到新数值——这是「数据前后对比」「增长演示」的核心原语。配合Create(chart)的逐柱勾勒入场,柱状图动画只需两行self.play即可完成。
Number Lines:数轴与指针联动
数轴NumberLine适合展示一维数值的定位与滑动,配合n2p(number-to-point,数值转屏幕坐标)和 updater 实现指针联动:
nl = NumberLine(x_range=[0, 10, 1], length=10, include_numbers=True) pointer = Arrow(nl.n2p(3) + UP * 0.5, nl.n2p(3), color=RED, buff=0) tracker = ValueTracker(3) pointer.add_updater(lambda m: m.put_start_and_end_on( nl.n2p(tracker.get_value()) + UP * 0.5, nl.n2p(tracker.get_value()))) self.play(tracker.animate.set_value(8), run_time=2)这里示范了add_updater的标准写法:箭头指针注册一个 lambda updater,每帧用nl.n2p(tracker.get_value())重新计算起点与终点,因此动画tracker时指针始终指向当前数值。buff=0让箭头尖端紧贴数轴。相较always_redraw的整对象重建,add_updater只更新位置属性,是「属性级联动」的首选(updaters-and-trackers.md)。
Animated Counters:动态计数器与节奏控制
计数器是数据故事的点睛之笔——用数字的跳动制造「增长感」:
counter = DecimalNumber(0, font_size=72, num_decimal_places=0) self.play(counter.animate.set_value(1000), run_time=3, rate_func=rush_from)DecimalNumber是专门显示数字的 mobject,num_decimal_places控制小数位(0 即整数,1 可显示一位小数);counter.animate.set_value(1000)在run_time=3秒内从 0 平滑增长到 1000;rate_func=rush_from是速率函数——先快后慢,让数字「冲刺」后稳稳落在终值,制造收束感。
速率函数是动画节奏的核心旋钮:smooth(默认缓入缓出)、linear(匀速)、rush_into(先慢后快)、rush_from(先快后慢)、there_and_back(去而复返)等可查 animations.md 的 Rate Functions 一节。在 video-use 的动画节奏规范中(SKILL.md 的 Animations 章节),同步解说类动画的计数器通常持续 5–7 秒,动画结束后必须self.wait()让观众消化。
Algorithm Visualization Pattern:算法可视化的标准骨架
参考文档给出了一套算法可视化的核心模式——用矩形柱体表示数组,LaggedStart逐根生长入场,随后自由组合高亮、交换等操作:
values = [5, 2, 8, 1, 9, 3] bars = VGroup(*[ Rectangle(width=0.6, height=v * 0.4, color=BLUE, fill_opacity=0.7) for v in values ]).arrange(RIGHT, buff=0.2, aligned_edge=DOWN).move_to(ORIGIN) self.play(LaggedStart(*[GrowFromEdge(b, DOWN) for b in bars], lag_ratio=0.1)) # Highlight, swap, etc.拆解这个骨架:
VGroup(*[...])把 6 个Rectangle聚合成组,每个矩形的高度由数值缩放而来(v * 0.4),fill_opacity=0.7让柱体有明确的填充;.arrange(RIGHT, buff=0.2, aligned_edge=DOWN)让柱体以底部对齐、向右排布,buff=0.2控制柱间距;LaggedStart(*[GrowFromEdge(b, DOWN) for b in bars], lag_ratio=0.1)让每根柱子从下往上生长,且相邻两根的入场有 10% 时间差,形成波浪式入场。
lag_ratio与AnimationGroup、Succession等组合动画的区别见 animations.md 的 Composition 一节:LaggedStart适合「同一组对象错峰呈现」,而ShowIncreasingSubsets则适合逐元素揭示数组内容(算法讲解中常与高亮、交换动画搭配)。在 video-use 的技能定位中,「算法可视化」模式(如 quicksort 逐步执行)正是这一模式的典型用例(SKILL.md Modes 表)。
Data Story Pattern:数据故事与前后对比
数据故事的核心叙事是「before / after 对比」。参考文档给出了一个完整的对比段落范式:两个柱状图分列左右,中间用箭头建立方向,再叠加一个百分比标签点明「增长」:
# Before/After comparison before = BarChart(values=[3, 5, 2], bar_colors=[RED]*3).shift(LEFT * 3) after = BarChart(values=[8, 9, 7], bar_colors=[GREEN]*3).shift(RIGHT * 3) self.play(Create(before)); self.wait(1) self.play(Create(after)); self.wait(1) arrow = Arrow(before.get_right(), after.get_left(), color=YELLOW) label = Text("+167%", font_size=36, color=YELLOW).next_to(arrow, UP) self.play(GrowArrow(arrow), Write(label))值得注意的细节:
- 颜色即语义:
[RED]*3与[GREEN]*3分别表示「改善前 / 改善后」,呼应 visual-design.md 的「Color = Meaning」原则; - 空间即关系:
shift(LEFT * 3)/shift(RIGHT * 3)让对比物分居左右,箭头用before.get_right()和after.get_left()精确连接两个图表; - 节奏留白:每个
Create之后都有self.wait(1),让观众先看清「前」再看「后」——对应 SKILL.md 的 Creative Standard「Breathing room」; - 强调动画:
GrowArrow让箭头从起点生长到终点,Write逐笔写出+167%标签,把数值变化变成叙事高潮。
这个模式可以直接套用到 video-use 的数据故事槽位:只要把+167%换成真实指标,配合 SKILL.md 中约定的缓动函数(单次揭示用ease_out_cubic,连续绘制用ease_in_out_cubic),即可产出风格统一的数据 overlay。
Graph / DiGraph:图论可视化的自动布局
对于图论类内容(状态机、网络、依赖关系),Manim 内置的Graph/DiGraph提供自动布局算法,无需手工计算节点坐标:
# Undirected graph g = Graph( vertices=[1, 2, 3, 4, 5], edges=[(1, 2), (2, 3), (3, 4), (4, 5), (5, 1), (1, 3)], layout="spring", # or "circular", "kamada_kawai", "planar", "tree" labels=True, vertex_config={"fill_color": PRIMARY}, edge_config={"stroke_color": SUBTLE}, ) self.play(Create(g)) # Directed graph dg = DiGraph( vertices=["A", "B", "C"], edges=[("A", "B"), ("B", "C"), ("C", "A")], layout="circular", labels=True, edge_config={("A", "B"): {"stroke_color": RED}}, ) # Add/remove vertices and edges dynamically self.play(g.animate.add_vertices(6, positions={6: RIGHT * 2})) self.play(g.animate.add_edges((1, 6))) self.play(g.animate.remove_vertices(3))要点说明:
vertices/edges分别声明顶点与边,边用顶点元组表示;DiGraph的边("A", "B")表示有向弧;layout选择自动布局算法,可选:"spring"(力导向)、"circular"(环形)、"kamada_kawai"、"planar"(平面)、"spectral"(谱布局)、"tree"(树形,有根树需额外指定root=);vertex_config/edge_config支持全局样式,也可用字典键到配置的映射对单个顶点/边单独着色(如edge_config={("A", "B"): {"stroke_color": RED}})。注意PRIMARY、SUBTLE是技能约定的自定义颜色常量(在脚本顶部定义,见 SKILL.md 的 Workflow 示例),不是 Manim 内建色;g.animate.add_vertices(...)/add_edges(...)/remove_vertices(...)支持在动画中动态增删顶点与边,配合positions={6: RIGHT * 2}可指定新顶点的落点——这是「逐步构建状态机」「网络动态演化」的关键能力。
从仓库的技能定位看(SKILL.md 的 Animations 工具选项),Manim 正是被指定用于「formal diagrams, state machines, equation derivations, graph morphs」——图论可视化是 Manim 槽位的核心使用场景。
ArrowVectorField / StreamLines:矢量场与流线
物理与数学类内容(电磁场、流体、梯度场、ODE 相图)需要矢量场可视化。Manim 提供两个互补工具:ArrowVectorField在每个采样点画方向箭头,StreamLines则生成沿场流动的粒子轨迹:
# Arrow field: arrows showing direction at each point field = ArrowVectorField( lambda pos: np.array([-pos[1], pos[0], 0]), # rotation field x_range=[-3, 3], y_range=[-3, 3], colors=[BLUE, GREEN, YELLOW, RED] ) self.play(Create(field)) # StreamLines: flowing particle traces through the field stream = StreamLines( lambda pos: np.array([-pos[1], pos[0], 0]), stroke_width=2, max_anchors_per_line=30 ) self.add(stream) stream.start_animation(warm_up=True, flow_speed=1.5) self.wait(3) stream.end_animation()- 场函数
lambda pos: np.array([-pos[1], pos[0], 0])返回每个位置处的向量——这里是一个旋转场(逆时针涡旋),可替换为任意pos -> vector的映射; ArrowVectorField的x_range/y_range控制采样网格范围,colors是随向量长度/方向插值的颜色梯度;StreamLines的stroke_width控制线条粗细,max_anchors_per_line限制每条流线的锚点数量(影响平滑度与性能);- 流线动画分三步:
start_animation(warm_up=True, flow_speed=1.5)启动粒子流动(warm_up预热填充、flow_speed控制流速)、self.wait(3)让流动持续、end_animation()收尾定格。
参考文档明确列出的适用场景:电磁场、流体流动、梯度场、ODE 相图(graphs-and-data.md)。这类动画信息密度高,按 SKILL.md 的动画时长经验值,复杂图形建议 8–14 秒且结尾定格至少 1 秒。
ComplexPlane / PolarPlane:复平面与极坐标
数学教学的进阶场景——复变函数与极坐标。ComplexPlane把复平面坐标与屏幕坐标打通,n2p接受复数直接定位:
# Complex plane with Re/Im labels cplane = ComplexPlane().add_coordinates() dot = Dot(cplane.n2p(2 + 1j), color=YELLOW) label = Text("2+i", font_size=20).next_to(dot, UR, buff=0.1) # Apply complex function to the plane self.play(cplane.animate.apply_complex_function(lambda z: z**2), run_time=3) # Polar plane polar = PolarPlane(radius_max=3).add_coordinates()add_coordinates()为平面添加坐标刻度标签(复平面的 Re/Im 轴,极平面的角度与半径刻度);cplane.n2p(2 + 1j)把复数2 + i映射为屏幕坐标,apply_complex_function(lambda z: z**2)则对整个复平面逐点施加复函数变换——这是演示「复函数如何扭曲平面」的招牌动画(如模平方映射的经典变形);PolarPlane(radius_max=3)构建半径最大为 3 的极坐标平面,适合周期函数、相量、极坐标积分等主题。
渲染与交付:把数据动画送进成片
编写完场景类后,渲染遵循 manim-video/SKILL.md 的 Pipeline:PLAN → CODE → RENDER → STITCH → AUDIO → REVIEW。渲染命令与质量档位如下(完整 CLI 参考见 rendering.md):
manim -ql script.py Scene1 Scene2 # draft(854x480,15fps,迭代布局与节奏) manim -qm script.py Scene1 # medium(1280x720,30fps,文本密集场景预览) manim -qh script.py Scene1 # production(1920x1080,60fps,最终交付) manim -ql --format=png -s script.py Scene1 # 预览末帧静态图| 质量档 | 分辨率 | FPS | 用途 |
|---|---|---|---|
-ql | 854×480 | 15 | 草稿迭代(布局、时序),5–15 秒/场景 |
-qm | 1280×720 | 30 | 预览,文本密集场景建议在此档检查 |
-qh | 1920×1080 | 60 | 生产输出,30–120 秒/场景 |
技能规范要求始终在-ql迭代,只在最终输出时渲染-qh;数据图表中文本较多,刻度与标签的清晰度建议在-qm档预览确认(480p 下小字号易糊)。渲染产物位于media/videos/<script>/<quality>/,之后在 video-use 中由render.py读取 EDL 的overlays字段,把每个 Manim 槽位的render.mp4按start_in_output/duration平移到时间轴并叠加到主视频之上,最后烧录字幕(字幕必须在所有 overlay 之后应用,见 SKILL.md Hard Rule 1)。
小结:从参考文档到可交付的数据动画
本文完整覆盖了 graphs-and-data.md 的全部内容,并将其嵌入 video-use 的动画生产语境:坐标轴(Axes)是一切图表的地基,plot/get_area/BarChart覆盖函数与柱状图,ValueTracker+always_redraw/add_updater实现动态参数与联动,Graph/ArrowVectorField/StreamLines/ComplexPlane将图论、矢量场与复变内容纳入表达范围,算法可视化与数据故事两种模式则给出了可直接套用的段落骨架。
继续深入可查阅仓库内配套文档:animations.md(动画原语与速率函数)、updaters-and-trackers.md(更新器与 ValueTracker 的完整模式)、visual-design.md(配色与视觉层次)、scene-planning.md(叙事弧线与场景清单)、rendering.md(渲染与交付细节),以及技能总纲 skills/manim-video/SKILL.md。
- AI 技能/插件
- 音视频
- 视频处理
- 人工智能
【免费下载链接】video-use
Edit videos with coding agents
相关推荐
用 Manim Community Edition 构建 3Blue1Brown 风格动画视频生产流水线:video-use 仓库 manim-video 技能完全指南
用 Manim Community Edition 构建 3Blue1Brown 风格动画视频生产流水线:video use 仓库 manim video 技能
AI 技能/插件音视频视频处理人工智能Manim 渲染故障排查实战指南:video-use manim-video 技能的 Troubleshooting 全解
Manim 渲染故障排查实战指南:video use manim video 技能的 Troubleshooting 全解 导读 本指南以 video use
AI 技能/插件音视频视频处理人工智能终极Manim数据可视化完全指南:如何制作惊艳的数学图表动画
终极Manim数据可视化完全指南:如何制作惊艳的数学图表动画 Manim是一款强大的数学动画引擎,专为创建解释性数学视频而设计。无论是教学演示、学术研究还是科普
图形学音视频
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考