Reviewed from frames only (review/*.png sheets and singles, plus 17 extra frames extracted from final.mp4 with ffmpeg). Math checked against the formulas in scenes.py; all plotted shapes and all 16 numbers in the worked example are correct. No files were modified.
fix first — one layout fix (Ratio_06 text flush with the frame edge) and one small tick-label overlap; everything else is polish. No math, sign, or axis errors anywhere.
pg under the formula instead of beside it: pg = Text(...).next_to(grad, DOWN, buff=0.15).align_to(grad, LEFT), or shift the whole formula column left (rdef.move_to(UP*1.5 + LEFT*2.5)).| [minor] WhyMin_05 — the bright red stroke of the “wrong way” boxes passes through the tick labels: left plot “0 | 8”, right plot “1 | 2” (zoomed crops of the 1080p frame at 271.9 s confirm). → scenes.py:597–602, after FadeIn(bL), FadeIn(bR) call self.bring_to_front(tkL, tkR), or build the boxes with stroke_opacity=0.6 and place tick labels with buff=0.3. |
clip(r_t)Â_t / r_tÂ_t sit at their final positions over empty space while the lines are still half-drawn. → at the start of NegativeAdv re-create the A>0 un/cl polylines dimmed, then at cue(2) Transform them into poly(ax, unclip_pts(-1)) / poly(ax, clip_pts(-1)) (a reflection across the x-axis); fade the labels in after the Transform.self.play(FadeIn(pull), run_time=0.5) then self.play(rt.animate.set_value(...), run_time=2.5).stop.next_to(dot, UP+LEFT, buff=0.2) (dot is at r=2.35 by then), or drop the fuzz band when the line appears.grad writes, dim rdef, n_lab, d_lab, n_arr, d_arr, eq1 to opacity 0.35 (VGroup(...).animate.set_opacity(0.35)).plot.animate.scale(0.45).to_corner(DL)) while the formula writes, or start Write(f) at cue(6) instead of cue(7).lb out with the rest at cue(6); replace c2/c3 with a small band on an r-axis, a dot at r=1.15, one gradient step (shared-parameter update) that lands it at 1.35, then the “∇ = 0” tag appears on it: the dot is outside and nothing pulls it back.small() from WhyMin) under the table and, as each row’s min is boxed, drop a dot at (r, min) on the matching plot, coloured green when the gradient flows and red when it is zero.lclip_formula() dimmed and TransformMatchingTex its r_t(θ) into rdef[0]; open PositiveAdv with the formula shrinking to the top-right as the axes draw.Checked and clean: every narrated object is on screen when named (ratio definition, L^CPI, policy-gradient identity, clip definition, band, flat parts, ∇=0 regions, min line, both “smaller” comparisons in both advantage scenes, all table cells, the ≤ bound, the with/without-min comparison, the piecewise gradient in the recap). No three-sentence dead stretches. No LaTeX errors. Colour meaning is constant across scenes (blue = unclipped, yellow = clipped, green = min/L^CLIP, red = zero gradient, grey band = [1-ε, 1+ε]); the orange “nothing says stop” and the grey “estimate reliable” fuzz are one-off and do not collide with those meanings.
Pacing. The plot scenes (Clip, PositiveAdv, NegativeAdv) are well paced: each sentence adds one thing and the dots/arrows/regions land inside the sentence that names them. Three soft spots: (1) Numbers is 57 s of the same cadence repeated four times (case label, two inputs, two products, box, gradient); by case 3 the viewer is ahead of the narration. Cases 3–4 could run ~30% faster, or the plot-dot idea above gives the eye something new per row. (2) WhyMin_07–08: 5 s of text. (3) Recap_03: formula finishes writing at ~14.6 s and the frame then holds for ~6 s to the end — acceptable as an outro. Nothing is too fast; the longest single-sentence reveal (Ratio_01, 9.7 s, three sub-animations) is fine.
Visual hierarchy. Strong wherever there is a plot: the thick green min line over dimmed blue/yellow, one red region, one label, one moving dot. Weak in three frames: Ratio_06 (a wall of four equal-weight formula rows), Ratio_10 (two labels stacked at the top-left while the dot is at the top-right), and WhyMin_05 (two plots, each with two red regions and two labels, plus a caption — ten text items at once; the dimmed “gain ignored” helps but the frame is still the busiest in the video).
3b1b-ness. Motion that carries meaning is present and well chosen: the θ dot drifting from θ_old (Intro_03), the dot riding the line past the reliable band with the readout (Clip_05), the min line being drawn over the two dimmed terms (PositiveAdv_05), the dot being pulled back inside the band in both advantage scenes, and the green→yellow Transform when the min is removed (WhyMin_04). The two most slide-like scenes:
r_t(θ) → the x-axis label and a dot; the clip(...) block → the grey band; min → the green line — then let the piecewise-gradient formula’s two cases highlight the red regions and the sloped segment. The recap then re-uses the picture the viewer already owns.
Runner-up: NegativeAdv should literally flip the A>0 lines (see the issue above); that one Transform would make “both terms flip” a thing the viewer sees.Colour accessibility (red/green). The red zero-gradient fill is 18%-opacity red on black; for a protanope that reads as near-black, so the shaded region disappears in Clip_04–05, PositiveAdv_07–11, NegativeAdv_05–09 and WhyMin_02–05. The information survives only through the text tags (“∇ = 0”, “gain ignored”) — which is why those tags matter and should stay. Red-vs-green text pairs that carry a sign by colour alone: “∇L = 0” (red) vs “slope = Â_t > 0” (green) in PositiveAdv_10; “gain ignored” (red) vs “worse: counted in full” (green) in WhyMin_03; the “0” vs “Â_t∇r_t” gradient cells in Numbers. In each case the words also carry the meaning, so nothing is lost outright, but the at-a-glance read is. Green min line vs dimmed yellow clip line (a hard pair for deuteranopes) is separated by width (9 vs 5) and opacity, which is enough. Recommended encodings, in order of payoff:
Lines clipped to the rectangle, or a VGroup of thin lines at 45°) in addition to the fill; hatching is colour-independent and reads as “dead zone”.DashedVMobject) and keep the sloped part solid, so “flat = no gradient” is a line style, not a fill colour.Intro 4 · Ratio 4 · Clip 5 · PositiveAdv 5 · NegativeAdv 4 · Numbers 3 · WhyMin 4 · Recap 4