You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Manim NumberLine实现x_range取倒数缩放的正确语法

Manim NumberLine 倒数缩放配置方法

你原写法的核心问题有两个:一是直接用LinearBase.function传lambda无法生成合法的缩放实例,LinearBase仅适用于线性变换场景,自定义非线性缩放需要自行实现缩放类;二是你设置的区间包含0点,1/x在x=0处无定义,直接计算会触发除0错误、坐标值溢出导致渲染失败。


正确实现步骤

  • 自定义缩放类继承Manim内置的ScaleBase,同时实现正向映射(原始数值转数轴坐标)和反向映射(数轴坐标转原始数值,用于定位刻度、渲染标签),并加入0点附近的过渡逻辑避开奇点。
  • 初始化NumberLine时,传入自定义缩放类的实例作为scaling参数。

完整可运行代码示例

from manim import *
import numpy as np

# 自定义倒数缩放逻辑
class ReciprocalScale(ScaleBase):
    def __init__(self, epsilon=0.2):
        # epsilon为0点附近的过渡阈值,避免除0错误
        self.epsilon = epsilon

    # 正向映射:原始数值 -> 数轴上的物理坐标
    def transform(self, x):
        if x >= self.epsilon:
            return 1 / x
        elif x <= -self.epsilon:
            return 1 / x
        # 0附近区间做线性过渡,避免坐标值趋向无穷
        return x / (self.epsilon ** 2)

    # 反向映射:数轴物理坐标 -> 原始数值,用于刻度定位
    def inverse_transform(self, x):
        if abs(x) <= 1 / self.epsilon:
            return 1 / x
        return x * (self.epsilon ** 2)

# 初始化数轴
a = NumberLine(
    x_range=[-2.5, 2.5, 0.5],
    length=13,
    decimal_number_config={"num_decimal_places": 1},
    include_numbers=True,
    font_size=50,
    tick_size=0.2,
    scaling=ReciprocalScale(epsilon=0.2)
)

注意事项

  • 不要尝试仅传一个lambda函数给scaling参数:非线性缩放必须同时实现正、反向映射,否则刻度位置、标签渲染会完全错乱。
  • 如果你不需要显示0附近的刻度,可以直接把x_range拆成不跨0的两段(比如[-2.5, -0.2, 0.5]和[0.2, 2.5, 0.5]分别做数轴再拼接),渲染效果会比加过渡段更准确。
  • 调整epsilon参数可以控制0点附近过渡段的长度,数值越小越接近真实的倒数映射,但过小的epsilon会导致0附近坐标差过大,数轴比例失衡。

内容的提问来源于stack exchange,提问作者SuperUser_Vermeylen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 21:15:43