跳转至

颜色

影片代码
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

ManimColorExample
代码
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

颜色的红、绿、蓝分量。

color.to_rgb()

返回 一个由三个浮点数组成的数组,取值从 0 到 1。

源码

manimgx\drawing\paint.py

def to_rgb(self) -> np.ndarray:
    """颜色的红、绿、蓝分量。

    Returns:
        一个由三个浮点数组成的数组,取值从 0 到 1。
    """
    return self._rgba[:3]

to_rgba

颜色的红、绿、蓝及不透明度。

color.to_rgba()

返回 一个由四个浮点数组成的数组,取值从 0 到 1。

源码

manimgx\drawing\paint.py

def to_rgba(self) -> np.ndarray:
    """颜色的红、绿、蓝及不透明度。

    Returns:
        一个由四个浮点数组成的数组,取值从 0 到 1。
    """
    return self._rgba

to_hex

以大写十六进制字符串 "#RRGGBB" 表示的颜色。

color.to_hex(with_alpha=False)
with_alpha

是否追加不透明度的两位数字:"#RRGGBBAA"。

返回 该字符串。

源码

manimgx\drawing\paint.py

def to_hex(self, with_alpha: bool = False) -> str:
    """以大写十六进制字符串 `"#RRGGBB"` 表示的颜色。

    Args:
        with_alpha: 是否追加不透明度的两位数字:`"#RRGGBBAA"`。

    Returns:
        该字符串。
    """
    r, g, b, a = _bytes(self._rgba)
    return f"#{r:02X}{g:02X}{b:02X}" + (f"{a:02X}" if with_alpha else "")

interpolate

从本颜色到另一颜色之间某分数位置处的颜色,按所有颜色混合的方式混合: 在 OKLab 中,两色之间的颜色即人眼在其间所看到的颜色。

color.interpolate(other, alpha)
other

对应 1 的颜色。

alpha

朝其移动的距离,从 0(本颜色)到 1(other)。

返回 一个新颜色。

源码

manimgx\drawing\paint.py

def interpolate(self, other: "ManimColor", alpha: float) -> "ManimColor":
    """从本颜色到另一颜色之间某分数位置处的颜色,按所有颜色混合的方式混合:
    在 OKLab 中,两色之间的颜色即人眼在其间所看到的颜色。

    Args:
        other: 对应 1 的颜色。
        alpha: 朝其移动的距离,从 0(本颜色)到 1(`other`)。

    Returns:
        一个新颜色。
    """
    return ManimColor(tuple(mix_rgba(self._rgba, other._rgba, alpha)))

opacity

具有另一个不透明度的本颜色。

color.opacity(opacity)
opacity

不透明度,从 0(透明)到 1(不透明)。

返回 一个新颜色。

源码

manimgx\drawing\paint.py

def opacity(self, opacity: float) -> "ManimColor":
    """具有另一个不透明度的本颜色。

    Args:
        opacity: 不透明度,从 0(透明)到 1(不透明)。

    Returns:
        一个新颜色。
    """
    return ManimColor((*self._rgba[:3], float(opacity)))

lighter

向白色混合后的本颜色,保持其不透明度。

color.lighter(blend=0.2)
blend

朝白色移动的距离,从 0(本颜色)到 1(白色)。

返回 一个新颜色。

源码

manimgx\drawing\paint.py

def lighter(self, blend: float = 0.2) -> "ManimColor":
    """向白色混合后的本颜色,保持其不透明度。

    Args:
        blend: 朝白色移动的距离,从 0(本颜色)到 1(白色)。

    Returns:
        一个新颜色。
    """
    return self.interpolate(WHITE, blend).opacity(self._rgba[3])

darker

向黑色混合后的本颜色,保持其不透明度。

color.darker(blend=0.2)
blend

朝黑色移动的距离,从 0(本颜色)到 1(黑色)。

返回 一个新颜色。

源码

manimgx\drawing\paint.py

def darker(self, blend: float = 0.2) -> "ManimColor":
    """向黑色混合后的本颜色,保持其不透明度。

    Args:
        blend: 朝黑色移动的距离,从 0(本颜色)到 1(黑色)。

    Returns:
        一个新颜色。
    """
    return self.interpolate(BLACK, blend).opacity(self._rgba[3])

from_hex

由十六进制字符串表示的颜色,按构造函数的方式读取("#RRGGBB"、 "#RGB",含或不含不透明度数字;也可为颜色名)。

ManimColor.from_hex(hex_str, alpha=1.0)
hex_str

该字符串。

alpha

当字符串未给出不透明度时的不透明度,取值从 0 到 1。

返回 一个新颜色。

源码

manimgx\drawing\paint.py

@classmethod
def from_hex(cls, hex_str: str, alpha: float = 1.0) -> "ManimColor":
    """由十六进制字符串表示的颜色,按构造函数的方式读取(`"#RRGGBB"`、
    `"#RGB"`,含或不含不透明度数字;也可为颜色名)。

    Args:
        hex_str: 该字符串。
        alpha: 当字符串未给出不透明度时的不透明度,取值从 0 到 1。

    Returns:
        一个新颜色。
    """
    return cls(hex_str, alpha)

from_rgb

由红、绿、蓝构成的颜色。

ManimColor.from_rgb(rgb, alpha=1.0)
rgb

红、绿、蓝,取值从 0 到 1。

alpha

不透明度,取值从 0 到 1。

返回 一个新颜色。

源码

manimgx\drawing\paint.py

@classmethod
def from_rgb(
    cls, rgb: Sequence[float] | Floats, alpha: float = 1.0
) -> "ManimColor":
    """由红、绿、蓝构成的颜色。

    Args:
        rgb: 红、绿、蓝,取值从 0 到 1。
        alpha: 不透明度,取值从 0 到 1。

    Returns:
        一个新颜色。
    """
    return cls(tuple(float(x) for x in rgb), alpha)

from_rgba

由红、绿、蓝及不透明度构成的颜色。

ManimColor.from_rgba(rgba)
rgba

红、绿、蓝及不透明度,取值从 0 到 1。

返回 一个新颜色。

源码

manimgx\drawing\paint.py

@classmethod
def from_rgba(cls, rgba: Sequence[float] | Floats) -> "ManimColor":
    """由红、绿、蓝及不透明度构成的颜色。

    Args:
        rgba: 红、绿、蓝及不透明度,取值从 0 到 1。

    Returns:
        一个新颜色。
    """
    return cls(tuple(float(x) for x in rgba[:3]), float(rgba[3]))

from_hsv

由色相、饱和度与明度构成的颜色。

ManimColor.from_hsv(hsv, alpha=1.0)
hsv

色相、饱和度与明度,各为从 0 到 1 的浮点数:色相为 0(或 1)时为红色, ⅓ 为绿色,⅔ 为蓝色。

alpha

不透明度,取值从 0 到 1。

返回 一个新颜色。

源码

manimgx\drawing\paint.py

@classmethod
def from_hsv(
    cls, hsv: Sequence[float] | Floats, alpha: float = 1.0
) -> "ManimColor":
    """由色相、饱和度与明度构成的颜色。

    Args:
        hsv: 色相、饱和度与明度,各为从 0 到 1 的浮点数:色相为 0(或 1)时为红色,
            1/3 为绿色,2/3 为蓝色。
        alpha: 不透明度,取值从 0 到 1。

    Returns:
        一个新颜色。
    """
    return cls(colorsys.hsv_to_rgb(*hsv[:3]), alpha)

from_hsl

由色相、饱和度与亮度构成的颜色。

ManimColor.from_hsl(hsl, alpha=1.0)
hsl

色相、饱和度与亮度,各取值从 0 到 1:色相为 0(或 1)时为红色, ⅓ 为绿色,⅔ 为蓝色;亮度为 0.5 时为纯色。

alpha

不透明度,取值从 0 到 1。

返回 一个新颜色。

源码

manimgx\drawing\paint.py

@classmethod
def from_hsl(
    cls, hsl: Sequence[float] | Floats, alpha: float = 1.0
) -> "ManimColor":
    """由色相、饱和度与亮度构成的颜色。

    Args:
        hsl: 色相、饱和度与亮度,各取值从 0 到 1:色相为 0(或 1)时为红色,
            1/3 为绿色,2/3 为蓝色;亮度为 0.5 时为纯色。
        alpha: 不透明度,取值从 0 到 1。

    Returns:
        一个新颜色。
    """
    hue, saturation, lightness = hsl[:3]
    return cls(colorsys.hls_to_rgb(hue, lightness, saturation), alpha)

to_hsv

颜色的色相、饱和度与明度。

color.to_hsv()

返回 一个由三个浮点数组成的数组,取值从 0 到 1。

源码

manimgx\drawing\paint.py

def to_hsv(self) -> np.ndarray:
    """颜色的色相、饱和度与明度。

    Returns:
        一个由三个浮点数组成的数组,取值从 0 到 1。
    """
    return np.array(colorsys.rgb_to_hsv(*self.to_rgb()))

contrasting

一种与本颜色形成对比、能从其上脱颖而出的颜色,如同文字落于其上一般: 浅色之上用深色,深色之上用浅色。

color.contrasting(threshold=0.5, light=None, dark=None)
threshold

亮度(0.30 红 + 0.59 绿 + 0.11 蓝),取值从 0 到 1, 超过此值则本颜色视为浅色。

light

用于深色的颜色;None 表示白色。

dark

用于浅色的颜色;None 表示黑色。

返回 dark 或 light。

源码

manimgx\drawing\paint.py

def contrasting(
    self,
    threshold: float = 0.5,
    light: "ManimColor | None" = None,
    dark: "ManimColor | None" = None,
) -> "ManimColor":
    """一种与本颜色形成对比、能从其上脱颖而出的颜色,如同文字落于其上一般:
    浅色之上用深色,深色之上用浅色。

    Args:
        threshold: 亮度(0.30 红 + 0.59 绿 + 0.11 蓝),取值从 0 到 1,
            超过此值则本颜色视为浅色。
        light: 用于深色的颜色;None 表示白色。
        dark: 用于浅色的颜色;None 表示黑色。

    Returns:
        `dark` 或 `light`。
    """
    luminance = colorsys.rgb_to_yiq(*self.to_rgb())[0]
    return (dark or BLACK) if luminance > threshold else (light or WHITE)

invert

颜色的补色:红、绿、蓝各分量取自 1 减原值,不透明度保持不变。

color.invert()

返回 一个新颜色。

源码

manimgx\drawing\paint.py

def invert(self) -> "ManimColor":
    """颜色的补色:红、绿、蓝各分量取自 1 减原值,不透明度保持不变。

    Returns:
        一个新颜色。
    """
    return ManimColor((*(1.0 - self._rgba[:3]), self._rgba[3]))

HSV

HSVExample
代码
import manimgx as m


class HSVExample(m.Scene):
    def construct(self) -> None:
        color = m.HSV((0.0, 0.7, 0.9))
        swatches = m.VGroup()
        for step in range(8):
            color.hue = step / 8
            swatches.add(m.Square(side_length=1.2, color=color, fill_opacity=1))
        self.add(swatches.arrange(buff=0.3))

由色相、饱和度与明度构成的颜色,可读取也可设置。

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

h

颜色的色相,取值从 0 到 1:0(或 1)为红色,⅓ 为绿色,⅔ 为蓝色。设置它可改变颜色。

hue

颜色的色相,取值从 0 到 1:0(或 1)为红色,⅓ 为绿色,⅔ 为蓝色。设置它可改变颜色。

s

颜色的饱和度,取值从 0(灰色)到 1(纯色)。设置它可改变颜色。

saturation

颜色的饱和度,取值从 0(灰色)到 1(纯色)。设置它可改变颜色。

v

颜色的明度,取值从 0(黑色)到 1(最亮)。设置它可改变颜色。

value

颜色的明度,取值从 0(黑色)到 1(最亮)。设置它可改变颜色。

混合颜色

interpolate_color

InterpolateColorExample
代码
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 中,两色之间的颜色即人眼在其间所 看到的颜色。

m.interpolate_color(a, b, alpha)
a

对应 0 的颜色。

b

对应 1 的颜色。

alpha

从 a 到 b 的距离,取值从 0 到 1。

返回 一个新颜色。

源码

manimgx\drawing\paint.py

def interpolate_color(a: ManimColor, b: ManimColor, alpha: float) -> ManimColor:
    """从一个颜色到另一个颜色之间某分数位置处的颜色。

    两色按所有颜色混合的方式混合:在 OKLab 中,两色之间的颜色即人眼在其间所
    看到的颜色。

    Args:
        a: 对应 0 的颜色。
        b: 对应 1 的颜色。
        alpha: 从 `a` 到 `b` 的距离,取值从 0 到 1。

    Returns:
        一个新颜色。

    Examples:
        ```python
        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))
        ```
    """
    return ManimColor(a).interpolate(ManimColor(b), alpha)

color_gradient

ColorGradientExample
代码
import manimgx as m


class ColorGradientExample(m.Scene):
    def construct(self) -> None:
        colors = m.color_gradient([m.BLUE, m.GREEN, m.YELLOW, m.RED], 12)
        dots = m.VGroup(*(m.Dot(radius=0.4, color=color) for color in colors))
        self.add(dots.arrange(buff=0.3))

沿穿过参考颜色的渐变均匀分布的颜色,从第一个到最后一个。

每个颜色在其两侧的两个参考颜色之间混合,混合方式同 interpolate_color。

m.color_gradient(reference_colors, length_of_output)
reference_colors

渐变所经过的颜色,沿其均匀分布。

length_of_output

返回的颜色数;为 1 时即最后一个参考颜色。

返回 沿渐变有序排列的颜色。

源码

manimgx\drawing\paint.py

def color_gradient(
    reference_colors: Sequence[ParsableManimColor], length_of_output: int
) -> list[ManimColor]:
    """沿穿过参考颜色的渐变均匀分布的颜色,从第一个到最后一个。

    每个颜色在其两侧的两个参考颜色之间混合,混合方式同
    [interpolate_color][manimgx.interpolate_color]。

    Args:
        reference_colors: 渐变所经过的颜色,沿其均匀分布。
        length_of_output: 返回的颜色数;为 1 时即最后一个参考颜色。

    Returns:
        沿渐变有序排列的颜色。

    Examples:
        ```python
        import manimgx as m


        class ColorGradientExample(m.Scene):
            def construct(self) -> None:
                colors = m.color_gradient([m.BLUE, m.GREEN, m.YELLOW, m.RED], 12)
                dots = m.VGroup(*(m.Dot(radius=0.4, color=color) for color in colors))
                self.add(dots.arrange(buff=0.3))
        ```
    """
    if length_of_output == 0:
        return []
    if len(reference_colors) == 1:
        return [ManimColor(reference_colors[0])] * length_of_output
    rgbas = [ManimColor(c).to_rgba() for c in reference_colors]
    alphas = np.linspace(0, len(rgbas) - 1, length_of_output)
    floors = alphas.astype(int)
    alphas_mod1 = alphas % 1
    alphas_mod1[-1] = 1
    floors[-1] = len(rgbas) - 2
    return [
        ManimColor(tuple(mix_rgba(rgbas[i], rgbas[i + 1], float(a))))
        for i, a in zip(floors, alphas_mod1, strict=True)
    ]

average_color

颜色的平均值,在 OKLab 中取:即人眼所感知的居中颜色。

各颜色的不透明度不参与计算:平均结果为不透明颜色。

m.average_color(*colors)
*colors

各颜色,可为任何 ManimColor 可读取的形式。

返回 一个新的不透明颜色。

源码

manimgx\drawing\paint.py

def average_color(*colors: ParsableManimColor) -> ManimColor:
    """颜色的平均值,在 OKLab 中取:即人眼所感知的居中颜色。

    各颜色的不透明度不参与计算:平均结果为不透明颜色。

    Args:
        *colors: 各颜色,可为任何 [ManimColor][manimgx.ManimColor] 可读取的形式。

    Returns:
        一个新的不透明颜色。
    """
    lab = np.mean([to_oklab(ManimColor(c).to_rgb()) for c in colors], axis=0)
    return ManimColor(tuple(from_oklab(lab)))

invert_color

颜色的补色:红、绿、蓝各分量取自 1 减原值,不透明度保持不变。

m.invert_color(color)
color

任何 ManimColor 可读取形式的颜色。

返回 一个新颜色。

源码

manimgx\drawing\paint.py

def invert_color(color: ParsableManimColor) -> ManimColor:
    """颜色的补色:红、绿、蓝各分量取自 1 减原值,不透明度保持不变。

    Args:
        color: 任何 [ManimColor][manimgx.ManimColor] 可读取形式的颜色。

    Returns:
        一个新颜色。
    """
    return ManimColor(color).invert()

colors_by_value

色阶上各取值对应的颜色:在其两侧的颜色之间混合,在色阶两端之外保持不变。

颜色按所有颜色混合的方式混合:在 OKLab 中,两色之间的颜色即人眼在其间所 看到的颜色。

m.colors_by_value(colorscale, values, low, high)
colorscale

从 low 到 high 均匀分布的颜色,或 (color, value) 配对, 每种颜色对应其取值,按取值递增排列。

values

待着色的取值。

low

当颜色均匀分布时第一个颜色对应的取值。

high

当颜色均匀分布时最后一个颜色对应的取值。

返回 每个取值对应一个颜色,按顺序排列。

源码

manimgx\drawing\paint.py

def colors_by_value(
    colorscale: Colorscale, values: Iterable[float], low: float, high: float
) -> list[ManimColor]:
    """色阶上各取值对应的颜色:在其两侧的颜色之间混合,在色阶两端之外保持不变。

    颜色按所有颜色混合的方式混合:在 OKLab 中,两色之间的颜色即人眼在其间所
    看到的颜色。

    Args:
        colorscale: 从 `low` 到 `high` 均匀分布的颜色,或 (color, value) 配对,
            每种颜色对应其取值,按取值递增排列。
        values: 待着色的取值。
        low: 当颜色均匀分布时第一个颜色对应的取值。
        high: 当颜色均匀分布时最后一个颜色对应的取值。

    Returns:
        每个取值对应一个颜色,按顺序排列。
    """
    rows = rgbas_by_value(colorscale, list(values), low, high)
    return [ManimColor(tuple(row)) for row in rows]

随机选取颜色

random_color

随机抽取的一个命名颜色。

由 Python 的 random 抽取,因此 random.seed 可使其可复现;若需独立流,参见 RandomColorGenerator。

m.random_color()

返回 命名颜色之一。

源码

manimgx\drawing\paint.py

def random_color() -> ManimColor:
    """随机抽取的一个命名颜色。

    由 Python 的 `random` 抽取,因此 `random.seed` 可使其可复现;若需独立流,参见
    [RandomColorGenerator][manimgx.RandomColorGenerator]。

    Returns:
        命名颜色之一。
    """
    return random.choice(list(PALETTE.values()))

random_bright_color

随机抽取的一个浅色:其红、绿、蓝各分量取值从 0.5 到 1。

由 NumPy 的全局生成器抽取,因此 np.random.seed 可使其可复现。

m.random_bright_color()

返回 一个新的不透明颜色。

源码

manimgx\drawing\paint.py

def random_bright_color() -> ManimColor:
    """随机抽取的一个浅色:其红、绿、蓝各分量取值从 0.5 到 1。

    由 NumPy 的全局生成器抽取,因此 `np.random.seed` 可使其可复现。

    Returns:
        一个新的不透明颜色。
    """
    return ManimColor(tuple(1.0 - 0.5 * np.random.random(3)))

RandomColorGenerator

RandomColorGeneratorExample
代码
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))

随机抽取的颜色流,相同种子得到相同流。

m.RandomColorGenerator(seed=None, sample_colors=None)
seed

种子;None 表示每次运行得到不同的流。

sample_colors

抽取范围;None(或无颜色)表示命名颜色。

源码

manimgx\drawing\paint.py

def __init__(
    self, seed: int | None = None, sample_colors: list[ManimColor] | None = None
) -> None:
    self.choice = random.Random(seed).choice
    self.colors = sample_colors or list(PALETTE.values())

next

流的下一个颜色:从其颜色中随机抽取的一个。

random_color_generator.next()
源码

manimgx\drawing\paint.py

def next(self) -> ManimColor:
    """流的下一个颜色:从其颜色中随机抽取的一个。"""
    return self.choice(self.colors)