跳转至

数轴

影片代码
import manimgx as m


class NumberLinesHero(m.Scene):
    def construct(self) -> None:
        line = m.NumberLine(x_range=[-3, 3, 1], length=10, include_numbers=True)
        dot = m.Dot(line.n2p(-2), radius=0.12, color=m.YELLOW)
        interval = m.UnitInterval(length=8, include_numbers=True).shift(2 * m.DOWN)
        self.play(m.Create(line))
        self.play(m.GrowFromCenter(dot))
        self.play(dot.animate.move_to(line.n2p(2.5)), run_time=2)
        self.play(m.Create(interval))
        self.wait()

数轴是一条在每个点处标有数字的直线。其范围 [start, end, step] 给出了首尾数字以及刻度之间的步长;其长度以帧的单位表示。n2p 将一个数字转换为该数字在数轴上的点,以便将任何对象放置在某个数字处。

坐标轴也是数轴:Axes 的每根轴都是一个数轴,并接受以下关键字参数。

NumberLine

NumberLineExample
代码
import manimgx as m


class NumberLineExample(m.Scene):
    def construct(self) -> None:
        lines = m.VGroup(
            m.NumberLine(x_range=[-5, 5, 1], length=12, include_numbers=True),
            m.NumberLine(
                x_range=[0, 2, 0.25],
                length=12,
                include_numbers=True,
                font_size=28,
                color=m.BLUE,
            ),
            m.NumberLine(
                x_range=[-10, 10, 2],
                length=12,
                numbers_with_elongated_ticks=[-10, 0, 10],
                include_tip=True,
                include_numbers=True,
                label_direction=m.UP,
                color=m.YELLOW,
            ),
        ).arrange(m.DOWN, buff=1)
        self.add(lines)

数轴:一条带有其范围每一步处刻度的直线,若要求则有数字,以及数字与点之间的映射;未设置样式时为白色,线宽 2。

其范围 [x_min, x_max, x_step] 从左端运行到右端:数轴长 length,以场景单位计,或每单位 unit_size,并居中于场景原点(然后旋转 rotation)。其刻度间距为 x_step,当范围包含 0 时从 0 开始计数(否则从 x_min 开始);末端的箭头取代最后一个刻度。 number_to_point 和 point_to_number 在数字与点之间转换;add_numbers 和 add_labels 在其上书写。scaling 以其他方式分布数字:使用 LogBase 时,范围为指数,数轴的数字为幂。

初始长度、旋转、箭头尺寸以及要绘制哪些刻度/数字是构造输入,而非保留的属性。数轴保留其绘图以及后续刻度和标签方法所用的默认值;要排除的数字和具有加长刻度的数字保留为数轴创建时的列表。

m.NumberLine(x_range=None, length=None, unit_size=1, include_ticks=True, tick_size=0.1, numbers_with_elongated_ticks=None, longer_tick_multiple=2, exclude_origin_tick=False, rotation=0, include_tip=False, tip_width=DEFAULT_ARROW_TIP_LENGTH, tip_height=DEFAULT_ARROW_TIP_LENGTH, tip_shape=None, include_numbers=False, font_size=36, label_direction=DOWN, label_constructor=MathTex, scaling=_AXIS_LINEAR, line_to_number_buff=MED_SMALL_BUFF, decimal_number_config=None, numbers_to_exclude=None, numbers_to_include=None, **kwargs)
x_range

范围,[x_min, x_max, x_step],或 [x_min, x_max] 表示步长为 1;None 表示 [-7, 7, 1]。

length

数轴的长度,以场景单位计;None 表示每单位 unit_size。

unit_size

当 length 为 None 时一个单位的长度,以场景单位计。

include_ticks

是否绘制刻度。

tick_size

每个刻度向数轴两侧延伸的距离,以场景单位计:其长度的一半。

numbers_with_elongated_ticks

刻度更长的数字;None 表示无。

longer_tick_multiple

那些刻度长多少倍。

exclude_origin_tick

是否省略 0 处的刻度。

rotation

数轴绕其中心旋转的角度,以弧度计,逆时针方向。

include_tip

数轴末端是否有箭头。

tip_width

箭头的宽度,以场景单位计。

tip_height

箭头沿数轴的长度,以场景单位计。

tip_shape

箭头的类;None 表示 ArrowTriangleFilledTip。

include_numbers

是否为刻度编号(参见 add_numbers)。

font_size

数字的字号。

label_direction

数字位于数轴的哪一侧,作为方向:DOWN 表示下方。

label_constructor

数字和标签的排版类: MathTex、MathTypst、…。

scaling

数字沿数轴如何分布:均匀分布,使用 LinearBase,或按对数分布,使用 LogBase(其数字随后写为幂)。

line_to_number_buff

数轴与其数字之间的间距,以场景单位计。

decimal_number_config

数字的 数字关键字;None 表示与 x_step 相同的小数位数。

numbers_to_exclude

刻度编号时不写的数字;None 表示无。

numbers_to_include

要写的数字,替代刻度的数字:给出时,即使没有 include_numbers 也会写它们。None 表示刻度的数字。

color

填充和描边共用的颜色(默认白色;Circle 的为 红色);None 表示类的默认值。

tip_length

add_tip 所生成尖端的长度,以场景单位计 (默认 0.35;Arrow 的可能更短)。

normal_vector

路径所在平面的法向量(默认 OUT)。为兼容 Manim 而接受;被忽略且不保留。

tip_style

路径所生成尖端的样式关键字(默认 None:无)。除非在此给出,否则尖端的 fill_color 和 stroke_color 取路径的颜色。

fill_color

填充的颜色;未给出时为 color。多个颜色沿 sheen_direction 构成渐变。

fill_opacity

填充的不透明度,取值从 0 到 1(默认 0:无填充)。

stroke_color

描边的颜色;未给出时为 color。多个颜色构成渐变。

stroke_opacity

描边的不透明度,取值从 0 到 1(默认 1)。

stroke_width

描边的宽度,以场景单位的百分之一计(默认 4;0:无描边)。

background_stroke_color

绘制于填充之后的轮廓颜色(默认黑色)。

background_stroke_opacity

轮廓的不透明度,取值从 0 到 1(默认 1)。

background_stroke_width

轮廓的宽度,以场景单位的百分之一计(默认 0:无)。

sheen_factor

颜色朝 sheen_direction 变亮的程度,取值从 -1 到 1(默认 0); 负值变暗。

sheen_direction

颜色变亮的方向(默认 UL)。

joint_type

描边在路径转折处的连接方式:圆角、斜切或斜接,按二维场景的绘制方式 (参见 LineJointType;默认 AUTO:斜接)。

cap_style

描边在其显示的每一端的端点样式(开放路径的端点、虚线的端点):圆头、平头 或方头,按二维场景的绘制方式(参见 CapStyleType;默认 AUTO:平头)。

shade_in_3d

三维场景的光是否对该 mobject 着色。

material

其表面在三维场景中如何反射场景的光(参见 Material);None:Manim 的着色(默认)。

name

mobject 的名称;未给出时为其类名。

z_index

其在绘制顺序中的位置:索引较高者绘制于较低者之上 (默认 0)。

target

MoveToTarget 将 mobject 移动至的状态。

还接受 箭头关键字。

源码

manimgx\mobjects\plotting.py

def __init__(
    self,
    x_range: Sequence[float] | None = None,
    length: float | None = None,
    unit_size: float = 1,
    include_ticks: bool = True,
    tick_size: float = 0.1,
    numbers_with_elongated_ticks: Iterable[float] | None = None,
    longer_tick_multiple: int = 2,
    exclude_origin_tick: bool = False,
    rotation: float = 0,
    include_tip: bool = False,
    tip_width: float = DEFAULT_ARROW_TIP_LENGTH,
    tip_height: float = DEFAULT_ARROW_TIP_LENGTH,
    tip_shape: type[ArrowTip] | None = None,
    include_numbers: bool = False,
    font_size: float = 36,
    label_direction: Vector3DLike = DOWN,
    label_constructor: type[ManimTextLabel] = MathTex,
    scaling: _ScaleBase = _AXIS_LINEAR,
    line_to_number_buff: float = MED_SMALL_BUFF,
    decimal_number_config: DecimalNumberOptions | None = None,
    numbers_to_exclude: Iterable[float] | None = None,
    numbers_to_include: Iterable[float] | None = None,
    **kwargs: Unpack[Tipped],
):
    # values, as they are given: what the line keeps is its own
    numbers_to_exclude = (
        [] if numbers_to_exclude is None else list(numbers_to_exclude)
    )
    numbers_with_elongated_ticks = (
        []
        if numbers_with_elongated_ticks is None
        else list(numbers_with_elongated_ticks)
    )
    if x_range is None:
        x_range = [
            round(-config.frame_x_radius),
            round(config.frame_x_radius),
            1,
        ]
    elif len(x_range) == 2:
        x_range = [*x_range, 1]
    if decimal_number_config is None:
        decimal_number_config = {
            "num_decimal_places": self._decimal_places_from_step(x_range[2])
        }
    self.x_range = np.array(x_range, dtype=float)
    """数轴的范围,`[x_min, x_max, x_step]`,按给出时的形式:在对数数轴上为指数。"""
    self.x_min: float
    """数轴起点的数字:其范围的第一个值,经刻度变换(对数数轴上从 0 开始的范围对应 10⁰ = 1)。"""
    self.x_max: float
    """数轴终点的数字:其范围的第二个值,经刻度变换。"""
    self.x_step: float
    """其范围的步长,经刻度变换。"""
    self.x_min, self.x_max, self.x_step = scaling.function(self.x_range)
    self.unit_size = unit_size
    """数轴创建时一个单位的长度,以场景单位计;参见 [get_unit_size][manimgx.NumberLine.get_unit_size] 了解其当前长度。"""
    self.tick_size = tick_size
    self.numbers_with_elongated_ticks = numbers_with_elongated_ticks
    self.longer_tick_multiple = longer_tick_multiple
    self.exclude_origin_tick = exclude_origin_tick
    self.include_tip = include_tip
    self.font_size = font_size
    self.label_direction = label_direction
    self.label_constructor = label_constructor
    self.line_to_number_buff = line_to_number_buff
    self.decimal_number_config = decimal_number_config
    self.numbers_to_exclude = numbers_to_exclude
    self.scaling = scaling
    """数轴的数字沿其如何分布。"""
    super().__init__(self.x_range[0] * RIGHT, self.x_range[1] * RIGHT, **kwargs)
    if length:
        self.set_length(length)
        self.unit_size = self.get_unit_size()
    else:
        self.scale(self.unit_size)
    self.center()
    if self.include_tip:
        self.add_tip(
            tip_length=tip_height,
            tip_width=tip_width,
            tip_shape=tip_shape,
        )
        self.tip.set_stroke(self.stroke_color, self.stroke_width)
    if include_ticks:
        self.add_ticks()
    self.rotate(rotation)
    if include_numbers or numbers_to_include is not None:
        if self.scaling.custom_labels:
            tick_range = self.get_tick_range()
            custom_labels = self.scaling.get_custom_labels(
                tick_range,
                unit_decimal_places=decimal_number_config.get(
                    "num_decimal_places", 0
                ),
            )
            self.add_labels(dict(zip(tick_range, custom_labels, strict=True)))
        else:
            self.add_numbers(
                x_values=numbers_to_include, excluding=self.numbers_to_exclude
            )

x_range

数轴的范围,[x_min, x_max, x_step],按给出时的形式:在对数数轴上为指数。

x_min

数轴起点的数字:其范围的第一个值,经刻度变换(对数数轴上从 0 开始的范围对应 10⁰ = 1)。

x_max

数轴终点的数字:其范围的第二个值,经刻度变换。

x_step

其范围的步长,经刻度变换。

unit_size

数轴创建时一个单位的长度,以场景单位计;参见 get_unit_size 了解其当前长度。

scaling

数轴的数字沿其如何分布。

rotate_about_zero

将数轴绕其数字 0 的点旋转。

number_line.rotate_about_zero(angle, axis=OUT)
angle

角度,以弧度计,绕 axis 逆时针方向。

axis

旋转的轴:OUT 使其在屏幕平面内旋转。

源码

manimgx\mobjects\plotting.py

def rotate_about_zero(self, angle: float, axis: Vector3DLike = OUT) -> Self:
    """将数轴绕其数字 0 的点旋转。

    Args:
        angle: 角度,以弧度计,绕 `axis` 逆时针方向。
        axis: 旋转的轴:OUT 使其在屏幕平面内旋转。
    """
    return self.rotate_about_number(0, angle, axis)

rotate_about_number

将数轴绕其某个数字的点旋转。

number_line.rotate_about_number(number, angle, axis=OUT)
number

其点保持不变的数字。

angle

角度,以弧度计,绕 axis 逆时针方向。

axis

旋转的轴:OUT 使其在屏幕平面内旋转。

源码

manimgx\mobjects\plotting.py

def rotate_about_number(
    self, number: float, angle: float, axis: Vector3DLike = OUT
) -> Self:
    """将数轴绕其某个数字的点旋转。

    Args:
        number: 其点保持不变的数字。
        angle: 角度,以弧度计,绕 `axis` 逆时针方向。
        axis: 旋转的轴:OUT 使其在屏幕平面内旋转。
    """
    return self.rotate(angle, axis, about_point=self.n2p(number))

number_to_point

代码
import manimgx as m


class NumberLineNumberToPointExample(m.Scene):
    def construct(self) -> None:
        line = m.NumberLine(
            x_range=[-4, 4, 1], length=12, include_numbers=True
        )
        dot = m.Dot(line.n2p(-3), radius=0.15, color=m.YELLOW)
        self.add(line, dot)
        self.play(dot.animate.move_to(line.n2p(2.5)))

将数字转换为其在数轴上的点,或将数字转换为其点。

范围外的数字位于数轴向两端延伸的部分。

number_line.number_to_point(number)
number

数字;或任意形状的数字数组。

返回 点,在场景坐标系中;对于数组,为点,坐标在最后(数组的形状,然后 3)。

源码

manimgx\mobjects\plotting.py

def number_to_point(self, number: float | np.ndarray) -> np.ndarray:
    """将数字转换为其在数轴上的点,或将数字转换为其点。

    范围外的数字位于数轴向两端延伸的部分。

    Args:
        number: 数字;或任意形状的数字数组。

    Returns:
        点,在场景坐标系中;对于数组,为点,坐标在最后(数组的形状,然后 3)。

    Examples:
        ```python
        import manimgx as m


        class NumberLineNumberToPointExample(m.Scene):
            def construct(self) -> None:
                line = m.NumberLine(
                    x_range=[-4, 4, 1], length=12, include_numbers=True
                )
                dot = m.Dot(line.n2p(-3), radius=0.15, color=m.YELLOW)
                self.add(line, dot)
                self.play(dot.animate.move_to(line.n2p(2.5)))
        ```
    """
    number = self.scaling.inverse_function(np.asarray(number, dtype=float))
    alphas = (number - self.x_range[0]) / (self.x_range[1] - self.x_range[0])
    start, end = self.get_start(), self.get_end()
    a = np.asarray(alphas)[..., None]
    return (1 - a) * start + a * end

point_to_number

将点转换为其在数轴上投影处的数字:对于数轴上的点,是 number_to_point 的反函数。

number_line.point_to_number(point)
point

点,在场景坐标系中。

源码

manimgx\mobjects\plotting.py

def point_to_number(self, point: Point3DLike) -> float:
    """将点转换为其在数轴上投影处的数字:对于数轴上的点,是 [number_to_point][manimgx.NumberLine.number_to_point] 的反函数。

    Args:
        point: 点,在场景坐标系中。
    """
    point = np.asarray(point, dtype=float)
    start, end = self.get_start(), self.get_end()
    unit_vect = normalize(end - start)
    proportion: float = np.dot(point - start, unit_vect) / np.dot(
        end - start, unit_vect
    )
    # along the range, then through the scale, as number_to_point goes back
    return self.scaling.function(
        interpolate(self.x_range[0], self.x_range[1], proportion)
    )

n2p

将数字转换为其在数轴上的点:number_to_point 的简写名。

number_line.n2p(number)
number

数字;或任意形状的数字数组。

返回 点,在场景坐标系中;或点。

源码

manimgx\mobjects\plotting.py

def n2p(self, number: float | np.ndarray) -> Point3D:
    """将数字转换为其在数轴上的点:[number_to_point][manimgx.NumberLine.number_to_point] 的简写名。

    Args:
        number: 数字;或任意形状的数字数组。

    Returns:
        点,在场景坐标系中;或点。
    """
    return self.number_to_point(number)

get_unit_size

数轴一个单位的长度:其长度除以其范围。

number_line.get_unit_size()

返回 长度,以场景单位计(对数数轴上为指数单位的长度)。

源码

manimgx\mobjects\plotting.py

def get_unit_size(self) -> float:
    """数轴一个单位的长度:其长度除以其范围。

    Returns:
        长度,以场景单位计(对数数轴上为指数单位的长度)。
    """
    val: float = self.get_length() / (self.x_range[1] - self.x_range[0])
    return val

get_unit_vector

数轴的方向,一个单位长:从其起点指向终点的向量,长度为数轴创建时的单位(其 unit_size)。

number_line.get_unit_vector()

返回 向量,以场景单位计。

源码

manimgx\mobjects\plotting.py

def get_unit_vector(self) -> Vector3D:
    """数轴的方向,一个单位长:从其起点指向终点的向量,长度为数轴创建时的单位(其 `unit_size`)。

    Returns:
        向量,以场景单位计。
    """
    return super().get_unit_vector() * self.unit_size

get_number_mobject

制作一个数字,写在其数轴上的点旁。

它是一个 DecimalNumber,采用数轴的数字样式(其 decimal_number_config 和 font_size),并用 number_config 覆盖。直接写在数轴下方或上方的负数会被移位,使其数字而非负号居中于该点。

number_line.get_number_mobject(x, direction=None, buff=None, label_constructor=None, **number_config)
x

数字。

direction

数字位于数轴的哪一侧;None 表示数轴的 label_direction。

buff

数轴与数字之间的间距,以场景单位计;None 表示数轴的 line_to_number_buff。

label_constructor

其排版类;None 表示数轴的。

num_decimal_places

小数点后跟随的数字位数(默认为 2)。

mob_class

每个字符排版所用的类(默认为 MathTex)。

include_sign

非负数是否带加号书写(默认为 False)。

group_with_commas

小数点前的数字是否按三位一组用逗号分组,如 12,345(默认为 True)。

digit_buff_per_font_unit

字符之间的间距,按字体大小单位计:默认值 0.001 在字体大小 48 时为 0.048 个场景单位。

show_ellipsis

数字后是否跟"…",用于表示持续变化的值(默认为 False)。

unit

数字后的单位,以 LaTeX 数学表示:"^\circ" 表示度,r"\text{ m}" 表示米; 以 "^" 开头的单位会提升到数字的顶部(默认为 None)。

unit_buff_per_font_unit

单位前的间距,超出字符间距之外的部分,按字体大小单位计(默认为 0)。

include_background_rectangle

数字后是否有背景矩形(默认为 False)。

edge_to_fix

当新值改变数字宽度时保持不动的边缘,以方向表示(默认为 LEFT:向右生长)。

font_size

字符的字体大小,以 mob_class 的度量方式计(默认为 48)。

color

填充与描边共用的颜色(默认白色);None 表示该类的默认值。

fill_color

填充的颜色;未给出时为 color。多个颜色沿 sheen_direction 构成渐变。

fill_opacity

填充的不透明度,取值从 0 到 1(默认 0:无填充)。

stroke_color

描边的颜色;未给出时为 color。多个颜色构成渐变。

stroke_opacity

描边的不透明度,取值从 0 到 1(默认 1)。

stroke_width

描边的宽度,以场景单位的百分之一计(默认 4;0:无描边)。

background_stroke_color

绘制于填充之后的轮廓颜色(默认黑色)。

background_stroke_opacity

轮廓的不透明度,取值从 0 到 1(默认 1)。

background_stroke_width

轮廓的宽度,以场景单位的百分之一计(默认 0:无)。

sheen_factor

颜色朝 sheen_direction 变亮的程度,取值从 -1 到 1(默认 0); 负值变暗。

sheen_direction

颜色变亮的方向(默认 UL)。

joint_type

描边在路径转折处的连接方式:圆角、斜切或斜接,按二维场景的绘制方式 (参见 LineJointType;默认 AUTO:斜接)。

cap_style

描边在其显示的每一端的端点样式(开放路径的端点、虚线的端点):圆头、平头 或方头,按二维场景的绘制方式(参见 CapStyleType;默认 AUTO:平头)。

shade_in_3d

三维场景的光是否对该 mobject 着色。

material

其表面在三维场景中如何反射场景的光(参见 Material);None:Manim 的着色(默认)。

name

mobject 的名称;未给出时为其类名。

z_index

其在绘制顺序中的位置:索引较高者绘制于较低者之上 (默认 0)。

target

MoveToTarget 将 mobject 移动至的状态。

返回 一个新的数字,未添加到数轴。

源码

manimgx\mobjects\plotting.py

def get_number_mobject(
    self,
    x: float,
    direction: Vector3DLike | None = None,
    buff: float | None = None,
    label_constructor: type[ManimTextLabel] | None = None,
    **number_config: Unpack[DecimalNumberOptions],
) -> VMobject:
    """制作一个数字,写在其数轴上的点旁。

    它是一个 [DecimalNumber][manimgx.DecimalNumber],采用数轴的数字样式(其 `decimal_number_config` 和 `font_size`),并用 `number_config` 覆盖。直接写在数轴下方或上方的负数会被移位,使其数字而非负号居中于该点。

    Args:
        x: 数字。
        direction: 数字位于数轴的哪一侧;None 表示数轴的 `label_direction`。
        buff: 数轴与数字之间的间距,以场景单位计;None 表示数轴的 `line_to_number_buff`。
        label_constructor: 其排版类;None 表示数轴的。
        **number_config: [数字关键字][manimgx.DecimalNumber],覆盖数轴的。

    Returns:
        一个新的数字,未添加到数轴。
    """
    options = self.decimal_number_config | number_config
    options.setdefault("font_size", self.font_size)
    options["mob_class"] = label_constructor or self.label_constructor
    num_mob = DecimalNumber(x, **options)
    num_mob.next_to(
        self.number_to_point(x),
        direction=self.label_direction if direction is None else direction,
        buff=self.line_to_number_buff if buff is None else buff,
    )
    if x < 0 and self.label_direction[0] == 0:
        num_mob.shift(num_mob[0].width * LEFT / 2)
    return num_mob

add_numbers

NumberLineAddNumbersExample
代码
import manimgx as m


class NumberLineAddNumbersExample(m.Scene):
    def construct(self) -> None:
        ticks = m.NumberLine(x_range=[0, 10, 1], length=12).add_numbers()
        chosen = m.NumberLine(x_range=[0, 10, 1], length=12, color=m.BLUE)
        chosen.add_numbers(
            [0, 2.5, 5, 7.5, 10], num_decimal_places=1, color=m.BLUE
        )
        self.add(m.VGroup(ticks, chosen).arrange(m.DOWN, buff=1.5))

为数轴编号:在给定值的点旁写数字,或在其刻度处写。

每个数字按 get_number_mobject 的书写方式书写。数字是一个组,添加到数轴,并保留为其 numbers。

number_line.add_numbers(x_values=None, excluding=None, label_constructor=None, **kwargs)
x_values

要写的数字;None 表示刻度的数字。

excluding

不写的数字;None 表示数轴的 numbers_to_exclude。

label_constructor

它们的排版类;None 表示数轴的。

num_decimal_places

小数点后跟随的数字位数(默认为 2)。

mob_class

每个字符排版所用的类(默认为 MathTex)。

include_sign

非负数是否带加号书写(默认为 False)。

group_with_commas

小数点前的数字是否按三位一组用逗号分组,如 12,345(默认为 True)。

digit_buff_per_font_unit

字符之间的间距,按字体大小单位计:默认值 0.001 在字体大小 48 时为 0.048 个场景单位。

show_ellipsis

数字后是否跟"…",用于表示持续变化的值(默认为 False)。

unit

数字后的单位,以 LaTeX 数学表示:"^\circ" 表示度,r"\text{ m}" 表示米; 以 "^" 开头的单位会提升到数字的顶部(默认为 None)。

unit_buff_per_font_unit

单位前的间距,超出字符间距之外的部分,按字体大小单位计(默认为 0)。

include_background_rectangle

数字后是否有背景矩形(默认为 False)。

edge_to_fix

当新值改变数字宽度时保持不动的边缘,以方向表示(默认为 LEFT:向右生长)。

font_size

字符的字体大小,以 mob_class 的度量方式计(默认为 48)。

color

填充与描边共用的颜色(默认白色);None 表示该类的默认值。

fill_color

填充的颜色;未给出时为 color。多个颜色沿 sheen_direction 构成渐变。

fill_opacity

填充的不透明度,取值从 0 到 1(默认 0:无填充)。

stroke_color

描边的颜色;未给出时为 color。多个颜色构成渐变。

stroke_opacity

描边的不透明度,取值从 0 到 1(默认 1)。

stroke_width

描边的宽度,以场景单位的百分之一计(默认 4;0:无描边)。

background_stroke_color

绘制于填充之后的轮廓颜色(默认黑色)。

background_stroke_opacity

轮廓的不透明度,取值从 0 到 1(默认 1)。

background_stroke_width

轮廓的宽度,以场景单位的百分之一计(默认 0:无)。

sheen_factor

颜色朝 sheen_direction 变亮的程度,取值从 -1 到 1(默认 0); 负值变暗。

sheen_direction

颜色变亮的方向(默认 UL)。

joint_type

描边在路径转折处的连接方式:圆角、斜切或斜接,按二维场景的绘制方式 (参见 LineJointType;默认 AUTO:斜接)。

cap_style

描边在其显示的每一端的端点样式(开放路径的端点、虚线的端点):圆头、平头 或方头,按二维场景的绘制方式(参见 CapStyleType;默认 AUTO:平头)。

shade_in_3d

三维场景的光是否对该 mobject 着色。

material

其表面在三维场景中如何反射场景的光(参见 Material);None:Manim 的着色(默认)。

name

mobject 的名称;未给出时为其类名。

z_index

其在绘制顺序中的位置:索引较高者绘制于较低者之上 (默认 0)。

target

MoveToTarget 将 mobject 移动至的状态。

源码

manimgx\mobjects\plotting.py

def add_numbers(
    self,
    x_values: Iterable[float] | None = None,
    excluding: Iterable[float] | None = None,
    label_constructor: type[ManimTextLabel] | None = None,
    **kwargs: Unpack[DecimalNumberOptions],
) -> Self:
    """为数轴编号:在给定值的点旁写数字,或在其刻度处写。

    每个数字按 [get_number_mobject][manimgx.NumberLine.get_number_mobject] 的书写方式书写。数字是一个组,添加到数轴,并保留为其 `numbers`。

    Args:
        x_values: 要写的数字;None 表示刻度的数字。
        excluding: 不写的数字;None 表示数轴的 `numbers_to_exclude`。
        label_constructor: 它们的排版类;None 表示数轴的。
        **kwargs: [数字关键字][manimgx.DecimalNumber],覆盖数轴的:`font_size`、`num_decimal_places`、`color`、…。

    Examples:
        ```python
        import manimgx as m


        class NumberLineAddNumbersExample(m.Scene):
            def construct(self) -> None:
                ticks = m.NumberLine(x_range=[0, 10, 1], length=12).add_numbers()
                chosen = m.NumberLine(x_range=[0, 10, 1], length=12, color=m.BLUE)
                chosen.add_numbers(
                    [0, 2.5, 5, 7.5, 10], num_decimal_places=1, color=m.BLUE
                )
                self.add(m.VGroup(ticks, chosen).arrange(m.DOWN, buff=1.5))
        ```
    """
    if x_values is None:
        x_values = self.get_tick_range()
    excluded = list(self.numbers_to_exclude if excluding is None else excluding)
    numbers = VGroup()
    for x in x_values:
        if x in excluded:
            continue
        numbers.add(
            self.get_number_mobject(
                x, label_constructor=label_constructor, **kwargs
            )
        )
    self.add(numbers)
    self.numbers = numbers
    return self

add_labels

NumberLineAddLabelsExample
代码
import manimgx as m


class NumberLineAddLabelsExample(m.Scene):
    def construct(self) -> None:
        line = m.NumberLine(x_range=[0, m.TAU, m.PI / 2], length=12)
        line.add_labels(
            {
                0: "0",
                m.PI / 2: m.MathTex(r"\frac{\pi}{2}"),
                m.PI: m.MathTex(r"\pi"),
                3 * m.PI / 2: m.MathTex(r"\frac{3\pi}{2}"),
                m.TAU: m.MathTex(r"2\pi"),
            },
            font_size=44,
        )
        self.add(line)

为数轴加标签:将每个标签放在其数字的点旁。

字符串在构造函数为 MathTex(默认情况)时用 Tex 排版为文本,否则用构造函数排版;数字用构造函数书写。mobject 按原样使用,且必须是已排版的(一个 Typst mobject:Text、Tex、MathTex、…)或一个 DecimalNumber:其他会引发异常。每个标签设置为 font_size。标签是一个组,添加到数轴,并保留为其 labels。

number_line.add_labels(dict_values, direction=None, buff=None, font_size=None, label_constructor=None)
dict_values

标签,按数字。

direction

标签位于数轴的哪一侧,作为方向;None 表示数轴的 label_direction。

buff

数轴与标签之间的间距,以场景单位计;None 表示数轴的 line_to_number_buff。

font_size

标签的字号;None 表示数轴的。

label_constructor

字符串和数字的排版类;None 表示数轴的。

源码

manimgx\mobjects\plotting.py

def add_labels(
    self,
    dict_values: Mapping[float, Label],
    direction: Point3DLike | None = None,
    buff: float | None = None,
    font_size: float | None = None,
    label_constructor: type[ManimTextLabel] | None = None,
) -> Self:
    r"""为数轴加标签:将每个标签放在其数字的点旁。

    字符串在构造函数为 [MathTex][manimgx.MathTex](默认情况)时用 [Tex][manimgx.Tex] 排版为文本,否则用构造函数排版;数字用构造函数书写。mobject 按原样使用,且必须是已排版的(一个 [Typst][manimgx.Typst] mobject:[Text][manimgx.Text]、[Tex][manimgx.Tex]、[MathTex][manimgx.MathTex]、…)或一个 [DecimalNumber][manimgx.DecimalNumber]:其他会引发异常。每个标签设置为 `font_size`。标签是一个组,添加到数轴,并保留为其 `labels`。

    Args:
        dict_values: 标签,按数字。
        direction: 标签位于数轴的哪一侧,作为方向;None 表示数轴的 `label_direction`。
        buff: 数轴与标签之间的间距,以场景单位计;None 表示数轴的 `line_to_number_buff`。
        font_size: 标签的字号;None 表示数轴的。
        label_constructor: 字符串和数字的排版类;None 表示数轴的。

    Examples:
        ```python
        import manimgx as m


        class NumberLineAddLabelsExample(m.Scene):
            def construct(self) -> None:
                line = m.NumberLine(x_range=[0, m.TAU, m.PI / 2], length=12)
                line.add_labels(
                    {
                        0: "0",
                        m.PI / 2: m.MathTex(r"\frac{\pi}{2}"),
                        m.PI: m.MathTex(r"\pi"),
                        3 * m.PI / 2: m.MathTex(r"\frac{3\pi}{2}"),
                        m.TAU: m.MathTex(r"2\pi"),
                    },
                    font_size=44,
                )
                self.add(line)
        ```
    """
    direction = self.label_direction if direction is None else direction
    buff = self.line_to_number_buff if buff is None else buff
    font_size = self.font_size if font_size is None else font_size
    if label_constructor is None:
        label_constructor = self.label_constructor
    labels = VGroup()
    for x, label in dict_values.items():
        if isinstance(label, str):
            if label_constructor is MathTex:
                label = Tex(label)
            else:
                label = self._create_label_tex(label, label_constructor)
        else:
            label = self._create_label_tex(label, label_constructor)
        if not isinstance(
            label, (Typst, DecimalNumber)
        ):  # its type size can be set
            raise AttributeError(f"{label} is not compatible with add_labels.")
        label.font_size = font_size
        label.next_to(self.number_to_point(x), direction=direction, buff=buff)
        labels.add(label)
    self.labels = labels
    self.add(labels)
    return self

UnitInterval

代码
import manimgx as m


class UnitIntervalExample(m.Scene):
    def construct(self) -> None:
        interval = m.UnitInterval(include_numbers=True, font_size=28)
        dot = m.Dot(interval.n2p(0.25), radius=0.12, color=m.YELLOW)
        self.add(interval, dot)
        self.play(dot.animate.move_to(interval.n2p(0.8)))

单位区间:从 0 到 1 的数轴,每十分之一处有一个刻度;长 10 个单位,其 0 和 1 处的刻度更长,除非另有说明。

其数字(若有)有一位小数。

m.UnitInterval(**kwargs)
length

数轴的长度,以场景单位计(默认 None:每单位 unit_size)。

unit_size

未给出 length 时一个单位的长度,以场景单位计(默认 1)。

include_ticks

是否绘制刻度(默认 True)。

tick_size

每个刻度向数轴两侧延伸的距离,以场景单位计:其长度的一半(默认 0.1)。

numbers_with_elongated_ticks

刻度更长的数字(默认 None:无)。

longer_tick_multiple

那些刻度长多少倍(默认 2)。

exclude_origin_tick

是否省略 0 处的刻度(默认 False;Axes 的坐标轴在线性时会省略它,因为另一坐标轴在此处穿过)。

rotation

数轴绕其中心旋转的角度,以弧度计,逆时针方向(默认 0;y 轴的为四分之一圈)。

include_tip

数轴末端是否有箭头(默认 False;坐标轴的箭头会有,除非 tips=False)。

tip_width

箭头的宽度,以场景单位计(默认 0.35)。

tip_height

箭头沿数轴的长度,以场景单位计(默认 0.35)。

tip_shape

箭头的类(默认 None:ArrowTriangleFilledTip)。

include_numbers

是否为刻度编号(默认 False)。

font_size

数字的字号(默认 36)。

label_direction

数字位于数轴的哪一侧,作为方向(默认 DOWN:下方;y 轴的数字在其左侧)。

label_constructor

数字和标签的排版类(默认 MathTex)。

scaling

数字沿数轴如何分布:均匀分布,使用 LinearBase,或按对数分布,使用 LogBase(默认 LinearBase())。

line_to_number_buff

数轴与其数字之间的间距,以场景单位计(默认 0.25)。

decimal_number_config

数字的 数字关键字(默认 None:与范围步长相同的小数位数)。

numbers_to_exclude

刻度编号时不写的数字(默认 None:无;坐标轴的省略 0)。

numbers_to_include

要写的数字,替代刻度的数字:给出时,即使没有 include_numbers 也会写它们(默认 None:刻度的数字)。

color

填充和描边共用的颜色(默认白色;Circle 的为 红色);None 表示类的默认值。

tip_length

add_tip 所生成尖端的长度,以场景单位计 (默认 0.35;Arrow 的可能更短)。

normal_vector

路径所在平面的法向量(默认 OUT)。为兼容 Manim 而接受;被忽略且不保留。

tip_style

路径所生成尖端的样式关键字(默认 None:无)。除非在此给出,否则尖端的 fill_color 和 stroke_color 取路径的颜色。

fill_color

填充的颜色;未给出时为 color。多个颜色沿 sheen_direction 构成渐变。

fill_opacity

填充的不透明度,取值从 0 到 1(默认 0:无填充)。

stroke_color

描边的颜色;未给出时为 color。多个颜色构成渐变。

stroke_opacity

描边的不透明度,取值从 0 到 1(默认 1)。

stroke_width

描边的宽度,以场景单位的百分之一计(默认 4;0:无描边)。

background_stroke_color

绘制于填充之后的轮廓颜色(默认黑色)。

background_stroke_opacity

轮廓的不透明度,取值从 0 到 1(默认 1)。

background_stroke_width

轮廓的宽度,以场景单位的百分之一计(默认 0:无)。

sheen_factor

颜色朝 sheen_direction 变亮的程度,取值从 -1 到 1(默认 0); 负值变暗。

sheen_direction

颜色变亮的方向(默认 UL)。

joint_type

描边在路径转折处的连接方式:圆角、斜切或斜接,按二维场景的绘制方式 (参见 LineJointType;默认 AUTO:斜接)。

cap_style

描边在其显示的每一端的端点样式(开放路径的端点、虚线的端点):圆头、平头 或方头,按二维场景的绘制方式(参见 CapStyleType;默认 AUTO:平头)。

shade_in_3d

三维场景的光是否对该 mobject 着色。

material

其表面在三维场景中如何反射场景的光(参见 Material);None:Manim 的着色(默认)。

name

mobject 的名称;未给出时为其类名。

z_index

其在绘制顺序中的位置:索引较高者绘制于较低者之上 (默认 0)。

target

MoveToTarget 将 mobject 移动至的状态。

源码

manimgx\mobjects\plotting.py

def __init__(self, **kwargs: Unpack[NumberLineOptions]):
    kwargs.setdefault("unit_size", 10)
    kwargs.setdefault("numbers_with_elongated_ticks", [0, 1])
    kwargs.setdefault("decimal_number_config", {"num_decimal_places": 1})
    super().__init__(x_range=(0, 1, 0.1), **kwargs)

刻度

数轴的刻度决定其数字的放置方式:均匀放置,或按对数放置。通过 scaling 指定。

LinearBase

LinearBaseExample
代码
import manimgx as m


class LinearBaseExample(m.Scene):
    def construct(self) -> None:
        plain = m.NumberLine(
            x_range=[-3, 3, 1], length=10, include_numbers=True
        )
        doubled = m.NumberLine(
            x_range=[-3, 3, 1],
            length=10,
            include_numbers=True,
            scaling=m.LinearBase(scale_factor=2),
            color=m.BLUE,
        )
        self.add(m.VGroup(plain, doubled).arrange(m.DOWN, buff=1.5))

数轴的均匀刻度:数字沿数轴均匀排列,即其范围的数字乘以 scale_factor。

它是数轴的默认刻度,当因子为 1 时,其数字即为范围的数字。使用其他因子时,数轴保持其长度和刻度不变,而其数字被乘以该因子:使用 2 时,范围 [-2, 2, 1] 从 -4 到 4 以步长 2 编号,且 n2p 将 4 放在其末端。将其作为数轴的 scaling,或在坐标轴配置中作为坐标轴的 scaling。

m.LinearBase(scale_factor=1.0)
scale_factor

从范围的数字到数轴数字的因子。

源码

manimgx\mobjects\plotting.py

def __init__(self, scale_factor: float = 1.0):
    super().__init__()
    self.scale_factor = scale_factor
    """从范围的数字到数轴数字的因子。"""

scale_factor

从范围的数字到数轴数字的因子。

function

坐标轴的值在其范围某值处的数字:在对数坐标轴上,2 对应 10²。

linear_base.function(value)
value

范围的值;或值的数组。

返回 数字;或数字,即相同形状的数组。

源码

manimgx\mobjects\plotting.py

def function(self, value: float | np.ndarray) -> float | np.ndarray:
    """坐标轴的值在其范围某值处的数字:在对数坐标轴上,2 对应 10²。

    Args:
        value: 范围的值;或值的数组。

    Returns:
        数字;或数字,即相同形状的数组。
    """
    return self._function(value)

inverse_function

坐标轴的范围在其某个数字处的值:在对数坐标轴上,100 对应 2;即 function 的反函数。

linear_base.inverse_function(value)
value

数字;或数字的数组。

返回 范围的值;或范围的值,即相同形状的数组。

源码

manimgx\mobjects\plotting.py

def inverse_function(self, value: float | np.ndarray) -> float | np.ndarray:
    """坐标轴的范围在其某个数字处的值:在对数坐标轴上,100 对应 2;即 `function` 的反函数。

    Args:
        value: 数字;或数字的数组。

    Returns:
        范围的值;或范围的值,即相同形状的数组。
    """
    return self._inverse_function(value)

LogBase

LogBaseExample
代码
import manimgx as m


class LogBaseExample(m.Scene):
    def construct(self) -> None:
        ax = m.Axes(
            x_range=[0, 10, 1],
            y_range=[-2, 6, 1],
            x_length=11,
            y_length=6.5,
            tips=False,
            axis_config={"include_numbers": True, "font_size": 28},
            y_axis_config={"scaling": m.LogBase()},
        )
        exponential = ax.plot(lambda x: 0.01 * 10 ** (0.8 * x), color=m.BLUE)
        square = ax.plot(lambda x: x**2, x_range=[0.1, 10], color=m.YELLOW)
        self.add(ax, exponential, square)

数轴的对数刻度:其范围为指数,其数字为 base 的幂,按其对数间隔排列。

以 10 为底时,范围 [0, 3, 1] 从 1 运行到 1000,每个 10 的幂处有一个刻度,且 n2p 将 100 放在沿数轴三分之二的位置。其数字均为正数:0 和负数在它上面没有位置。将其作为数轴的 scaling,或在坐标轴配置中作为坐标轴的 scaling;然后 plot 在幂上对函数采样,且 add_coordinates 将坐标轴的数字写为幂。

m.LogBase(base=10, custom_labels=True)
base

幂的底数。

custom_labels

数轴的数字是否写为幂(10²、10³、…),而非小数。

源码

manimgx\mobjects\plotting.py

def __init__(self, base: float = 10, custom_labels: bool = True):
    super().__init__()
    self.base = base
    """幂的底数。"""
    self.custom_labels = custom_labels
    """数轴的数字是否写为底数的幂。"""

base

幂的底数。

custom_labels

数轴的数字是否写为底数的幂。

function

坐标轴的值在其范围某值处的数字:在对数坐标轴上,2 对应 10²。

log_base.function(value)
value

范围的值;或值的数组。

返回 数字;或数字,即相同形状的数组。

源码

manimgx\mobjects\plotting.py

def function(self, value: float | np.ndarray) -> float | np.ndarray:
    """坐标轴的值在其范围某值处的数字:在对数坐标轴上,2 对应 10²。

    Args:
        value: 范围的值;或值的数组。

    Returns:
        数字;或数字,即相同形状的数组。
    """
    return self._function(value)

inverse_function

坐标轴的范围在其某个数字处的值:在对数坐标轴上,100 对应 2;即 function 的反函数。

log_base.inverse_function(value)
value

数字;或数字的数组。

返回 范围的值;或范围的值,即相同形状的数组。

源码

manimgx\mobjects\plotting.py

def inverse_function(self, value: float | np.ndarray) -> float | np.ndarray:
    """坐标轴的范围在其某个数字处的值:在对数坐标轴上,100 对应 2;即 `function` 的反函数。

    Args:
        value: 数字;或数字的数组。

    Returns:
        范围的值;或范围的值,即相同形状的数组。
    """
    return self._inverse_function(value)