Manim问题:为何我的图表绘制仅用了动画时长的一半?
问题原因
你这里的核心问题是用错了动画方式:
Write(sin_graph)是一次性绘制出完整的正弦曲线,它的播放逻辑和tracker.animate.set_value(749)完全独立。即使你给self.play设置了run_time=10,Write动画会按照自身逻辑快速完成(你看到的5秒是因为图形路径较长,但依然达不到10秒的同步要求)。- 你期望曲线随
ValueTracker数值逐步绘制,但Write是静态绘制完整图形,根本不会跟踪tracker的变化。
修复方案
把静态完整曲线改成随tracker动态更新的部分曲线,去掉Write动画,让曲线自动跟随tracker的数值变化:
修改后的完整代码:
from manim import * import math import numpy as np class TrackerExample(Scene): def sin(self, x): f = 1 / 50 return np.sin(x * 2 * math.pi * f) / 2 + 0.5 def construct(self): axes = Axes( x_range=[0, 749, 100], y_range=[0, 4, 2], axis_config={"include_numbers": True, "font_size": 24}, x_length=4, y_length=3 ).move_to(LEFT * 2) self.play(Write(axes, lag_ratio=0.01, run_time=1)) tracker = ValueTracker(0) # 用always_redraw创建随tracker更新的动态曲线,只绘制x从0到当前tracker值的部分 sin_graph = always_redraw( lambda: axes.plot( lambda x: self.sin(x), color=BLUE, x_range=[0, tracker.get_value()] # 只绘制当前tracker对应的区间 ) ) numbers = DecimalNumber(0).move_to(2*RIGHT) numbers.add_updater(lambda m: m.set_value(int(tracker.get_value()))) self.add(numbers, sin_graph) # 添加动态曲线到场景 # 只播放tracker的动画,曲线和数字会自动同步更新 self.play(tracker.animate.set_value(749), run_time=10, rate_func=linear) # 注释掉直接调用construct的代码,Manim推荐用命令行运行 # example = TrackerExample() # example.construct()
关键修改点
- 用
always_redraw包裹曲线绘制逻辑,指定x_range=[0, tracker.get_value()],每次tracker变化时,都会重新绘制从0到当前数值的曲线段。 - 去掉
Write(sin_graph)动画,直接把动态曲线加入场景,它会随着tracker的动画自动逐步绘制。 - 注释掉直接调用
construct()的代码,Manim社区版推荐通过命令行(比如manim -pql your_script.py TrackerExample)运行场景,直接调用construct会跳过很多动画渲染逻辑。
内容的提问来源于stack exchange,提问作者blindeyes
相关产品推荐
相关产品推荐

