Manim 怎么做 9:16 竖屏视频?分辨率和画布尺寸要一起改
2026 年 10 月 19 日 · 极坐标⋅XYZ
Manim 怎么做 9:16 竖屏视频?分辨率和画布尺寸要一起改
在文件顶层写四行:pixel_width = 1080、pixel_height = 1920,再把画布改成竖的,frame_width = 9、frame_height = 16。只把分辨率改成 1080 × 1920 是不够的,Manim 会守着默认的画布宽度 14.22,把高度算成 25.28,横屏时摆好的东西全挤在画面中间一小段。画布改竖之后,横向只剩 9 个单位,默认 12 个单位长的 Axes() 和一行长标题都会出画,要自己缩。
Manim 最早是 3Blue1Brown 的 Grant Sanderson 给自己做视频写的 Python 库,画面上有什么、摆在哪、怎么动,全写在代码里。现在用的人多数装的是社区版 Manim Community,2026 年 10 月 8 日刚出了 0.22.0,极坐标⋅XYZ 的工作区目前还是 0.21.0,所以下面每个数字我们都在这两个版本上各跑了一次,没有差别。第一次听说 Manim 的话,这篇介绍讲了它能做什么;想从头系统学,极坐标⋅XYZ 有一套按新版本录的 2026 年 Manim 中文教程,竖屏的配置在「画布与坐标系」那一课里。
文中标了「在工作区中打开」的代码,点一下就能在极坐标⋅XYZ 的工作区里跑,浏览器打开就行,不用装 Python、LaTeX 和 ffmpeg。
四行配置,写在文件顶层
下面这段做的是一个最普通的竖屏数学短视频:标题在上,函数图像在中间,一句结论在下面。
from manim import *
# 9:16 竖屏:像素和画布一起改,四行都写在文件顶层
config.pixel_width = 1080
config.pixel_height = 1920
config.frame_width = 9
config.frame_height = 16
class VerticalDemo(Scene):
def construct(self):
title = Text("y = x² 的图像", font_size=60).to_edge(UP, buff=1.5)
# 坐标轴的长度要自己给:默认 x_length 是 12,比 9 个单位宽的画布还宽
ax = Axes(
x_range=[-3, 3, 1],
y_range=[0, 9, 3],
x_length=7.5,
y_length=7.5,
tips=False,
)
curve = ax.plot(lambda x: x**2, color=YELLOW)
note = Text("竖屏横向只有 9 个单位", font_size=40).to_edge(DOWN, buff=2)
self.play(Write(title))
self.play(Create(ax), Create(curve))
self.play(FadeIn(note, shift=UP * 0.3))
self.wait()
本机用 manim -ql 渲出来,ffprobe 看到的是 1080 × 1920、15 帧每秒、4 秒。相机里的画布是 9 × 16,1 个单位等于 1920 ÷ 16 = 120 像素。标题宽 4.64 个单位,坐标轴 7.5,结论那行 5.51,都在 9 以内。
注意这里用的是 -ql,出来的却是 1080 × 1920。代码里写了 pixel_width、pixel_height 之后,命令行的 -ql、-qh 就只管帧率了(-ql 是 15,-qh 是 60),分辨率听代码的。想先出个小样看构图,可以临时把像素改成 540 × 960,画布不动,构图就一点不变,渲染量只有四分之一。
为什么画布也得改、只改像素会怎样,上一篇讲画布尺寸的文章里写过:Manim 的相机永远保住 frame_width,高度按像素比例去算。
画布选 9 × 16 还是 4.5 × 8
两种都是 9:16,区别在一个单位有多大。都按 1080 × 1920 输出:
| 画布 | 1 单位 = | 一行 10 个汉字的标题(font_size=48,宽 7.27 单位) |
|---|---|---|
| 9 × 16 | 120 像素 | 占画面宽度的 81%,放得下 |
| 4.5 × 8 | 240 像素 | 比画面宽出六成,两头被裁 |
font_size 是按单位算的,不按画面比例。同样 font_size=48 的字,9 × 16 上高 0.64 个单位,约 76 像素;4.5 × 8 上还是 0.64 个单位,就成了 153 像素。所以 4.5 × 8 上什么都显得大一号,适合字少、手机上要一眼看清的画面;把横屏的场景改成竖屏,9 × 16 更省事,每单位 120 像素,和横屏 1080p 的 135 差不多,字号、线宽基本不用重调。我们的教程就用 9 × 16。
4.5 × 8 的来历是保住高度 8 不变,宽度按 9:16 算:8 × 9 ÷ 16 = 4.5。工作区渲染设置里选 9:16 时,配的就是这块画布,下面会讲。

横屏的代码搬到竖屏,先看这几处
我们拿一个横屏的场景改竖屏,出画的基本都是前三样。
坐标轴
Axes() 不传参数时,x_length 是 12、y_length 是 6。在 9 × 16 的画布上,12 宽就出画了;4.5 × 8 上更是将近三倍宽。我们打印过,x_range 倒是会跟着画布变(9 × 16 上是 -4 到 4),可长度不会,所以 x_length、y_length 一定要自己写。
网格
NumberPlane() 的默认范围在 from manim import * 那一刻就按 14.22 × 8 定死了,y 只铺 -4 到 4。在 9 × 16 上,上下各 4 个单位是空的。竖屏要写成 NumberPlane(x_range=[-4.5, 4.5, 1], y_range=[-8, 8, 1])。
长标题
横屏里一行 10 个字随便放,竖屏就挤了。可以让它在超宽时自己缩:
title = Text("勾股定理的五种证明方法")
if title.width > config.frame_width - 1:
title.scale_to_fit_width(config.frame_width - 1) # 两边各留半个单位
播放页上压着的文案和按钮
这一条和 Manim 无关,是平台的:抖音、视频号这些竖屏播放页,底下压着标题文案,右边一列是点赞评论的按钮。关键的公式和结论别贴着下沿和右边放,to_edge(DOWN) 的 buff 可以给大一点,上面例子里给的是 2。
在工作区里做竖屏
工作区「运行」按钮右边那个写着 480p15 的按钮是渲染设置。画幅里选 9:16,画质选 480p、720p 或 1080p,对应的像素是 480 × 854、720 × 1280、1080 × 1920,画布是 4.5 × 8。代码里一行 config 都不写也能出竖屏,前提是场景按 4.5 个单位宽来摆。
代码里写了这几个 config,就以代码为准,画面上方会出一条黄色提示说面板设置被覆盖了。上面那段例子写死了 1080 × 1920,在浏览器里渲染量大约是默认 480p 预览的五倍,等的时间也差不多这个倍数。
想预览快一点,有个省时间的搭法:面板选 9:16、480p,代码里只写画布那两行:
config.frame_width = 9
config.frame_height = 16
像素从面板来,是 480 × 854,比例对得上,相机就是 9 × 16,预览很快。满意了把面板的画质切到 1080p 再导出,构图不变。这种写法要求面板一定是 9:16,面板停在默认的 16:9 时,就会碰到下面第二条那个坑。
常见写错的地方
只用 -r 1080,1920
manim -r 1080,1920 scene.py Demo
只改了像素。相机守着 frame_width = 14.22,高度算成 25.28,画布成了一根竖条,横屏摆的东西缩在中间,to_edge(UP) 还按 config.frame_height = 8 找边,标题的上沿停在 y = 3.5,离真正的上沿 12.64 很远。要么在代码顶层把画布改成 9 × 16,要么连像素一起写进代码。
画布写在代码里,像素靠 -ql
config.frame_width = 9
config.frame_height = 16
代码里只有这两行,命令行跑 manim -ql,出来的是 854 × 480 的横屏。相机保住宽度 9,按 16:9 把高度算成 5.06。本来想要的 9 × 16 竖屏,只拍到了中间扁扁的一段,to_edge(UP) 按 config.frame_height = 16 把标题的上沿放到 y = 7.5,画面的上沿才 2.53,早出画了。这种写法要配 -r 用:预览 manim -ql -r 540,960(540 × 960、15 帧),成片 manim -r 1080,1920(不写 --fps 时是 60 帧)。
写进 manim.cfg,又加了 -qh
[CLI]
pixel_width = 1080
pixel_height = 1920
frame_width = 9
frame_height = 16
manim.cfg 里这四个键都认,单跑 manim scene.py Demo 出来就是 1080 × 1920、9 × 16。可只要再加 -ql 或 -qh,命令行的画质会把配置文件里的像素盖回 854 × 480 或 1920 × 1080,画布还是 9 × 16,结果和上一条一样,成了 9 × 5.06 的横条。用配置文件的话就别加 -q,要换分辨率写 -r。
在 construct 里改
class Demo(Scene):
def construct(self):
config.pixel_width = 1080 # 太晚了
config.pixel_height = 1920
相机在场景创建时就按当时的 config 建好了,construct 里改不影响这一次的输出。这五个值(再加一个 frame_rate)都要写在文件顶层,class 外面。
常见追问(FAQ)
Q:抖音、视频号、小红书的竖屏用多大分辨率、多少帧?
A:1080 × 1920 是这几家通用的竖屏尺寸。帧率 30 或 60 都行,-qh 默认 60;数学动画以平移、变形为主,30 帧通常就够顺,渲染时间省一半,命令行加 --fps 30 就行。
Q:同一份代码能不能横屏、竖屏各出一版? A:能。像素交给命令行,代码顶层按像素的方向配画布:
if config.pixel_height > config.pixel_width:
config.frame_width, config.frame_height = 9, 16
else:
config.frame_width, config.frame_height = 16, 9
然后分别跑 -r 1080,1920 和 -r 1920,1080。我们在 0.21.0、0.22.0 上都试了,相机分别是 9 × 16 和 16 × 9。场景里的布局要按 config.frame_width 来算,别写死坐标。在工作区里,像素来自面板选的画幅,道理一样。
Q:竖屏会不会把圆拉成椭圆? A:不会。Cairo 渲染器下画布的宽高比永远跟着像素走,写错了只会是画布的大小和你想的不一样,不会变形。
Q:0.22.0 在这件事上有变化吗? A:没有。文中所有的输出我们在 0.21.0 和 0.22.0 上各跑了一次,结果一样。工作区目前装的是 0.21.0。
画布、单位和像素的关系,在教程《画布与坐标系》的「单位与像素」一节里有视频讲解,后半段讲的就是 16:9 和 9:16 两套配置,旁边的代码可以边看边改。想直接做一条竖屏,打开工作区,渲染设置里选 9:16。
来源:极坐标⋅XYZ · jizuobiao.xyz · 更新于 2026-10-19 · 基于 Manim Community 0.21.0,0.22.0 复核