颜色¶
影片代码
import manimgx as m
class ColorsHero(m.Scene):
def construct(self) -> None:
rows = m.VGroup()
for family in [
"BLUE",
"TEAL",
"GREEN",
"YELLOW",
"GOLD",
"RED",
"MAROON",
"PURPLE",
"GREY",
]:
row = m.VGroup(m.Text(family, font="monospace", font_size=24))
for shade in "ABCDE":
color = m.PALETTE[f"{family}_{shade}"]
row.add(
m.Circle(radius=0.24, color=color, fill_opacity=1, stroke_width=0)
)
row.arrange(buff=0.16)
rows.add(row)
rows.arrange(m.DOWN, buff=0.16, aligned_edge=m.RIGHT)
self.play(
m.LaggedStart(
*[m.FadeIn(row, shift=0.2 * m.RIGHT) for row in rows], lag_ratio=0.1
)
)
self.wait()
颜色是一个名称,如 m.BLUE;一个十六进制代码,如 "#58C4DD";或红、绿、蓝的
数值。在需要颜色的任何地方,三者可相互替代:m.Circle(color="#58C4DD") 即
m.Circle(color=m.BLUE)。
大多数命名颜色以五个深浅级别的家族形式出现,从 A(最浅)到 E(最深);家族自身 的名称即其 C 级。GRAY 和 GREY 是同一颜色的两种拼写。
命名颜色¶
WHITE
#FFFFFF
GRAY_AGREY_A
#DDDDDD
GRAY_BGREY_B
#BBBBBB
GRAY_CGREY_C
#888888
GRAY_DGREY_D
#444444
GRAY_EGREY_E
#222222
BLACK
#000000
LIGHTER_GRAYLIGHTER_GREY
#DDDDDD
LIGHT_GRAYLIGHT_GREY
#BBBBBB
GRAYGREY
#888888
DARK_GRAYDARK_GREY
#444444
DARKER_GRAYDARKER_GREY
#222222
PURE_RED
#FF0000
PURE_GREEN
#00FF00
PURE_BLUE
#0000FF
PURE_CYAN
#00FFFF
PURE_MAGENTA
#FF00FF
PURE_YELLOW
#FFFF00
BLUE_A
#C7E9F1
BLUE_B
#9CDCEB
BLUE_C
#58C4DD
BLUE_D
#29ABCA
BLUE_E
#236B8E
BLUE
#58C4DD
DARK_BLUE
#236B8E
TEAL_A
#ACEAD7
TEAL_B
#76DDC0
TEAL_C
#5CD0B3
TEAL_D
#55C1A7
TEAL_E
#49A88F
TEAL
#5CD0B3
GREEN_A
#C9E2AE
GREEN_B
#A6CF8C
GREEN_C
#83C167
GREEN_D
#77B05D
GREEN_E
#699C52
GREEN
#83C167
YELLOW_A
#FFF1B6
YELLOW_B
#FFEA94
YELLOW_C
#F7D96F
YELLOW_D
#F4D345
YELLOW_E
#E8C11C
YELLOW
#F7D96F
GOLD_A
#F7C797
GOLD_B
#F9B775
GOLD_C
#F0AC5F
GOLD_D
#E1A158
GOLD_E
#C78D46
GOLD
#F0AC5F
RED_A
#F7A1A3
RED_B
#FF8080
RED_C
#FC6255
RED_D
#E65A4C
RED_E
#CF5044
RED
#FC6255
MAROON_A
#ECABC1
MAROON_B
#EC92AB
MAROON_C
#C55F73
MAROON_D
#A24D61
MAROON_E
#94424F
MAROON
#C55F73
PURPLE_A
#CAA3E8
PURPLE_B
#B189C6
PURPLE_C
#9A72AC
PURPLE_D
#715582
PURPLE_E
#644172
PURPLE
#9A72AC
PINK
#D147BD
LIGHT_PINK
#DC75CD
ORANGE
#FF862F
LIGHT_BROWN
#CD853F
DARK_BROWN
#8B4513
GRAY_BROWNGREY_BROWN
#736357
LOGO_WHITE
#ECE7E2
LOGO_GREEN
#87C2A5
LOGO_BLUE
#525893
LOGO_RED
#E07A5F
LOGO_BLACK
#343434
m.PALETTE
¶
按名称索引的命名颜色:PALETTE["BLUE"] 即 BLUE。颜色名大小写不限,
均可读取为对应颜色。
创建颜色¶
ManimColor
¶

代码
import manimgx as m
class ManimColorExample(m.Scene):
def construct(self) -> None:
colors = [
m.ManimColor("#58C4DD"),
m.ManimColor("orange"),
m.ManimColor((0.9, 0.3, 0.5)),
m.ManimColor.from_hsv((0.75, 0.6, 0.9)),
m.RED.lighter(0.4),
m.RED.darker(0.4),
]
swatches = m.VGroup(
*(
m.VGroup(
m.Square(side_length=1.6, color=color, fill_opacity=1),
m.Text(color, font_size=24),
).arrange(m.DOWN)
for color in colors
)
)
self.add(swatches.arrange(buff=0.4))
一种颜色:红、绿、蓝及不透明度,取值从 0 到 1,同时也是其十六进制字符串。
作为字符串时为 "#RRGGBB",半透明时为 "#RRGGBBAA",因此凡字符串可去之处它亦可去;
to_rgba 给出其数值。ManimColor(value, alpha=1.0)
将 value 读取为颜色,其不透明度为 alpha(取值从 0 到 1),用于 value 未给出
不透明度的情况。value 可以是:
- 一个十六进制字符串,
"#FC6255"或"0xFC6255",含 3、4、6 或 8 位数字(四位时 第四位为不透明度,八位时最后两位为不透明度); - 一个颜色名,大小写不限:
"BLUE"、"blue_c"; - 一个整数,
0xFC6255; - 三到四个数字,红、绿、蓝及不透明度:若全为浮点数则取值从 0 到 1,否则从 0 到 255
(
(1.0, 0.5, 0.0)为橙色,(1, 0.5, 0)近乎黑色); - 另一个颜色,按原样复制;
- None,表示黑色。
to_rgb
¶
to_rgba
¶
to_hex
¶
以大写十六进制字符串 "#RRGGBB" 表示的颜色。
with_alpha是否追加不透明度的两位数字:
"#RRGGBBAA"。
返回 该字符串。
源码
manimgx\drawing\paint.py
interpolate
¶
从本颜色到另一颜色之间某分数位置处的颜色,按所有颜色混合的方式混合: 在 OKLab 中,两色之间的颜色即人眼在其间所看到的颜色。
other对应 1 的颜色。
alpha朝其移动的距离,从 0(本颜色)到 1(
other)。
返回 一个新颜色。
源码
manimgx\drawing\paint.py
opacity
¶
具有另一个不透明度的本颜色。
opacity不透明度,从 0(透明)到 1(不透明)。
返回 一个新颜色。
lighter
¶
向白色混合后的本颜色,保持其不透明度。
blend朝白色移动的距离,从 0(本颜色)到 1(白色)。
返回 一个新颜色。
darker
¶
向黑色混合后的本颜色,保持其不透明度。
blend朝黑色移动的距离,从 0(本颜色)到 1(黑色)。
返回 一个新颜色。
from_hex
¶
由十六进制字符串表示的颜色,按构造函数的方式读取("#RRGGBB"、
"#RGB",含或不含不透明度数字;也可为颜色名)。
hex_str该字符串。
alpha当字符串未给出不透明度时的不透明度,取值从 0 到 1。
返回 一个新颜色。
源码
manimgx\drawing\paint.py
from_rgb
¶
由红、绿、蓝构成的颜色。
rgb红、绿、蓝,取值从 0 到 1。
alpha不透明度,取值从 0 到 1。
返回 一个新颜色。
源码
manimgx\drawing\paint.py
from_rgba
¶
由红、绿、蓝及不透明度构成的颜色。
rgba红、绿、蓝及不透明度,取值从 0 到 1。
返回 一个新颜色。
from_hsv
¶
由色相、饱和度与明度构成的颜色。
hsv色相、饱和度与明度,各为从 0 到 1 的浮点数:色相为 0(或 1)时为红色, ⅓ 为绿色,⅔ 为蓝色。
alpha不透明度,取值从 0 到 1。
返回 一个新颜色。
源码
manimgx\drawing\paint.py
from_hsl
¶
由色相、饱和度与亮度构成的颜色。
hsl色相、饱和度与亮度,各取值从 0 到 1:色相为 0(或 1)时为红色, ⅓ 为绿色,⅔ 为蓝色;亮度为 0.5 时为纯色。
alpha不透明度,取值从 0 到 1。
返回 一个新颜色。
源码
manimgx\drawing\paint.py
to_hsv
¶
contrasting
¶
一种与本颜色形成对比、能从其上脱颖而出的颜色,如同文字落于其上一般: 浅色之上用深色,深色之上用浅色。
threshold亮度(0.30 红 + 0.59 绿 + 0.11 蓝),取值从 0 到 1, 超过此值则本颜色视为浅色。
light用于深色的颜色;None 表示白色。
dark用于浅色的颜色;None 表示黑色。
返回
dark 或 light。
源码
manimgx\drawing\paint.py
HSV
¶

由色相、饱和度与明度构成的颜色,可读取也可设置。
HSV(hsv, alpha=1.0) 接收色相、饱和度与明度,各取值从 0 到 1,以及
不透明度:若 hsv 给出第四个数则取之,否则取 alpha,取值从 0 到 1。
设置 hue、saturation 或
value 会改变颜色,既改变其值也改变其 str;它仍与
创建时的字符串相等(并按其哈希)。
混合颜色¶
interpolate_color
¶

代码
import manimgx as m
class InterpolateColorExample(m.Scene):
def construct(self) -> None:
swatches = m.VGroup()
for alpha in (0, 0.25, 0.5, 0.75, 1):
color = m.interpolate_color(m.BLUE, m.RED, alpha)
square = m.Square(side_length=1.8, color=color, fill_opacity=1)
label = m.Text(str(alpha), font_size=32).next_to(square, m.DOWN)
swatches.add(m.VGroup(square, label))
self.add(swatches.arrange(buff=0.5))
从一个颜色到另一个颜色之间某分数位置处的颜色。
两色按所有颜色混合的方式混合:在 OKLab 中,两色之间的颜色即人眼在其间所 看到的颜色。
a对应 0 的颜色。
b对应 1 的颜色。
alpha从
a到b的距离,取值从 0 到 1。
返回 一个新颜色。
源码
manimgx\drawing\paint.py
color_gradient
¶

沿穿过参考颜色的渐变均匀分布的颜色,从第一个到最后一个。
每个颜色在其两侧的两个参考颜色之间混合,混合方式同 interpolate_color。
reference_colors渐变所经过的颜色,沿其均匀分布。
length_of_output返回的颜色数;为 1 时即最后一个参考颜色。
返回 沿渐变有序排列的颜色。
源码
manimgx\drawing\paint.py
average_color
¶
颜色的平均值,在 OKLab 中取:即人眼所感知的居中颜色。
各颜色的不透明度不参与计算:平均结果为不透明颜色。
*colors各颜色,可为任何 ManimColor 可读取的形式。
返回 一个新的不透明颜色。
源码
manimgx\drawing\paint.py
invert_color
¶
colors_by_value
¶
色阶上各取值对应的颜色:在其两侧的颜色之间混合,在色阶两端之外保持不变。
颜色按所有颜色混合的方式混合:在 OKLab 中,两色之间的颜色即人眼在其间所 看到的颜色。
colorscale从
low到high均匀分布的颜色,或 (color, value) 配对, 每种颜色对应其取值,按取值递增排列。values待着色的取值。
low当颜色均匀分布时第一个颜色对应的取值。
high当颜色均匀分布时最后一个颜色对应的取值。
返回 每个取值对应一个颜色,按顺序排列。
源码
manimgx\drawing\paint.py
随机选取颜色¶
random_color
¶
random_bright_color
¶
随机抽取的一个浅色:其红、绿、蓝各分量取值从 0.5 到 1。
由 NumPy 的全局生成器抽取,因此 np.random.seed 可使其可复现。
返回 一个新的不透明颜色。
RandomColorGenerator
¶

代码
import manimgx as m
class RandomColorGeneratorExample(m.Scene):
def construct(self) -> None:
palette = [m.RED, m.GREEN, m.BLUE, m.YELLOW, m.PURPLE, m.TEAL]
colors = m.RandomColorGenerator(seed=7, sample_colors=palette)
squares = m.VGroup(
*(
m.Square(side_length=1, color=colors.next(), fill_opacity=1)
for _ in range(40)
)
)
self.add(squares.arrange_in_grid(rows=4, buff=0.2))
随机抽取的颜色流,相同种子得到相同流。
seed种子;None 表示每次运行得到不同的流。
sample_colors抽取范围;None(或无颜色)表示命名颜色。
源码
manimgx\drawing\paint.py