表格¶
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),这是它与矩阵家族最大的不同。
name |
type |
default |
desc |
|---|---|---|---|
|
Iterable[Iterable[float | str | VMobject]] |
— |
二维数据(必需);每行长度必须一致 |
|
Iterable[VMobject] | None |
None |
行标签(Mobject,常用 |
|
Iterable[VMobject] | None |
None |
列标签(Mobject) |
|
VMobject | None |
None |
同时有行列标签时,左上角单元格 |
|
float |
0.8 / 1.3 |
行 / 列间距 |
|
bool |
False |
是否绘制外框线 |
|
bool |
True |
是否绘制内部网格线 |
|
bool |
False |
给每个单元格加背景矩形 |
|
Callable | type[VMobject] |
Paragraph |
单元格构造函数(子类改写的核心) |
|
dict |
{} |
传给单元格构造函数的参数 |
|
dict |
{} |
行列线样式( |
定位与高亮(行列标签存在时占第 0 行/列,坐标随之后移):
table.get_cell((行, 列))—— 返回该单元格的Polygon边框,1 起编号、含标签行列table.get_entries(pos=None)—— 传坐标返回单个单元格内容;不传返回全部VGrouptable.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)。
name |
type |
default |
desc |
|---|---|---|---|
|
Iterable[Iterable[float | str]] |
— |
二维数据(必需) |
|
… |
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 调整。
name |
type |
default |
desc |
|---|---|---|---|
|
Iterable[Iterable[float | str]] |
— |
二维数据(必需) |
|
dict |
{'num_decimal_places': 1} |
透传给 |
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 渲染,适合符号运算表、函数值对照表。
name |
type |
default |
desc |
|---|---|---|---|
|
Iterable[Iterable[float | str]] |
— |
二维数据(必需),单元格是 LaTeX 片段 |
|
… |
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)。
name |
type |
default |
desc |
|---|---|---|---|
|
Iterable[Iterable[VMobject]] |
— |
由 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 |
|---|---|---|
普通文字 / 数字文本 |
|
不需要 |
整数运算结果 |
|
需要(数字走 MathTex) |
测量数据、小数 |
|
需要(数字走 MathTex) |
公式、符号 |
|
需要 |
图形、图标 |
|
不需要 |
自测¶
✏️ 练习
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` 排版。