数学动画工具的技术选型:Matplotlib、Manim 还是 Plotly?

2026 年 9 月 10 日 · 极坐标⋅XYZ

数学动画工具的技术选型:Matplotlib、Manim 还是 Plotly?

这三个库经常被放在一起比较,但它们其实解决的是三个不同的问题:Matplotlib 出图、Plotly 出网页、Manim 出讲解。选错的代价不是"效果差一点",而是你会花大量时间去让一个工具做它本来就不擅长的事。

快速答案:输出形态选,不要按"哪个更强"选。要静态图(论文、报告、PPT 配图)选 Matplotlib;要能缩放悬停的网页交互图(仪表盘、数据探索)选 Plotly;要一步步把一个道理讲清楚的动画视频(课程、科普、几何证明)选 Manim。三者不互斥,同一个项目里常常都用得上。想直接试 Manim 而不装环境,可以在极坐标⋅XYZ 工作区里打开网页就写就跑。

数学动画工具定位图:Matplotlib 偏静态出图,Plotly 偏网页交互,Manim 偏讲解动画

先问四个问题,选型基本就定了

问题 如果答案是…… 就选
成品交到哪里? PDF / Word / 印刷品 Matplotlib
网页 / 仪表盘 Plotly
视频 / 课件 / 短视频平台 Manim
观众要不要动手? 要自己缩放、悬停、筛选 Plotly
只是看 Matplotlib 或 Manim
要表达的是数据还是过程? 一批数据的分布与关系 Matplotlib / Plotly
一个推导、一次变换、一步步的构造 Manim
多久要交? 今天下午 Matplotlib / Plotly
这是要反复用的教学素材 Manim

最后一行值得多说一句:Manim 的前期投入明显更高,但它的产出是参数化的。同一个场景,把 a=2 改成 a=3 就是一支新动画;换成视频软件或截图拼接,改一次等于重做。做一次性图表它不划算,做系列课程它是唯一划算的。

Matplotlib:静态出图的事实标准

定位: Python 科学计算生态的默认出图库,输出静态图像。

擅长: 论文级图表(折线、散点、直方图、热力图、子图矩阵)、精确控制刻度与标注、矢量输出(PDF/SVG)、和 NumPy / pandas 无缝衔接。学术出版几乎默认它。

关于动画: Matplotlib 有 FuncAnimation,能做动画,也能存成 GIF 或 MP4。但它的动画模型是"每一帧重画一次"——你要自己管理帧索引、自己算每帧的状态。做一个"点沿曲线走"没问题;做"公式 A 变形成公式 B、旁边的图形同步高亮",代码会迅速变得难以维护。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-3, 3, 400)
fig, ax = plt.subplots(figsize=(6, 4))
ax.plot(x, x**2, label="$y=x^2$")
ax.axhline(0, lw=0.8)
ax.legend()
fig.savefig("parabola.pdf")   # 矢量输出,直接进论文

什么时候别用它: 当你发现自己在为动画写一堆帧状态管理代码时,说明选错工具了。

Plotly:交互交给观众自己

定位: 面向网页的交互式图表库,输出可嵌入的 HTML(也有静态导出)。

擅长: 悬停显示数值、框选缩放、图例开关、下拉筛选、三维旋转;配合 Dash 可以搭出完整的数据应用。数据探索和业务仪表盘是它的主场。

关于动画: Plotly 的 frames 机制能做"按时间轴播放"的动画(配合播放按钮和滑块),做人口变迁、时间序列演化这类数据随时间变化的展示很合适。但它的动画本质是在离散帧之间切换数据,不是一套用来讲解的动画语言——没有变换过渡、没有摄像机运动、公式排版也不是它的强项。

import numpy as np
import plotly.graph_objects as go

x = np.linspace(-3, 3, 400)
fig = go.Figure(go.Scatter(x=x, y=x**2, mode="lines", name="y = x²"))
fig.write_html("parabola.html")   # 打开就能缩放、悬停看数值

什么时候别用它: 成品要变成一段视频、要配旁白的时候。把交互图表录屏当教学视频,观感通常不如专门的动画。

Manim:把"讲解"当成一等公民

定位: 数学动画引擎,输出视频。3Blue1Brown 用来做讲解视频的那套工具,社区维护版叫 Manim Community

擅长: 让画面被数学关系驱动。这是它和前两者最根本的区别——你写的不是"第 37 帧画一个点在 (2.1, 4.4)",而是"这个点始终在曲线上,横坐标由一个可动的变量决定":

from manim import *


class TangentSlope(Scene):
    def construct(self):
        axes = Axes(
            x_range=[-3, 3, 1],
            y_range=[-1, 5, 1],
            x_length=9,
            y_length=4.5,
            axis_config={"include_tip": False},
        )
        curve = axes.plot(lambda x: x**2, x_range=[-2.2, 2.2], color=BLUE)

        x = ValueTracker(-2)
        dot = always_redraw(
            lambda: Dot(axes.c2p(x.get_value(), x.get_value() ** 2), color=YELLOW)
        )
        tangent = always_redraw(
            lambda: axes.plot(
                lambda t: 2 * x.get_value() * (t - x.get_value()) + x.get_value() ** 2,
                x_range=[x.get_value() - 1.2, x.get_value() + 1.2],
                color=RED,
            )
        )
        slope = always_redraw(
            lambda: VGroup(
                Text("斜率 = ", font_size=30),
                DecimalNumber(2 * x.get_value(), num_decimal_places=2, font_size=30),
            ).arrange(RIGHT, buff=0.15).to_corner(UR)
        )

        self.play(Create(axes), Create(curve))
        self.add(dot, tangent, slope)
        self.play(x.animate.set_value(2), run_time=4, rate_func=linear)
        self.wait()

注意这段代码里没有一处帧号ValueTracker 保存状态,always_redraw 负责把状态映射到画面,切点、切线、数值三者自动保持同步。想让动画慢一倍就改 run_time,想换成三次函数就改 lambda——数学关系只写一遍

用 Matplotlib 实现同样的效果需要手写帧循环并在每帧重算三样东西;用 Plotly 则要预先生成所有帧的数据。

它的代价: 学习曲线更陡(要理解 Mobject / Animation / Scene 这套抽象),渲染比出一张静态图慢,公式排版依赖 LaTeX(或 0.21 起新增的 Typst 选项)。本地安装还要面对 Python 版本、依赖、字体这一串问题。

上面这段代码可以直接点"在工作区中打开"运行——不用装任何东西。我们实测这段场景在浏览器里渲染 90 帧约 2.6 秒(480p15 预览档)。

三者对照表

维度 Matplotlib Plotly Manim
主要输出 PNG / PDF / SVG 静态图 交互式 HTML MP4 / GIF 视频
核心场景 论文、报告、印刷 仪表盘、数据探索 课程、科普、讲解视频
动画能力 有(FuncAnimation,需手管帧) 有(frames,数据随时间切换) 原生,是设计核心
观众交互 无(观众看视频)
公式排版 内置 mathtext,够用 较弱 强(LaTeX / Typst,可对子式着色、变形)
学习成本 低到中 中到高
出一张图/一段动画的耗时 秒级 秒级 分钟级(长片更久)
改一个参数的成本 极低(这是它的核心优势)
中文支持 需配字体 需配字体 需配字体(浏览器版已内置)

常见的三种组合用法

选型不是三选一。实际项目里更常见的是组合:

  • 先探索、后讲解: 用 Matplotlib 或 Plotly 快速看清数据长什么样,确定要讲的结论,再用 Manim 把这个结论做成动画。
  • 图表进动画: Manim 可以直接引入外部图片,把 Matplotlib 出的复杂统计图当素材放进讲解视频里(课程第 21 课「外部资源」讲的就是这件事)。
  • 网页配视频: 文章里放 Plotly 交互图让读者自己玩,关键推导用 Manim 动画讲清楚。

那 Manim 那道环境门槛怎么办

这是很多人放弃 Manim 的真实原因:它的表达力最强,但本地安装的挫败率也最高——Python 版本、依赖隔离、LaTeX、Cairo/Pango、中文字体、国内网络,每一环都能卡住一整晚。而这些和你想讲的数学一点关系都没有

极坐标⋅XYZ 工作区把这层直接删掉:打开网页,Python 运行时、Manim 本体、中文字体、公式排版都已经在浏览器里就位,渲染也在你自己的电脑上完成,不排队、不上传。

工作区里跑完一次渲染:左侧编辑器写代码,底部预览面板出画面并显示帧数与耗时

几点值得说清楚:

  • 跑的是真 Manim 本体(当前对齐 Manim Community 0.20.1),不是另写一个近似引擎。所以你在这里学的 API 就是官方那套,将来迁到本地不用重学。
  • 写代码、渲染、导出都不用登录,导出 MP4 / GIF。
  • 画面落到 Canvas2D,不依赖 WebGPU,国内主流浏览器和老一点的 Windows 机器都能开。
  • 边界要讲清楚:首次要下载一次引擎(之后缓存秒开);4K 长片这类重渲染任务,本地机器仍然更快。它替代的是"评估和入门"这一段,不是替代专业渲染农场。

想按顺序系统学,可以看教程(23 课 6 阶段,约 145 分钟正片,第 1、4 课免费)或按周制定的中文学习路线;想先看看别人用它做出了什么,去精选作品,每一件都能一键打开改写。

一句话选型建议

  • 图要印出来Matplotlib
  • 图要在网页上被人点Plotly
  • 内容要被人看懂一个过程Manim

如果你还在犹豫,最快的判断方法是:把上面那段切线代码点开跑一次,看看"改一个数、整幅画面跟着变"是不是你要的感觉。是,就值得投入学 Manim;不是,Matplotlib 够用得多。

常见追问(FAQ)

Q:Manim 和 Matplotlib 到底有什么区别? A:Matplotlib 是出图工具,输出静态图像,动画要靠 FuncAnimation 自己管理每一帧;Manim 是动画引擎,输出视频,画面由数学关系驱动——用 ValueTracker 和 updater 描述关系后,相关元素会自动同步变化。做论文插图用 Matplotlib,做讲解视频用 Manim。

Q:Plotly 能做数学动画吗? A:能做"数据随时间变化"的动画(frames 加播放控件),适合时间序列演化。但它没有变换过渡、镜头运动这类叙事能力,公式排版也弱,不适合做逐步推导的讲解视频。

Q:Manim 需要很强的 Python 基础吗? A:不需要。入门只用到变量、函数、类的基本写法和几个 API。真正的门槛是理解 Mobject(对象)、Animation(动画)、Scene(场景)这三个概念,以及"描述关系而不是硬编码坐标"的思维方式。

Q:能不装 Python 就试 Manim 吗? A:可以。极坐标⋅XYZ 工作区在浏览器里跑真 Manim,打开网页就能写代码、渲染、导出 MP4 或 GIF,不需要安装 Python、LaTeX 或 ffmpeg,也不需要登录。

Q:Manim 渲染很慢,值得吗? A:看用途。出一张静态图 Matplotlib 是秒级,Manim 是分钟级——做一次性图表确实不划算。但 Manim 的产出是参数化的:改一个数就是一支新动画,做系列课程时,这个优势会迅速盖过渲染耗时。

Q:三个都要学吗? A:不必都学,但它们常常配合使用:用 Matplotlib / Plotly 快速探索数据、确定要讲的结论,再用 Manim 把结论做成讲解动画。Manim 也能把外部图片当素材引入场景。

来源:极坐标⋅XYZ · jizuobiao.xyz · 更新于 2026-09-10