跳转至

平面

影片代码
import manimgx as m


class PlanesHero(m.Scene):
    def construct(self) -> None:
        plane = m.ComplexPlane().add_coordinates()
        z = m.Dot(plane.n2p(2 + 1j), color=m.YELLOW)
        label = m.MathTex("2 + i", color=m.YELLOW).next_to(z, m.UR, buff=0.1)
        self.play(m.Create(plane, run_time=2))
        self.play(m.GrowFromCenter(z), m.Write(label))
        self.play(plane.animate.apply_complex_function(lambda w: w**2 / 4), run_time=3)
        self.wait()

平面是带有网格的坐标轴:每根轴的每个步长处都有一条线。除非你指定其尺寸,否则数平面会填满帧,并使用帧自身的坐标系,使得平面上的点就是帧上的点:它是用于查看位置的网格。复平面将其点读取为复数,极坐标平面则围绕其中心绘制圆并从中心向外绘制射线。

平面会与其上的所有内容一起弯曲:先插入更多曲线(prepare_for_nonlinear_transform),其线条便会平滑地弯曲。

NumberPlane

NumberPlaneExample
代码
import manimgx as m


class NumberPlaneExample(m.Scene):
    def construct(self) -> None:
        plane = m.NumberPlane(
            x_range=[-6.5, 6.5, 1],
            y_range=[-4, 4, 1],
            faded_line_ratio=2,
            background_line_style={"stroke_color": m.TEAL},
        )
        arrow = m.Arrow(plane.c2p(0, 0), plane.c2p(3, 2), buff=0)
        self.add(plane.add_coordinates(), arrow.set_color(m.YELLOW))

数平面:网格上的坐标轴,每个坐标轴范围的每一步处有一条线;填满画框,带场景自身的坐标,除非设定尺寸。

网格的线为蓝色(BLUE_D)且宽 2;faded_line_ratio 大于 1 时,较暗线将每个步长进一步划分,除非设置样式,否则宽度和不透明度减半。线绘制在坐标轴之后,坐标轴为白色,宽 2,无刻度或箭头;其数字(书写时)很小(字号 24),在其点的下方和右侧。默认情况下范围跨越画框,每单位一个场景单位,因此平面的坐标即场景的坐标。Axes 能做的一切,平面也能做:转换坐标、绘图、标注。

背景样式和较暗线比例是构造输入;平面保留其绘制的网格而非那些设置属性。

m.NumberPlane(x_range=None, y_range=None, x_length=None, y_length=None, background_line_style=None, faded_line_style=None, faded_line_ratio=1, **kwargs)
x_range

x 轴的范围,[x_min, x_max, x_step]:网格在每个步长处有一条垂直线。None 表示平面创建时画框的宽度,步长 1。

y_range

y 轴的范围,[y_min, y_max, y_step]:网格在每个步长处有一条水平线。None 表示平面创建时画框的高度,步长 1。

x_length

x 轴的长度,以场景单位计;None 表示每单位一个场景单位。

y_length

y 轴的长度,以场景单位计;None 表示每单位一个场景单位。

background_line_style

网格线的 样式关键字,覆盖其默认值;None 表示无。

faded_line_style

较暗线的 样式关键字;None 表示网格线的样式,宽度和不透明度减半。

faded_line_ratio

较暗线将网格的每个步长分成多少部分:1 表示无较暗线,2 表示每两条网格线之间有一条。

axis_config

每个坐标轴的 数轴关键字:include_numbers、font_size、color、…(默认 None:无)。

x_axis_config

x 轴的数轴关键字,覆盖 axis_config 的(默认 None:无)。

y_axis_config

y 轴的数轴关键字,覆盖 axis_config 的(默认 None:无)。

tips

每个坐标轴末端是否有箭头(默认 True;平面的坐标轴无箭头,除非 axis_config 包含 include_tip)。

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 __init__(
    self,
    x_range: Sequence[float] | None = None,
    y_range: Sequence[float] | None = None,
    x_length: float | None = None,
    y_length: float | None = None,
    background_line_style: Style | None = None,
    faded_line_style: Style | None = None,
    faded_line_ratio: int = 1,
    **kwargs: Unpack[AxesOptions],
):
    kwargs["axis_config"] = merged_axis_config(
        {
            "stroke_width": 2,
            "include_ticks": False,
            "include_tip": False,
            "line_to_number_buff": SMALL_BUFF,
            "label_direction": DR,
            "font_size": 24,
        },
        kwargs.get("axis_config"),
    )
    kwargs["y_axis_config"] = merged_axis_config(
        {"label_direction": DR}, kwargs.get("y_axis_config")
    )
    # the frame as it is now: a tall video's (9:16) is taller than a wide one's
    if x_range is None:
        x_range = (-config.frame_x_radius, config.frame_x_radius, 1)
    if y_range is None:
        y_range = (-config.frame_y_radius, config.frame_y_radius, 1)
    super().__init__(
        background_line_style=background_line_style,
        faded_line_style=faded_line_style,
        faded_line_ratio=faded_line_ratio,
        x_range=x_range,
        y_range=y_range,
        x_length=x_length,
        y_length=y_length,
        **kwargs,
    )

prepare_for_nonlinear_transform

代码
import numpy as np

import manimgx as m


class PlanePrepareForNonlinearTransformExample(m.Scene):
    def construct(self) -> None:
        plane = m.ComplexPlane(x_range=[-3, 3, 0.5], y_range=[-2, 2, 0.5])
        plane.prepare_for_nonlinear_transform()
        self.add(plane)
        self.play(plane.animate.apply_complex_function(np.sin), run_time=3)

将平面的线分成许多曲线,使非线性函数能平滑地弯曲它们。

应用于平面的函数(用 apply_function 或 apply_complex_function)移动其线的点,而直线是单条曲线:移动其少数点几乎不会弯曲它。平面中曲线数少于 num_inserted_curves 的每个部分被分成那么多条。

number_plane.prepare_for_nonlinear_transform(num_inserted_curves=50)
num_inserted_curves

每条线至少有多少条曲线。

源码

manimgx\mobjects\plotting.py

def prepare_for_nonlinear_transform(self, num_inserted_curves: int = 50) -> Self:
    """将平面的线分成许多曲线,使非线性函数能平滑地弯曲它们。

    应用于平面的函数(用 [apply_function][manimgx.Mobject.apply_function] 或 [apply_complex_function][manimgx.Mobject.apply_complex_function])移动其线的点,而直线是单条曲线:移动其少数点几乎不会弯曲它。平面中曲线数少于 `num_inserted_curves` 的每个部分被分成那么多条。

    Args:
        num_inserted_curves: 每条线至少有多少条曲线。

    Examples:
        ```python
        import numpy as np

        import manimgx as m


        class PlanePrepareForNonlinearTransformExample(m.Scene):
            def construct(self) -> None:
                plane = m.ComplexPlane(x_range=[-3, 3, 0.5], y_range=[-2, 2, 0.5])
                plane.prepare_for_nonlinear_transform()
                self.add(plane)
                self.play(plane.animate.apply_complex_function(np.sin), run_time=3)
        ```
    """
    for mob in self.family_members_with_points():
        if isinstance(mob, VMobject):
            num_curves = mob.get_num_curves()
            if num_inserted_curves > num_curves:
                mob.insert_n_curves(num_inserted_curves - num_curves)
    return self

ComplexPlane

ComplexPlaneExample
代码
import manimgx as m


class ComplexPlaneExample(m.Scene):
    def construct(self) -> None:
        plane = m.ComplexPlane(x_range=[-6.5, 6.5, 1]).add_coordinates()
        self.add(plane)
        for z, name in ((2 + 1j, "2+i"), (-3 - 2j, "-3-2i")):
            dot = m.Dot(plane.n2p(z), radius=0.12, color=m.YELLOW)
            self.add(dot, m.MathTex(name).next_to(dot, m.UR, buff=0.1))

复平面:一个 NumberPlane,其点为复数,x + yi 位于坐标 (x, y) 处。

number_to_point(n2p)和 point_to_number(p2n)在数字与点之间转换,add_coordinates 沿 x 轴写实数、沿 y 轴写虚数(带 i)。复数函数用 apply_complex_function 映射平面。它接收 NumberPlane 的参数,并做其能做的一切。

m.ComplexPlane(x_range=None, y_range=None, x_length=None, y_length=None, background_line_style=None, faded_line_style=None, faded_line_ratio=1, **kwargs)
axis_config

每个坐标轴的 数轴关键字:include_numbers、font_size、color、…(默认 None:无)。

x_axis_config

x 轴的数轴关键字,覆盖 axis_config 的(默认 None:无)。

y_axis_config

y 轴的数轴关键字,覆盖 axis_config 的(默认 None:无)。

tips

每个坐标轴末端是否有箭头(默认 True;平面的坐标轴无箭头,除非 axis_config 包含 include_tip)。

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 __init__(
    self,
    x_range: Sequence[float] | None = None,
    y_range: Sequence[float] | None = None,
    x_length: float | None = None,
    y_length: float | None = None,
    background_line_style: Style | None = None,
    faded_line_style: Style | None = None,
    faded_line_ratio: int = 1,
    **kwargs: Unpack[AxesOptions],
):
    kwargs["axis_config"] = merged_axis_config(
        {
            "stroke_width": 2,
            "include_ticks": False,
            "include_tip": False,
            "line_to_number_buff": SMALL_BUFF,
            "label_direction": DR,
            "font_size": 24,
        },
        kwargs.get("axis_config"),
    )
    kwargs["y_axis_config"] = merged_axis_config(
        {"label_direction": DR}, kwargs.get("y_axis_config")
    )
    # the frame as it is now: a tall video's (9:16) is taller than a wide one's
    if x_range is None:
        x_range = (-config.frame_x_radius, config.frame_x_radius, 1)
    if y_range is None:
        y_range = (-config.frame_y_radius, config.frame_y_radius, 1)
    super().__init__(
        background_line_style=background_line_style,
        faded_line_style=faded_line_style,
        faded_line_ratio=faded_line_ratio,
        x_range=x_range,
        y_range=y_range,
        x_length=x_length,
        y_length=y_length,
        **kwargs,
    )

number_to_point

将复数转换为其在平面上的点:x + yi 转为坐标 (x, y) 的点。

n2p 是其简写名。

complex_plane.number_to_point(number)
number

数字;实数在 x 轴上。

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

源码

manimgx\mobjects\plotting.py

def number_to_point(self, number: float | complex) -> Point3D:
    """将复数转换为其在平面上的点:x + yi 转为坐标 (x, y) 的点。

    `n2p` 是其简写名。

    Args:
        number: 数字;实数在 x 轴上。

    Returns:
        点,在场景坐标系中。
    """
    number = complex(number)
    return self.coords_to_point(number.real, number.imag)

point_to_number

将点转换为其处的复数:对于点的坐标 (x, y) 为 x + yi。

p2n 是其简写名。

complex_plane.point_to_number(point)
point

点,在场景坐标系中。

源码

manimgx\mobjects\plotting.py

def point_to_number(self, point: Point3DLike) -> complex:
    """将点转换为其处的复数:对于点的坐标 (x, y) 为 x + yi。

    `p2n` 是其简写名。

    Args:
        point: 点,在场景坐标系中。
    """
    x, y = self.point_to_coords(point)[:2]
    return complex(x, y)

get_coordinate_labels

为平面的数字制作标签:实数在其 x 轴上的点旁,虚数(带 i)在其 y 轴上的点旁。

数字按其较大的部分书写:若其虚部(在 y 轴旁)的绝对值大于实部,则按虚部;否则按实部(在 x 轴旁)。每个按坐标轴为刻度编号的方式书写(参见 get_number_mobject)。

complex_plane.get_coordinate_labels(*numbers, **kwargs)
*numbers

要标注的数字;无表示两个坐标轴的刻度,但不含 0。

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 移动至的状态。

返回 标签的新组,保留为平面的 coordinate_labels;未添加到平面。

源码

manimgx\mobjects\plotting.py

def get_coordinate_labels(
    self, *numbers: float | complex, **kwargs: Unpack[DecimalNumberOptions]
) -> VGroup:
    """为平面的数字制作标签:实数在其 x 轴上的点旁,虚数(带 `i`)在其 y 轴上的点旁。

    数字按其较大的部分书写:若其虚部(在 y 轴旁)的绝对值大于实部,则按虚部;否则按实部(在 x 轴旁)。每个按坐标轴为刻度编号的方式书写(参见 [get_number_mobject][manimgx.NumberLine.get_number_mobject])。

    Args:
        *numbers: 要标注的数字;无表示两个坐标轴的刻度,但不含 0。
        **kwargs: 标签的 [数字关键字][manimgx.DecimalNumber]:`font_size`、`num_decimal_places`、`color`、…。

    Returns:
        标签的新组,保留为平面的 `coordinate_labels`;未添加到平面。
    """
    self.coordinate_labels = VGroup()
    for number in numbers or self._get_default_coordinate_values():
        z = complex(number)
        if abs(z.imag) > abs(z.real):
            self.coordinate_labels.add(
                self.get_y_axis().get_number_mobject(
                    z.imag, **(kwargs | {"unit": "i"})
                )
            )
        else:
            self.coordinate_labels.add(
                self.get_x_axis().get_number_mobject(z.real, **kwargs)
            )
    return self.coordinate_labels

add_coordinates

为平面的数字标注标签,按 get_coordinate_labels 的制作方式,并将它们添加到平面。

complex_plane.add_coordinates(*numbers, **kwargs)
*numbers

要标注的数字;无表示两个坐标轴的刻度,但不含 0。

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_coordinates(  # pyright: ignore[reportIncompatibleMethodOverride]  # ty: ignore[invalid-method-override]  # CE's: numbers, not per-axis values
    self, *numbers: float | complex, **kwargs: Unpack[DecimalNumberOptions]
) -> Self:
    """为平面的数字标注标签,按 [get_coordinate_labels][manimgx.ComplexPlane.get_coordinate_labels] 的制作方式,并将它们添加到平面。

    Args:
        *numbers: 要标注的数字;无表示两个坐标轴的刻度,但不含 0。
        **kwargs: 标签的 [数字关键字][manimgx.DecimalNumber]:`font_size`、`num_decimal_places`、`color`、…。
    """
    self.add(self.get_coordinate_labels(*numbers, **kwargs))
    return self

PolarPlane

PolarPlaneExample
代码
import manimgx as m


class PolarPlaneExample(m.Scene):
    def construct(self) -> None:
        planes = m.VGroup(
            m.PolarPlane(radius_max=2, size=5.5, radius_step=0.5),
            m.PolarPlane(
                radius_max=2,
                size=5.5,
                azimuth_units="degrees",
                azimuth_step=12,
                faded_line_ratio=2,
            ),
        )
        for plane in planes:
            plane.add_coordinates()
        self.add(planes.arrange(buff=1.5))

极平面:围绕其原点的圆,半径的每一步处一个,以及从原点向外的线,相隔一圈的分数;未设置样式时为蓝色覆盖白色坐标轴,无刻度或箭头。

该平面是半径为 radius_max 的圆盘,居中于场景原点,其 x 轴和 y 轴为其半径。add_coordinates 为半径编号并标注线的角度,以 azimuth_units 为单位:π 的分数(3π/4)、τ 的分数、度数、梯度,或圈的分数。 polar_to_point(pr2pt)将极坐标转换为点,plot_polar_graph 绘制曲线 r = f(θ);Axes 能做的一切,平面也能做。

背景样式和较暗线比例是构造输入;平面保留其绘制的网格而非那些设置属性。

m.PolarPlane(radius_max=None, size=None, radius_step=1, azimuth_step=None, azimuth_units='PI radians', azimuth_compact_fraction=True, azimuth_offset=0, azimuth_direction='CCW', azimuth_label_buff=SMALL_BUFF, azimuth_label_font_size=24, radius_config=None, background_line_style=None, faded_line_style=None, faded_line_ratio=1, **kwargs)
radius_max

外圆的半径,以平面的单位计;None 表示平面创建时画框短边的一半(4)。

size

平面的宽度,即其直径,以场景单位计;None 表示每单位一个场景单位。

radius_step

两个圆之间的距离,以平面的单位计。

azimuth_step

多少条线分一整圈:每圈除以它有一条线;None 表示单位自身的:弧度为 20,度数为 36,梯度为 40,圈的分数为 1。

azimuth_units

角度的标注方式:"PI radians"(π 的分数)、"TAU radians"(τ 的分数)、"degrees"、"gradians",或 None(圈的分数,作为小数)。

azimuth_compact_fraction

π 或 τ 的分数是否将常数写在分子中(3π/4),而非写在后面(¾ π)。

azimuth_offset

标注为 0 的线的角度,以弧度计,从右起逆时针方向:线和其标签随之转动。

azimuth_direction

角度增加的方向:"CCW",逆时针,或 "CW",顺时针。

azimuth_label_buff

外圆与角度标签之间的间距,以场景单位计。

azimuth_label_font_size

角度标签的字号。

radius_config

半径坐标轴的 数轴关键字,覆盖平面自身的(无刻度、无箭头、宽 2、字号 24、数字在下方左侧);None 表示无。

background_line_style

圆和线的 样式关键字,覆盖其默认值:蓝色(BLUE_D)、宽 2、不透明;None 表示无。

faded_line_style

较暗圆和线的 样式关键字;None 表示其他的样式,宽度和不透明度减半。

faded_line_ratio

较暗圆和线将每个步长分成多少部分:1 表示无。

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 __init__(
    self,
    radius_max: float | None = None,
    size: float | None = None,
    radius_step: float = 1,
    azimuth_step: float | None = None,
    azimuth_units: AzimuthUnits = "PI radians",
    azimuth_compact_fraction: bool = True,
    azimuth_offset: float = 0,
    azimuth_direction: Literal["CW", "CCW"] = "CCW",
    azimuth_label_buff: float = SMALL_BUFF,
    azimuth_label_font_size: float = 24,
    radius_config: NumberLineOptions | None = None,
    background_line_style: Style | None = None,
    faded_line_style: Style | None = None,
    faded_line_ratio: int = 1,
    **kwargs: Unpack[Style],
):
    self.azimuth_units, self.azimuth_direction = azimuth_units, azimuth_direction
    radius = (
        min(config.frame_x_radius, config.frame_y_radius)
        if radius_max is None
        else radius_max
    )
    radius_config = merged_axis_config(
        {
            "stroke_width": 2,
            "include_ticks": False,
            "include_tip": False,
            "line_to_number_buff": SMALL_BUFF,
            "label_direction": DL,
            "font_size": 24,
        },
        radius_config,
    )
    # Snapshot before assigning azimuth properties, which subclasses may override.
    background_line_style = (background_line_style or Style()).copy()
    default_steps = {
        "PI radians": 20,
        "TAU radians": 20,
        "degrees": 36,
        "gradians": 40,
        None: 1,
    }
    self.azimuth_step = (
        default_steps[azimuth_units] if azimuth_step is None else azimuth_step
    )
    self.azimuth_offset = azimuth_offset
    self.azimuth_label_buff = azimuth_label_buff
    self.azimuth_label_font_size = azimuth_label_font_size
    self.azimuth_compact_fraction = azimuth_compact_fraction
    super().__init__(
        background_line_style=background_line_style,
        faded_line_style=faded_line_style,
        faded_line_ratio=faded_line_ratio,
        x_range=(-radius, radius, radius_step),
        y_range=(-radius, radius, radius_step),
        x_length=size,
        y_length=size,
        axis_config=radius_config,
        **kwargs,
    )

get_coordinate_labels

为平面的半径编号,并为其角度制作标签。

半径沿 x 轴编号,在中心右侧;数字添加到坐标轴。角度的标签采用平面的 azimuth_units,围绕外圆分布,超出它 azimuth_label_buff:按居中于场景原点的平面(即其创建时)放置。

polar_plane.get_coordinate_labels(r_values=None, a_values=None)
r_values

要编号的半径,以平面的单位计;None 表示每个圆的但不含 0。

a_values

要标注的角度,作为圈的分数(0.25 为四分之一圈);None 表示每条线的。

返回 x 轴(现已编号)和角度标签组的新组(未添加到平面);保留为平面的 coordinate_labels。

源码

manimgx\mobjects\plotting.py

def get_coordinate_labels(
    self,
    r_values: Iterable[float] | None = None,
    a_values: Iterable[float] | None = None,
) -> VGroup:
    """为平面的半径编号,并为其角度制作标签。

    半径沿 x 轴编号,在中心右侧;数字添加到坐标轴。角度的标签采用平面的 `azimuth_units`,围绕外圆分布,超出它 `azimuth_label_buff`:按居中于场景原点的平面(即其创建时)放置。

    Args:
        r_values: 要编号的半径,以平面的单位计;None 表示每个圆的但不含 0。
        a_values: 要标注的角度,作为圈的分数(0.25 为四分之一圈);None 表示每条线的。

    Returns:
        x 轴(现已编号)和角度标签组的新组(未添加到平面);保留为平面的 `coordinate_labels`。
    """
    if r_values is None:
        r_values = [r for r in self.get_x_axis().get_tick_range() if r >= 0]
    if a_values is None:
        a_values = np.arange(0, 1, 1 / self.azimuth_step)
    r_mobs = self.get_x_axis().add_numbers(r_values)
    d = 1 if self.azimuth_direction == "CCW" else -1
    radius = self.get_right()[0]
    labels = VGroup()
    for i in a_values:
        angle = d * (i * TAU) + self.azimuth_offset
        point = np.array([radius * np.cos(angle), radius * np.sin(angle), 0])
        label = self._azimuth_label(i)
        labels.add(
            label.next_to(
                point,
                direction=point,
                aligned_edge=point,
                buff=self.azimuth_label_buff,
            )
        )
    self.coordinate_labels = VGroup(r_mobs, labels)
    return self.coordinate_labels

add_coordinates

沿 x 轴为平面的半径编号,并围绕其标注角度,按 get_coordinate_labels 的制作方式。

polar_plane.add_coordinates(r_values=None, a_values=None)
r_values

要编号的半径,以平面的单位计;None 表示每个圆的但不含 0。

a_values

要标注的角度,作为圈的分数(0.25 为四分之一圈);None 表示每条线的。

源码

manimgx\mobjects\plotting.py

def add_coordinates(  # pyright: ignore[reportIncompatibleMethodOverride]  # ty: ignore[invalid-method-override]  # CE's: a polar plane numbers radii and angles
    self,
    r_values: Iterable[float] | None = None,
    a_values: Iterable[float] | None = None,
) -> Self:
    """沿 x 轴为平面的半径编号,并围绕其标注角度,按 [get_coordinate_labels][manimgx.PolarPlane.get_coordinate_labels] 的制作方式。

    Args:
        r_values: 要编号的半径,以平面的单位计;None 表示每个圆的但不含 0。
        a_values: 要标注的角度,作为圈的分数(0.25 为四分之一圈);None 表示每条线的。
    """
    self.add(self.get_coordinate_labels(r_values, a_values))
    return self

get_radian_label

制作弧度角度的标签:π 的分数,或若平面单位为 "TAU radians" 则为 τ 的分数。

该分数是分母至多 100 的最接近分数,按平面的 azimuth_compact_fraction 书写:3π/4,或 ¾ π。

polar_plane.get_radian_label(number, **kwargs)
number

角度,作为圈的分数(0.375 为 3π/4)。

arg_separator

将字符串连接为 tex_string 的分隔符,即 MathTex 排版的公式, 或 Tex 排版的文本(默认 " ";Tex 为 "")。

substrings_to_isolate

使其各自成为部分的子串:每个字符串在每个子串的每次出现处 分割(默认 None)。

tex_to_color_map

每个子串的颜色,子串如 substrings_to_isolate 般成为独立部分 并着色(默认 None)。

tex_environment

字符串的读取方式:名称含 "align"("align*",MathTex 的 默认)为数学;任何其他("center",Tex 的默认,也使行 居中),或 None 为 LaTeX 文本,数学在 $ 符号之间。

font_size

文本的大小:一个 em 为 font_size / 96 场景单位,默认时为 0.5, 48(Text 按其大写字母确定大小:48 时高 0.449 单位)。

typst_preamble

在文档之前设置的 Typst 代码:#set 和 #show 规则、#let 定义、导入(默认为 "")。

font_paths

字体文件(.ttf、.otf、.ttc、.otc)的目录,在 manimgx 附带的字体之前 连同其子目录一起搜索;指向文件的路径不添加任何内容 (默认为 None)。

should_center

mobject 是否居中于原点(默认为 True)。

height

将 mobject 缩放至的高度,以场景单位计,而非按 font_size 确定大小 (默认为 None)。

width

将 mobject 缩放至的宽度,以场景单位计,而非按 font_size 确定大小; 若同时给出 height,则宽度最后设置(默认为 None)。

package_path

Typst 包导入的目录,将包存放为 namespace/name/version 目录: #import "@preview/name:1.0.0" 读取 preview/name/1.0.0(默认为 None: 除 mitex 外无任何包,mitex 由 manimgx 的引擎持有)。不下载任何内容。

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 移动至的状态。

还接受 样式关键字。

返回 一个新的 MathTex。

源码

manimgx\mobjects\plotting.py

def get_radian_label(
    self, number: float, **kwargs: Unpack[MathTexOptions]
) -> MathTex:
    """制作弧度角度的标签:π 的分数,或若平面单位为 `"TAU radians"` 则为 τ 的分数。

    该分数是分母至多 100 的最接近分数,按平面的 `azimuth_compact_fraction` 书写:3π/4,或 3/4 π。

    Args:
        number: 角度,作为圈的分数(0.375 为 3π/4)。
        **kwargs: 标签的 [数学关键字][manimgx.MathTex];其字号未给出时为 24。

    Returns:
        一个新的 [MathTex][manimgx.MathTex]。
    """
    kwargs.setdefault("font_size", 24)
    units = (
        self.azimuth_units
        if self.azimuth_units in ("PI radians", "TAU radians")
        else "PI radians"
    )
    constant = {"PI radians": "\\pi", "TAU radians": "\\tau"}[units]
    frac = fr.Fraction(number * {"PI radians": 2, "TAU radians": 1}[units])
    p, q = (frac := frac.limit_denominator(100)).numerator, frac.denominator
    if p == 0:
        string = "0"
    elif q == 1:
        string = constant if p == 1 else f"{p}{constant}"
    elif self.azimuth_compact_fraction:
        string = f"\\tfrac{{{'' if p == 1 else p}{constant}}}{{{q}}}"
    else:
        string = f"\\tfrac{{{p}}}{{{q}}}{constant}"
    return MathTex(string, **kwargs)

复数与点

点 [x, y, 0] 表示复数 x + yi。

complex_to_R3

复数所对应的点:实部为 x,虚部为 y。

m.complex_to_R3(complex_num)
complex_num

该复数。

返回 该点,其 z 为 0。

源码

manimgx\drawing\geometry.py

def complex_to_R3(complex_num: complex) -> Vec:
    """复数所对应的点:实部为 x,虚部为 y。

    Args:
        complex_num: 该复数。

    Returns:
        该点,其 z 为 0。
    """
    return np.array((complex_num.real, complex_num.imag, 0))

R3_to_complex

点所对应的复数:x + iy(其 z 被忽略)。

m.R3_to_complex(point)
源码

manimgx\drawing\geometry.py

def R3_to_complex(point: Point3D) -> complex:
    """点所对应的复数:x + iy(其 z 被忽略)。"""
    return complex(*point[:2])

complex_func_to_R3_func

将复数函数作为点的函数:点 (x, y, z) 变到该函数对 x + iy 所发送的位置, 其 z 为 0。

m.complex_func_to_R3_func(complex_func)
complex_func

复数函数。

返回 点的函数。

源码

manimgx\drawing\geometry.py

def complex_func_to_R3_func(
    complex_func: Callable[[complex], complex],
) -> Callable[[Point3D], Point3D]:
    """将复数函数作为点的函数:点 (x, y, z) 变到该函数对 x + iy 所发送的位置,
    其 z 为 0。

    Args:
        complex_func: 复数函数。

    Returns:
        点的函数。
    """
    return lambda p: complex_to_R3(complex_func(R3_to_complex(p)))

AxesOptions

Axes 除范围和长度外的关键字,用于传递它们的类(ThreeDAxes、平面、BarChart):其坐标轴的配置和箭头,附带样式关键字。

axis_config

每个坐标轴的 数轴关键字:include_numbers、font_size、color、…(默认 None:无)。

x_axis_config

x 轴的数轴关键字,覆盖 axis_config 的(默认 None:无)。

y_axis_config

y 轴的数轴关键字,覆盖 axis_config 的(默认 None:无)。

tips

每个坐标轴末端是否有箭头(默认 True;平面的坐标轴无箭头,除非 axis_config 包含 include_tip)。

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 移动至的状态。