
利益相关本文作者与极坐标⋅XYZjizuobiao.xyz团队有关联。下面的数字是我们在 Manim Community 0.21.02026 年的最新版本上跑出来的代码都贴在文里结论请自行验证。成员一样大的时候两种写法排出来的网格一模一样。差别出在成员大小不一的时候先把每行各自arrange、再把几行上下叠起来行与行之间互不知道对方上下对不成列arrange_in_grid是按整张表算的同一列的成员中心在一条竖线上。所以要「表格」那种横竖都对齐的效果用arrange_in_grid每行个数不一样、或者每行要各自居中用两层arrange。Manim 是用 Python 代码写数学动画的开源引擎3Blue1Brown 的视频就是它做的。它没有「表格布局」「弹性布局」这类东西排版靠的是VGroup上的几个方法每个方法调用一次就摆一次位置。排网格能用的就是上面这两条路。一段代码把两种写法并排放六个方块边长依次是 0.5、2、0.5、1、0.5、1.5间距都用 0.2。左边蓝色是两层arrange右边黄色是arrange_in_gridfrom manim import * class GridVsNested(Scene): def construct(self): sides [0.5, 2, 0.5, 1, 0.5, 1.5] def make(color): return [Square(side_lengths, colorcolor).set_fill(color, 0.5) for s in sides] # 左边两行各自 arrange再把两行上下叠起来 m make(BLUE) row1 VGroup(*m[:3]).arrange(RIGHT, buff0.2) row2 VGroup(*m[3:]).arrange(RIGHT, buff0.2) nested VGroup(row1, row2).arrange(DOWN, buff0.2).move_to([-3.5, 0, 0]) # 右边同样六个方块交给 arrange_in_grid grid VGroup(*make(YELLOW)).arrange_in_grid(rows2, cols3, buff0.2).move_to([3.5, 0, 0]) self.add(nested, grid) self.wait()不想在本机装环境的话把这段贴进极坐标⋅XYZ 的工作区点运行就能看里面装的也是 Manim 0.21.0。排出来差在哪我们把每个方块的中心坐标打印了出来x 以各自那一组的中心为零点两层 arrange左arrange_in_grid右第一行三个方块的 x-1.45、0、1.45-1.95、-0.25、1.7第二行三个方块的 x-1.2、-0.25、0.95-1.95、-0.25、1.7两行的 y0.85、-1.10.85、-1.1同一行里相邻两个的间隙都是 0.2第一行 0.45、0.7第二行 0.95、0.95整体宽 × 高3.4 × 3.74.9 × 3.7行的高度两边一样都是按这一行里最高的那个方块来的。差别全在横向。左边每一行内部间隙严格是 0.2排得紧但六个中心落在六个不同的 x 上。右边两行的 x 完全相同三列对得很齐代价是间隙不再是 0.2buff0.2在这里是格子与格子之间的距离小方块待在一个比它宽的格子正中两边自然空出来一截。整体也因此宽了 1.5。原因在两个方法的做法上。arrange是让第二个成员next_to到第一个旁边、第三个next_to到第二个旁边一路接下去它眼里只有相邻的两个。arrange_in_grid先把成员按行列分好取每一列里最宽的当列宽、每一行里最高的当行高画出一张格子再把成员一个个放进去。排完之后整组的位置也不一样这一点和对不对齐没关系但两条路混着用的时候很容易被它绊一下。arrange排完会把整组挪到画面正中arrange_in_grid排完整组留在原来的中心。我们把两种写法都先move_to([3, 2, 0])再排两层arrange排完中心在 (0, 0)前面的move_to白写了arrange_in_grid排完中心还是 (3, 2)。所以上面那段代码里两边的move_to都放在了排列的后面。用arrange的时候这个顺序是必须的用arrange_in_grid时放前放后都行统一放后面最省心。arrange_in_grid 的格子还能怎么调格子里靠哪边默认是放在格子正中。cell_alignmentDOWN让每个成员贴着格子底边我们试了上面那六个方块同一行的底边 y 变得一样了第一行 -0.15第二行 -1.85像东西摆在架子上。col_alignmentslcr可以一列一列地指定左、中、右做左列是名称、右列是数字的小表格时用得上。格子固定大小不想让列宽随内容变可以直接给col_widths[2] * 3, row_heights[2] * 2。这样排完三列的中心相距都是 2.2列宽 2 加间隙 0.2和里面装的方块多大没关系。列表长度要和列数对上我们试过给三列只传两个宽度报的是ValueError: col_widths has a mismatching size.横竖间隙分开设buff(0.2, 1.0)第一个数是横向间隙第二个是纵向间隙。这是量出来的结果0.21.0 的文档字符串里写的是(row, col)容易理解反。行列数只写一个七个成员写cols3会排成 3、3、1写rows2是 4、3。两个都写但装不下比如七个成员rows2, cols3会报ValueError。什么时候反而该用两层 arrangearrange_in_grid有一件事做不到每行各自居中。七个边长 1 的方块arrange_in_grid(cols3, buff0.2)前两行的 x 是 -1.2、0、1.2第三行只有一个它在 x -1.2靠最左。网格是按格子填的不满的那一行从第一格开始放。换成两层arrange每行是一个独立的小组最外层arrange(DOWN)时默认中心对中心第三行那一个就在 x 0居中了。同样的道理每行个数本来就不一样的排法只能用两层arrange。比如 1、2、3 的三角堆sq [Square(side_length1) for _ in range(6)] rows VGroup(VGroup(sq[0]), VGroup(*sq[1:3]), VGroup(*sq[3:])) for r in rows: r.arrange(RIGHT, buff0.2) rows.arrange(DOWN, buff0.2)排出来第一行在 x 0第二行在 ±0.6第三行在 -1.2、0、1.2每行都以中线对称。小结两层 arrangearrange_in_grid成员一样大结果相同结果相同成员大小不一行内间隙相等上下不成列行列都对齐间隙随格子变每行个数不同、每行各自居中能不能不满的行靠左排完整组的位置回到原点留在原来的中心格内对齐、固定格子大小没有cell_alignment、col_alignments、col_widths代码量每行一个小组外面再套一层一行arrange的buff、aligned_edge、centerFalse这些基础用法以及往VGroup里放图片报错怎么办在极坐标⋅XYZ 的这篇文章里写得更细配套视频在教程《布局下· 尺寸 / 包围 / 编组 / 深度 实战》的第三节。实测环境Manim Community 0.21.0 · 2026 年 10 月