表格

manim.mobject.table 模块用 Mobject 网格排版二维数据:Table 是基类,子类只决定单元格内容的构造函数(整数 / 小数 / 公式 / 任意 Mobject)。表格自带行列线、行列标签与单元格定位,是数据展示与“逐项讲解”的利器。

Table

Table(table, row_labels=None, col_labels=None, top_left_entry=None, v_buff=0.8, h_buff=1.3, include_outer_lines=False, include_inner_lines=True, add_background_rectangles_to_entries=False, entries_background_color=ManimColor('#000000'), include_background_rectangle=False, background_rectangle_color=ManimColor('#000000'), element_to_mobject=<class 'manim.mobject…, element_to_mobject_config={}, arrange_in_grid_config={}, line_config={}, **kwargs) 官方文档 ↗

Table 把嵌套列表排成带线的网格。字符串单元格默认由 Paragraph 渲染(Pango,不依赖 LaTeX),这是它与矩阵家族最大的不同。

digraph G { graph [rankdir=LR, bgcolor="transparent", nodesep="0.25", ranksep="0.35"]; node [shape=box, style="rounded,filled", fontname="Helvetica,sans-serif", fontsize=11, height=0.3, color="#8b93a1", fillcolor="#f2f4f7", fontcolor="#1f2733"]; edge [color="#a6adba", arrowsize=0.6, penwidth=1.1]; "Table" -> "VGroup"; "VGroup" -> "VMobject"; }

name

type

default

desc

table

Iterable[Iterable[float | str | VMobject]]

—

二维数据(必需);每行长度必须一致

row_labels

Iterable[VMobject] | None

None

行标签(Mobject,常用 Text)

col_labels

Iterable[VMobject] | None

None

列标签(Mobject)

top_left_entry

VMobject | None

None

同时有行列标签时,左上角单元格

v_buff / h_buff

float

0.8 / 1.3

行 / 列间距

include_outer_lines

bool

False

是否绘制外框线

include_inner_lines

bool

True

是否绘制内部网格线

add_background_rectangles_to_entries

bool

False

给每个单元格加背景矩形

element_to_mobject

Callable | type[VMobject]

Paragraph

单元格构造函数(子类改写的核心)

element_to_mobject_config

dict

{}

传给单元格构造函数的参数

line_config

dict

{}

行列线样式(stroke_color / stroke_width 等)

定位与高亮(行列标签存在时占第 0 行/列,坐标随之后移):

  • table.get_cell((行, 列)) —— 返回该单元格的 Polygon 边框,1 起编号、含标签行列

  • table.get_entries(pos=None) —— 传坐标返回单个单元格内容;不传返回全部 VGroup

  • table.get_highlighted_cell(pos, color=YELLOW, **kwargs) —— 返回背景 BackgroundRectangle,不会自动上屏,需 self.add(...)

  • table.add_highlighted_cell(pos, color=YELLOW, **kwargs) —— 一步到位:生成并直接加入背景层

  • table.get_rows() / get_columns() / get_horizontal_lines() / get_vertical_lines() —— 取回行 / 列 / 线

纯字符串表格默认 Paragraph 渲染,无需 LaTeX;get_highlighted_cell(...) 生成背景矩形,手动 add 到对应单元格后面。

查看源码 table_highlight.py
"""TableHighlightDemo: 普通 Table(字符串单元格)与单元格高亮。"""

from manim import *


class TableHighlightDemo(Scene):
    def construct(self):
        # 字符串单元格默认由 Paragraph 渲染,不依赖 LaTeX
        table = Table(
            [["apple", "red"], ["banana", "yellow"], ["grape", "purple"]],
            row_labels=[Text("a", font_size=30), Text("b", font_size=30), Text("c", font_size=30)],
            include_outer_lines=True,
        )
        self.play(Create(table), run_time=1.5)

        # get_highlighted_cell 返回一个背景矩形,add 到对应单元格后面
        highlight = table.get_highlighted_cell((1, 2), color=RED, fill_opacity=0.4)
        self.add(highlight)
        self.wait(0.5)

常见错误

get_highlighted_cell() 返回的矩形不会自动显示,忘记 self.add(highlight) 就看不到任何效果;嫌两步麻烦就改用 add_highlighted_cell()。

常见错误

行 / 列标签会计入 get_cell / get_entries 的坐标:带 col_labels 的表格里 get_entries((2, 2)) 指的是数据区第 1 行第 1 列(标签行是第 0 行)。算坐标时先想清楚标签占不占位。

IntegerTable

IntegerTable(table, element_to_mobject=<class 'manim.mobject…, **kwargs) 官方文档 ↗

IntegerTable 把每个单元格渲染为 Integer(整数逐位排版,需要 LaTeX)。

digraph G { graph [rankdir=LR, bgcolor="transparent", nodesep="0.25", ranksep="0.35"]; node [shape=box, style="rounded,filled", fontname="Helvetica,sans-serif", fontsize=11, height=0.3, color="#8b93a1", fillcolor="#f2f4f7", fontcolor="#1f2733"]; edge [color="#a6adba", arrowsize=0.6, penwidth=1.1]; "IntegerTable" -> "Table"; "Table" -> "VGroup"; }

name

type

default

desc

table

Iterable[Iterable[float | str]]

—

二维数据(必需)

element_to_mobject

…

Integer

单元格构造函数,一般保持默认

行列标签就是普通 Text;get_cell((2, 3)) 在含标签的表格里按“标签占位后”的坐标取值。数字默认由 MathTex 逐位排版,依赖 LaTeX,本示例由 CI 渲染。

查看源码 integer_table.py
"""IntegerTableDemo: IntegerTable 的行/列标签与单元格定位。"""

from manim import *


class IntegerTableDemo(Scene):
    def construct(self):
        table = IntegerTable(
            [[1, 2, 3], [4, 5, 6]],
            row_labels=[Text("R1", font_size=30), Text("R2", font_size=30)],
            col_labels=[Text("C1", font_size=30), Text("C2", font_size=30), Text("C3", font_size=30)],
            include_outer_lines=True,
            include_inner_lines=False,
        )
        self.play(Create(table), run_time=1.5)

        # get_cell 按 (行, 列) 定位;标签也占行列编号
        cell = table.get_cell((2, 3))
        self.play(cell.animate.set_fill(YELLOW, opacity=0.5), run_time=1.0)
        self.wait(0.5)

DecimalTable

DecimalTable(table, element_to_mobject=<class 'manim.mobject…, element_to_mobject_config={'num_decimal_places'…, **kwargs) 官方文档 ↗

DecimalTable 把每个单元格渲染为 DecimalNumber,默认保留 1 位小数,可用 element_to_mobject_config 调整。

digraph G { graph [rankdir=LR, bgcolor="transparent", nodesep="0.25", ranksep="0.35"]; node [shape=box, style="rounded,filled", fontname="Helvetica,sans-serif", fontsize=11, height=0.3, color="#8b93a1", fillcolor="#f2f4f7", fontcolor="#1f2733"]; edge [color="#a6adba", arrowsize=0.6, penwidth=1.1]; "DecimalTable" -> "Table"; "Table" -> "VGroup"; }

name

type

default

desc

table

Iterable[Iterable[float | str]]

—

二维数据(必需)

element_to_mobject_config

dict

{'num_decimal_places': 1}

透传给 DecimalNumber,常用 num_decimal_places

element_to_mobject_config={"num_decimal_places": 2} 统一小数位;include_inner_lines=False 可得到简洁的三线表风格。数字同样依赖 LaTeX,本示例由 CI 渲染。

查看源码 decimal_table.py
"""DecimalTableDemo: DecimalTable 小数表格,可省略内线。"""

from manim import *


class DecimalTableDemo(Scene):
    def construct(self):
        table = DecimalTable(
            [[3.14159, 2.71828], [1.41421, 1.73205]],
            element_to_mobject_config={"num_decimal_places": 2},
            include_inner_lines=False,
            include_outer_lines=True,
        )
        self.play(Create(table), run_time=1.5)
        self.wait(0.5)

提示

IntegerTable / DecimalTable 的数字字符默认走 MathTex(mob_class 是 Integer / DecimalNumber 的构造参数,无法通过 config 覆盖)。要完全摆脱 LaTeX,直接用 Table(..., element_to_mobject=lambda x: Text(str(x))) 即可——字符串单元格本来就不需要 LaTeX。

MathTable

MathTable(table, element_to_mobject=<class 'manim.mobject…, **kwargs) 官方文档 ↗

MathTable 把每个单元格当作公式用 MathTex 渲染,适合符号运算表、函数值对照表。

digraph G { graph [rankdir=LR, bgcolor="transparent", nodesep="0.25", ranksep="0.35"]; node [shape=box, style="rounded,filled", fontname="Helvetica,sans-serif", fontsize=11, height=0.3, color="#8b93a1", fillcolor="#f2f4f7", fontcolor="#1f2733"]; edge [color="#a6adba", arrowsize=0.6, penwidth=1.1]; "MathTable" -> "Table"; "Table" -> "VGroup"; }

name

type

default

desc

table

Iterable[Iterable[float | str]]

—

二维数据(必需),单元格是 LaTeX 片段

element_to_mobject

…

MathTex

单元格构造函数,一般保持默认

单元格写 x^2 这类 LaTeX 片段即可自动排版;get_entries((2, 2)) 取回单个单元格做强调。本示例依赖 LaTeX,由 CI 渲染。

查看源码 math_table.py
"""MathTableDemo: MathTable 公式表格与单元格定位。"""

from manim import *


class MathTableDemo(Scene):
    def construct(self):
        table = MathTable(
            [["x", "x^2"], ["2", "4"], ["3", "9"], ["4", "16"]],
            include_outer_lines=True,
        )
        self.play(Create(table), run_time=1.5)
        self.play(table.get_entries((2, 2)).animate.set_color(RED), run_time=0.8)
        self.wait(0.5)

MobjectTable

MobjectTable(table, element_to_mobject=<function MobjectTabl…, **kwargs) 官方文档 ↗

MobjectTable 把任意 Mobject 直接当作单元格,与 MobjectMatrix 同理,只是容器换成了表格(带网格线与定位 API)。

digraph G { graph [rankdir=LR, bgcolor="transparent", nodesep="0.25", ranksep="0.35"]; node [shape=box, style="rounded,filled", fontname="Helvetica,sans-serif", fontsize=11, height=0.3, color="#8b93a1", fillcolor="#f2f4f7", fontcolor="#1f2733"]; edge [color="#a6adba", arrowsize=0.6, penwidth=1.1]; "MobjectTable" -> "Table"; "Table" -> "VGroup"; }

name

type

default

desc

table

Iterable[Iterable[VMobject]]

—

由 Mobject 组成的二维数据(必需)

element_to_mobject

Callable

恒等 lambda

元素预处理函数,可自行替换

图形单元格配合 h_buff 放大避免拥挤;get_entries((1, 1)) 可直接取回某个图形做动画。单元格是矢量图形,不依赖 LaTeX。

查看源码 mobject_table.py
"""MobjectTableDemo: MobjectTable 用任意 mobject 作单元格。"""

from manim import *


class MobjectTableDemo(Scene):
    def construct(self):
        table = MobjectTable(
            [
                [Circle(fill_opacity=0.5), Square(fill_opacity=0.5), Triangle(fill_opacity=0.5)],
                [Dot(), Cross(), Star()],
            ],
            h_buff=1.8,
            include_outer_lines=True,
        )
        self.play(FadeIn(table), run_time=1.5)

        self.play(table.get_entries((1, 1)).animate.set_color(RED), run_time=1.0)
        self.wait(0.5)

子类怎么选

单元格内容

用谁

LaTeX

普通文字 / 数字文本

Table(默认 Paragraph)

不需要

整数运算结果

IntegerTable

需要(数字走 MathTex)

测量数据、小数

DecimalTable

需要(数字走 MathTex)

公式、符号

MathTable

需要

图形、图标

MobjectTable

不需要

自测

✏️ 练习

table.get_highlighted_cell((1, 2), color=RED) 之后画面没有任何变化,为什么?

✅ 参考答案

get_highlighted_cell() 只生成背景矩形并返回,不会自动加入场景。需要 self.add(highlight)(或包进 FadeIn 动画)才能看到;改用 add_highlighted_cell() 则生成并添加一步到位。

✏️ 练习

带 col_labels 的表格上,get_entries((1, 1)) 与 get_entries((2, 1)) 分别取到什么?

✅ 参考答案

列标签占第 0 行:(1, 1) 是列标签行的第一个单元格(即第一个列标签),(2, 1) 才是数据区第一行第一列。行标签占第 0 列时同理——用坐标前先确认标签是否占位。

✏️ 练习

要在没装 LaTeX 的机器上展示一张全数字表格,有哪些可行方案?

✅ 参考答案

两种:一是直接用基类 Table(..., element_to_mobject=lambda x: Text(str(x))),字符串单元格由 Pango 渲染;二是预先把数字格式化成字符串(如 f"{v:.2f}")再交给默认的 Paragraph。IntegerTable/DecimalTable在这类环境会失败,因为它们的数字字符默认由MathTex` 排版。