news 2026/9/24 3:20:30

数据驱动动画实战:Manim 图表、图论与矢量场可视化完全指南(video-use · manim-video)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据驱动动画实战:Manim 图表、图论与矢量场可视化完全指南(video-use · manim-video)
  • AI 技能/插件
  • 音视频
  • 视频处理
  • 人工智能

【免费下载链接】video-use

Edit videos with coding agents

项目地址:https://gitcode.com/GitHub_Trending/vid/video-use
点击查看免费下载

本指南以 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,它会依次检查python3manimpdflatexffmpeg四个命令是否就绪并汇总缺失项:

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负责把数学坐标映射到屏幕坐标,后续的plotget_areac2p都以它为基准:

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。这里的执行链条是:

  1. 创建tracker(隐形滑块);
  2. 创建读取 tracker 的可视对象(always_redraw(lambda: axes.plot(...)));
  3. 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_ratioAnimationGroupSuccession等组合动画的区别见 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}})。注意PRIMARYSUBTLE是技能约定的自定义颜色常量(在脚本顶部定义,见 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的映射;
  • ArrowVectorFieldx_range/y_range控制采样网格范围,colors是随向量长度/方向插值的颜色梯度;
  • StreamLinesstroke_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用途
-ql854×48015草稿迭代(布局、时序),5–15 秒/场景
-qm1280×72030预览,文本密集场景建议在此档检查
-qh1920×108060生产输出,30–120 秒/场景

技能规范要求始终在-ql迭代,只在最终输出时渲染-qh;数据图表中文本较多,刻度与标签的清晰度建议在-qm档预览确认(480p 下小字号易糊)。渲染产物位于media/videos/<script>/<quality>/,之后在 video-use 中由render.py读取 EDL 的overlays字段,把每个 Manim 槽位的render.mp4start_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

项目地址:https://gitcode.com/GitHub_Trending/vid/video-use
点击查看免费下载

相关推荐

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

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

GitHub热榜项目筛选指南:五个共同点识别靠谱开源项目

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

作者头像 李华
网站建设 2026/9/24 3:13:30

Claude对话数据怎么导入到另外一个Claude账号里去?AI导出鸭实测与底层逻辑拆解 先说结论:Claude官方不支持跨账号导入

如果你正在搜索“Claude对话数据怎么导入到另外一个Claude账号里去”&#xff0c;大概率是因为换号了、开了新订阅&#xff0c;或者想把旧账号里积累的对话资产迁移到常用的那个账号里。 这里需要先讲一个可能让你失望的事实&#xff1a;Claude官方明确表示&#xff0c;导出的数…

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

GLM 5.3 Batch 模式高效应用指南

在处理海量数据时&#xff0c;很多开发者最先遇到的瓶颈往往不是算法不够先进&#xff0c;而是工程架构无法支撑高并发下的吞吐量。想象一下&#xff0c;当你需要清洗百万级的用户评论、将成千上万份技术文档翻译成多国语言&#xff0c;或者为智能客服构建覆盖全业务线的知识库…

作者头像 李华