来源:Python数据之道 (ID:PyDataLab)
作者:阳哥
01写在前面
大家好,我是阳哥。
最近一段时间,我在微信视频号「价值前瞻」和「Python数据之道」发布了一些视频,有不少同学问到这些视频是怎么做的,用什么工具制作的。
在文章 用 python 制作高逼格的数学动画 中,我跟大家介绍了 Manim
这个视频制作工具,以及以及案例演示。
不少同学觉得这个工具不错,问到有没有完整的使用教程或者相关书籍。据我所知,目前应该是没有专门的书籍来介绍这个工具的。至于教程,不同版本的Manim有一部分文档,其中 Manim社区版的文档相对而言要完善些。
我将基于 Manim社区版(Manim Community)给大家分享Manim入门的内容,当前已有的教程包括:
说明:Manim 社区版,经常缩写为 manimce,英文全称是 Manim Community Edition
本次介绍 Manim 中 文本
的使用,使用的版本为 Manim Community v0.14.0
,本文内容主要如下:

02Manim的安装与运行
安装
如何安装社区版Manim,参见下面的官方链接:
https://docs.manim.community/en/stable/installation.html
如何运行 Manim
用 Manim
绘制图形,首先需要引入 Manim
库,然后将需要绘制的内容封装到一个 类(class) 里面。
社区版的导入代码如下:
from manim import *
对于 编辑好的程序文件( XXXX.py
文件),需要在同一个文件夹下运行命令来运行程序,命令格式如下:
manim -pql XXXX.py DemoSquare
上面的命令行中:
manim
是社区版Manim运行程序的主要标志用语;p
表示程序运行后会进行预览(图片或视频);ql
表示低质量(quality low), 其他的选项有-ql
,-qm
,-qh
,-qk
, 分别表示 低质量、正常质量、高质量、4K质量;XXXX.py
是py代码文件;DemoSquare 是 py代码文件中的一个类;
演示过程录屏如下:

命令行中,还有其他许多参数可以设置,可以通过社区版的支持文档来进一步了解:
https://docs.manim.community/en/stable/tutorials/configuration.html#command-line-arguments
03文本使用介绍
在 Manim社区版中,文本的使用可以分为几个大类,分别是:
纯文本
标记文本
LaTex 文本
代码文本
3.1 纯文本
纯文本是最常见的一类文字,在视频中使用的标题、正文等,都可以使用纯文本,在Manim 中,纯文本可以通过 Text()
对象来实现。
比如要输出 文字 “Python数据之道”,核心代码如下:
Text("Python数据之道")
效果如下:

设置文本大小
对于文本而言,设置文本在屏幕中显示的大小,是经常要做的一个事情,Text()
对象可以通过多种方法来实现:
设置
scale
属性值;设置
set_width
属性值;设置
font_size
参数值;
# 设置文本大小
class Demo2(Scene):
def construct(self):
WaterMark.construct(self)
s = "Python数据之道"
t1 = Text(s)
t1.to_edge(UP,buff=0.5)
t2 = Text(s).scale(2)
t2.next_to(t1,DOWN)
t3 = Text(s).set_width(10)
t3.next_to(t2,DOWN)
t4 = Text(s,font_size=40)
t4.next_to(t3,DOWN)
self.add(t1)
self.play(Write(t2))
self.play(Create(t3))
self.play(Write(t4))
self.wait()
上述代码的实现效果如下:

设置文本颜色
文本颜色设置包括指定某种颜色以及渐变颜色设置,通常情况下,颜色通过 color
参数来设置,渐变颜色通过 gradient
参数来设置。
演示案例的代码如下:
# 设置文本颜色
class Demo3(Scene):
def construct(self):
WaterMark.construct(self)
s = "Python数据之道"
t1 = Text(s,color=BLUE)
t1.to_edge(UP,buff=2)
t2 = Text("一份价值,一份收获",gradient=[BLUE,YELLOW,RED]).next_to(t1,DOWN)
t3 = Text("Hello World",gradient=[BLUE,YELLOW,RED]).next_to(t2,DOWN)
t4 = Text("@Python数据之道",gradient=[BLUE,YELLOW,RED],font_size=30,fill_opacity=0.8)
t4.next_to(t3,DOWN)
t5 = Text("Python数据之道",gradient=[BLUE,YELLOW,RED]).next_to(t4,DOWN)
# 当英文和汉字混合时, 当前的manim社区版,使用 gradient 时会出现 bug
self.add(t1)
self.play(Write(t2))
self.play(Create(t3))
self.play(Write(t4))
self.play(Write(t5))
self.wait()
上述代码的实现效果如下:

需要注意的是,当英文和汉字混合时, 当前的manim社区版,使用 gradient 时可能会出现 bug,没有渐变的效果,上述案例中的 变量 t5
实例 就没有实现渐变效果。
设置文本样式
文本样式的设置,包括文本加粗、斜体文本、文本字体设置、文本透明度设置、文本换行以及行距设置等。
演示案例的代码如下:
# 设置字体样式
class Demo4(Scene):
def construct(self):
WaterMark.construct(self)
t1 = Text("Python数据之道",font="Alibaba PuHuiTi")
t1.to_edge(UP,buff=0.5)
t2 = Text("Python数据之道",color=BLUE,font="Times")
t2.next_to(t1,DOWN)
t3 = Text("Python数据之道", weight=BOLD)
t3.next_to(t2,DOWN)
t4 = Text("Python数据之道", slant=ITALIC)
t4.next_to(t3,DOWN)
t5 = Text("Python数据之道", fill_opacity=0.5)
t5.next_to(t4,DOWN)
t6 = Text("Hello\nPython", line_spacing=0.5)
t6.next_to(t5,DOWN,buff=1).shift(LEFT)
t7 = Text("Hello\nPython", line_spacing=2)
t7.next_to(t6,RIGHT,buff=1)
self.add(t1)
self.play(Write(t2))
self.play(Write(t3))
self.play(Write(t4))
self.play(Write(t5))
self.add(t6,t7)
self.wait()
上述代码的实现效果如下:

需要主要的是,在选择字体设置时,所选择的字体需要在自己的电脑中已经安装了对应的字体,才会有效果。
此外,在对于非英文字体的设置时,可能有些样式设置会不起作用,具体的需要自己去根据实际情况测试下。
对于咱们而言,一般就是英文和中文的使用,常用的字体加粗、斜体文字、透明度等,是有效的。对于字体,我一般是使用 "Alibaba PuHuiTi" 字体,这个字体可以免费使用。
个性化设置部分文本
在控制显示过程中,经常会遇到只需要显示一段文本中一部分文本的情况,可以通过以下几个参数来进行设置:
t2c
,全称为 "text2color",用来设置部分文字的颜色;t2f
,全称为 “text2font”,用来设置部分文字的字体;t2w
,全称为 “text2weight”,用来设置部分文字加粗;t2s
,全称为 “text2slant”,用来设置部分文字为斜体;t2g
,全称为 “text2gradient”,用来设置部分文字的渐变颜色;
演示案例的代码如下:
# 个性化设置部分文本的样式
class Demo5(Scene):
def construct(self):
WaterMark.construct(self)
t1 = Text("Python数据之道",t2c={"Python":RED,'[7:9]':YELLOW})
t1.to_edge(UP,buff=0.5)
t2 = Text("Python数据之道",t2s={"Python":ITALIC})
t2.next_t