向量场可视化

VectorField 一族把向量值函数 f(x, y) → (dx, dy) 可视化:在网格上采样并画出每个采样点处的向量或流向线,讲解微分方程、梯度场、流场时的利器。

VectorField

class manim.VectorField(func: Callable[[Point3D], Vector3D], color: ParsableManimColor | None = None, color_scheme: Callable[[Vector3D], float] | None = None, min_color_scheme_value: float = 0, max_color_scheme_value: float = 2, colors: Sequence[ParsableManimColor] = [ManimColor('#236B8E'), ManimColor('#83C167'), ManimColor('#F7D96F'), ManimColor('#FC6255')], **kwargs)

基类:VGroup

VectorField 是所有向量场的基类:传入函数 func 后按默认网格采样。color_scheme 可把向量模长映射为颜色(蓝 → 绿 → 黄 → 红),nudge() / get_nudge_updater() 让任意 mobject 沿场线漂移,start_submobject_movement() 则让场里的所有向量自己流动起来。

G VectorField VectorField VGroup VGroup VectorField->VGroup VMobject VMobject VGroup->VMobject Mobject Mobject VMobject->Mobject object object Mobject->object

name

type

default

desc

func

Callable[[Point3D], Vector3D]

—

向量值函数

color_scheme

Callable | None

None

向量 → [0,1] 颜色映射

min/max_color_scheme_value

float

0 / 2

颜色映射的值域

colors

Sequence[color]

蓝→绿→黄→红

渐变的取色序列

ArrowVectorField

class manim.ArrowVectorField(func: ~collections.abc.Callable[[~numpy.ndarray], ~numpy.ndarray], color: ~manim.utils.color.core.ManimColor | int | str | ~numpy._typing._array_like.NDArray[~numpy.int64] | tuple[int, int, int] | ~numpy._typing._array_like.NDArray[~numpy.float64] | tuple[float, float, float] | tuple[int, int, int, int] | tuple[float, float, float, float] | None = None, color_scheme: ~collections.abc.Callable[[~numpy.ndarray], float] | None = None, min_color_scheme_value: float = 0, max_color_scheme_value: float = 2, colors: ~collections.abc.Sequence[~manim.utils.color.core.ManimColor | int | str | ~numpy._typing._array_like.NDArray[~numpy.int64] | tuple[int, int, int] | ~numpy._typing._array_like.NDArray[~numpy.float64] | tuple[float, float, float] | tuple[int, int, int, int] | tuple[float, float, float, float]] = [ManimColor('#236B8E'), ManimColor('#83C167'), ManimColor('#F7D96F'), ManimColor('#FC6255')], x_range: ~collections.abc.Sequence[float] = None, y_range: ~collections.abc.Sequence[float] = None, z_range: ~collections.abc.Sequence[float] = None, three_dimensions: bool = False, length_func: ~collections.abc.Callable[[float], float] = <function ArrowVectorField.<lambda>>, opacity: float = 1.0, vector_config: dict | None = None, **kwargs)

基类:VectorField

ArrowVectorField 用箭头画出每个采样点的向量(VectorField 的直线版更轻量,箭头版更直观)。x_range / y_range / z_range 控制采样网格。

G ArrowVectorField ArrowVectorField VectorField VectorField ArrowVectorField->VectorField VGroup VGroup VectorField->VGroup VMobject VMobject VGroup->VMobject Mobject Mobject VMobject->Mobject object object Mobject->object

StreamLines

class manim.StreamLines(func: Callable[[ndarray], ndarray], color: ManimColor | int | str | NDArray[int64] | tuple[int, int, int] | NDArray[float64] | tuple[float, float, float] | tuple[int, int, int, int] | tuple[float, float, float, float] | None = None, color_scheme: Callable[[ndarray], float] | None = None, min_color_scheme_value: float = 0, max_color_scheme_value: float = 2, colors: Sequence[ManimColor | int | str | NDArray[int64] | tuple[int, int, int] | NDArray[float64] | tuple[float, float, float] | tuple[int, int, int, int] | tuple[float, float, float, float]] = [ManimColor('#236B8E'), ManimColor('#83C167'), ManimColor('#F7D96F'), ManimColor('#FC6255')], x_range: Sequence[float] = None, y_range: Sequence[float] = None, z_range: Sequence[float] = None, three_dimensions: bool = False, noise_factor: float | None = None, n_repeats=1, dt=0.05, virtual_time=3, max_anchors_per_line=100, padding=3, stroke_width=1, opacity=1, **kwargs)

基类:VectorField

StreamLines 不画向量,而是撒下一大批虚拟粒子,沿场方向积分出**流线**,用 Create 播放即可获得流体动画。virtual_time / dt 控制积分步长与总时长,noise_factor 给起点加扰动让线条分布更自然。

G StreamLines StreamLines VectorField VectorField StreamLines->VectorField VGroup VGroup VectorField->VGroup VMobject VMobject VGroup->VMobject Mobject Mobject VMobject->Mobject object object Mobject->object

旋转场((-y, x))上的 ArrowVectorField 与 StreamLines:箭头指方向,流线展示完整轨迹。

查看源码 vector_fields.py
from manim import *


class VectorFieldDemo(Scene):
    def construct(self):
        def field(p):
            return np.array([-p[1], p[0], 0]) / 4

        vf = ArrowVectorField(field, x_range=[-5, 5, 1], y_range=[-2.5, 2.5, 1])
        self.play(Create(vf), run_time=1.5)
        sl = StreamLines(field, x_range=[-2.5, 2.5, 0.6], y_range=[-2.5, 2.5, 0.6],
                         noise_factor=0.2)
        self.add(sl)
        self.play(Create(sl), run_time=3)
        self.wait()

提示

StreamLines 的采样密度由 x/y_range 的步长决定(步长越小线越密),渲染时间也随之增长;讲解用场取步长 0.5~1 即可。