Object types
Every object type, its fields, and what it compiles to in Manim.
Every object you can insert, grouped the way the left sidebar groups them. For each one: the fields you can set, and the Manim Python it compiles to. Fields not listed here (position, rotation, scale, opacity, fill, stroke, strokeWidth, and so on) are universal — see Animations for the full list of what's keyframeable.
Object names in this page match the name used in the generated code's variables, which is also what you'll see in View Manim code….
Text & math
Text — text
Plain text with a font family, weight, italics, line spacing, and alignment.
| Field | What it controls |
|---|---|
text | The string shown |
fontFamily, fontWeight, italic | Typography |
lineSpacing, align | Multi-line layout: left / center / right |
Compiles to Text(...). Animate it letter-by-letter with Type on / Erase (AddTextLetterByLetter / RemoveTextLetterByLetter) instead of the usual Write/FadeIn.
Formula — mathtex
A LaTeX formula, rendered by real KaTeX in the editor and real Manim MathTex in the render — what you see is what renders. Double-click one on the canvas to open the formula editor with a symbol palette and live preview.
| Field | What it controls |
|---|---|
tex | The LaTeX source |
texMode | mathtex (math mode, the default) or tex (raw text-mode LaTeX) |
fontSize | Size |
colorParts | Color individual substrings wherever they appear in the equation — e.g. color just x or \sin\theta |
lines, linesShown | 2+ lines switch this into an aligned multi-line block (a LaTeX align* environment, every = lined up vertically) instead of a single expression; linesShown (keyframeable) reveals one more line at a time |
Compiles to MathTex(tex, font_size=...) or Tex(...) depending on texMode. Named colorParts compile to set_color_by_tex(...) calls layered on top of the base fill. A lines block compiles to one MathTex wrapped in \begin{align*}...\end{align*}; revealing more lines morphs via TransformMatchingTex, the same mechanism derivation uses for its step morphs — the difference is derivation morphs ONE equation through successive states, while a mathtex line block stacks and reveals several lines at once. See Reveal an aligned derivation.
Derivation — derivation
A step-by-step equation derivation. Write each algebraic state on its own line; keyframe the Step number and the render morphs between states with TransformMatchingTex — matched terms slide to their new position instead of just crossfading.
| Field | What it controls |
|---|---|
steps | An array of LaTeX strings, one per state |
step | Which state is currently shown (keyframeable) |
fontSize | Size |
See Build a step-by-step equation derivation for the full workflow, including why some letters need to be "isolated" for the morph to look right.
Shapes
| Object | Key fields | Compiles to |
|---|---|---|
circle | radius | Circle(radius=...) |
dot | radius | Dot(radius=...) |
ellipse | width, height | Ellipse(width=..., height=...) |
square | sideLength, cornerAngle (≠90° → rhombus) | Square(...) or Polygon(...) when sheared |
rectangle | width, height, cornerAngle (≠90° → parallelogram) | Rectangle(...) or Polygon(...) |
rounded_rectangle | width, height, cornerRadius, cornerAngle | RoundedRectangle(...) |
triangle | baseLength, angleA, angleB (solved automatically) | Polygon(...) from the solved vertices |
regular_polygon | sides, radius | RegularPolygon(n=..., start_angle=PI) |
polygon | points — free-form vertex list, relative to center | Polygon(...) |
star | points, outerRadius, innerRadius | Star(...) |
arc | radius, startAngle, angle | Arc(...) |
sector | radius, startAngle, angle | Sector(...) |
annulus | innerRadius, outerRadius | Annulus(...) |
annular_sector | innerRadius, outerRadius, startAngle, angle | AnnularSector(...) |
Lines & marks
| Object | Key fields | Compiles to |
|---|---|---|
line | start, end | Line(...) |
arrow | start, end, tipLength | Arrow(...) |
double_arrow | start, end, tipLength | DoubleArrow(...) |
vector | start, end, tipLength | Arrow(...) (drawn from the origin by convention) |
curved_arrow | start, end, angleAmount (bend) | CurvedArrow(...) |
brace | width, direction, label, targetObjectId (attach to another object instead of a fixed width) | Brace(Line(...), direction=...) — or always_redraw(Brace(target, ...)) when attached, tracking the target's live size/position every frame |
Coordinates & graphs
Coordinate systems
axes, number_plane, and complex_plane share the same shape:
| Field | What it controls |
|---|---|
xRange, yRange | [min, max] domain and range |
width, height | On-screen size, scene units |
includeNumbers, includeTips | Tick labels, arrow tips on the axis ends |
xLabel, yLabel | Axis titles |
plots | Attached function/parametric plots (see below) |
number_plane additionally has backgroundLineOpacity for the grid lines. All three compile to their matching Manim class (Axes, NumberPlane, ComplexPlane) and are self-styled — the editor's stroke/fill controls don't apply the way they do to a plain shape.
Number line — number_line
A single labeled axis, independent of the 2D axes/number_plane coordinate systems above.
| Field | What it controls |
|---|---|
min, max, step | Domain and tick spacing |
length | On-screen length, scene units |
includeNumbers, includeTip | Tick labels, an arrowhead at the end |
showTracker, trackedValue | A dot riding the line at one value (trackedValue is keyframeable — walk or count along the line) |
Compiles to NumberLine(x_range=[min, max, step], length=...), self-styled. The tracked dot compiles to a VGroup(NumberLine(...), Dot(...)) where the dot's position uses NumberLine.n2p(trackedValue).
Function graph — function_graph
| Field | What it controls |
|---|---|
expression | A Python/numpy expression in x, e.g. np.sin(x) |
xRange | Domain to plot over |
axesId | Which axes object to plot on (or none, for a bare scene-space curve) |
showArea, areaFrom, areaTo | Shade the area under the curve |
showRiemann, riemannDx | Riemann approximation rectangles |
showTangent, tangentX | A tangent line at one x-value (tangentX is keyframeable — slide the tangent along the curve) |
showDerivative | A dashed f′(x) curve |
showDomain, showRange, showRoots, showMaximum, showMinimum, showIntegralValue | Numeric analysis readouts, computed live |
showTracker, trackerX | A dot riding the curve at one x-value (trackerX is keyframeable — sweep the dot along the curve, e.g. a limit or a moving particle). Needs axesId set |
showTrackerLabel | A live (x, f(x)) coordinate label next to the tracked dot |
Compiles to axes.plot(...) (or a bare FunctionGraph(...) without axes); the calculus extras compile to get_area, get_riemann_rectangles, TangentLine, and a dashed derivative plot respectively. The tracked point compiles to a plain Dot placed via axes.c2p(x, f(x)) — since trackerX is a keyframeable geometry field, moving it re-morphs the whole graph group (curve + tangent + tracker) into a rebuilt clone at the new x, the same Transform-based mechanism tangentX already uses. See Plot a function and shade the area under it.
Parametric curve — parametric_function
| Field | What it controls |
|---|---|
xExpression, yExpression | Python expressions in t |
tRange | [t_min, t_max] |
axesId | Attach to an axes object, or leave bare |
Compiles to axes.plot_parametric_curve(...) or ParametricFunction(...).
3D
All 3D types force the scene into Manim's ThreeDScene and get a real orbiting camera in the editor preview.
| Object | Key fields | Compiles to |
|---|---|---|
sphere | radius | Sphere(...) |
ellipsoid | radiusX, radiusY, radiusZ | A Sphere stretched per axis — see note below |
cube | sideLength | Cube(...) |
prism | width, height, depth | Prism(dimensions=[...]) |
cone | baseRadius, height | Cone(...) |
cylinder | radius, height | Cylinder(...) |
torus | majorRadius, minorRadius | Torus(...) |
threed_axes | xRange/yRange/zRange, width/height/depth, axis labels, showGridXY/XZ/YZ | ThreeDAxes(...) + optional plane grids |
surface3d | expression (in x, y), xRange, yRange, resolution, fillA/fillB | Surface(...) with checkerboard coloring |
parametric_surface | xExpression/yExpression/zExpression (in u, v), uRange, vRange | Surface(...) |
parametric_curve3d | xExpression/yExpression/zExpression (in t), tRange | ParametricFunction(...) |
line3d | start3d, end3d, thickness | Line3D(...) |
arrow3d | start3d, end3d, thickness, tipLength | Arrow3D(...) |
dot3d | radius | Dot3D(...) |
polyhedron | solid (tetrahedron/octahedron/dodecahedron/icosahedron/pyramid/custom), edgeLength (Platonic presets), baseSide/pyramidHeight (pyramid), custom vertices/faces | Tetrahedron(...) etc., Polyhedron(vertex_coords=..., faces_list=...) for pyramid and custom — see note below |
Manim has no built-in Ellipsoid or Pyramid class, so those two are built from what Manim does have: an ellipsoid compiles to a unit Sphere stretched independently on each axis (Sphere(radius=1).stretch(radiusX, dim=0).stretch(radiusY, dim=1).stretch(radiusZ, dim=2)), and a pyramid compiles to a Polyhedron built from 5 generated points (4 base corners + 1 apex) — the same generic vertex/face mechanism a custom mesh uses. Both were checked against a real Manim render to confirm they come out the expected size and shape.
Media
| Object | Key fields | Compiles to |
|---|---|---|
image | assetId, width, height | ImageMobject(...) |
svg | assetId, width, height | SVGMobject(...) |
video | assetId, width/height, trimStart/trimEnd, muted, volume | An ImageMobject whose frame is swapped every scene-frame by an OpenCV-decoding add_updater — see below |
Manim has no native video mobject, so video compiles to the community-standard workaround: an ImageMobject seeded from the first frame, with add_updater(lambda m, dt: setattr(m, "pixel_array", reader.tick(dt))) swapping its pixels every frame. The reader tracks elapsed scene time, not "one decode per Manim frame," so a 24fps source plays back at real speed even inside a 60fps scene. The clip's own audio is muxed with self.add_sound, timed to whenever the object actually appears on stage. The canvas preview shows only a static placeholder — playback only happens in the real render.
Data & educational
| Object | Key fields | Compiles to |
|---|---|---|
counter | value (keyframeable), decimals, fontSize | DecimalNumber(...) — driven by a ValueTracker when animated |
graph | vertices (count), edges ("1-2,2-3" style list), layoutRadius | Graph(...) on a circular layout |
table | content (rows on lines, cells split by |), mathMode, fontSize | Table(...) or MathTable(...) |
code | code, language, lineNumbers, fontSize | Code(code_string=..., language=...) |
matrix | rows, bracket (square/paren/curly/bar/none), decimal, decimals, fontSize | Matrix(...) or DecimalMatrix(...) |
layered_matrix | layers (one matrix per layer), layerGap, fontSize | A VGroup of Matrix(...) shifted along OUT — forces a 3D scene |
bar_chart | labels, values, yMin/yMax/yStep, barColors, showValues | BarChart(...) |
pie_chart | labels, values, radius, sliceColors, innerRadiusRatio (donut hole) | A VGroup of Sector/AnnularSector wedges |
box_plot | values (raw samples, comma-separated), width/height, orientation, showOutliers, showLabels | A VGroup of Rectangle (Q1–Q3 box), Line (median + whiskers), optional outlier Dots — quartiles computed from values |
vector_field | xExpression/yExpression (in x, y), xRange, yRange, spacing, vectorScale, renderStyle (arrows / streamlines) | ArrowVectorField(...), or StreamLines(...) (flowing particles) when renderStyle is streamlines |
Annotations
| Object | Key fields | Compiles to |
|---|---|---|
callout | text, mathMode, box, pointer, pointTo, step (numbered badge) | A VGroup of text/formula + optional box + leader arrow |
highlight | shape (box/ellipse/underline), width, height | Rectangle/Ellipse/Line |
Every object also has a details field for the annotation system — medians, angle bisectors, heights, diagonals, incircle/circumcircle, coordinate labels, side labels — described per-shape in the Shape inspector tab. These compile into extra submobjects grouped with the shape.
Canvas studio only
Path — path
A free-form bezier shape drawn with the pen or pencil tool, or imported from an SVG. Every anchor point is independently keyframeable.
| Field | What it controls |
|---|---|
nodes | An array of anchors — each has x, y, and optional bezier handles hIn/hOut |
closed | Whether the last anchor connects back to the first |
Compiles to VMobject().set_points(...), built from the anchors and handles as cubic bezier segments. Each anchor's position is independently keyframeable as nodes.N.x / nodes.N.y — see Import an SVG and animate its points. Paths can also take a 3D rotation (rotationX/rotationY) even though they're 2D-drawn, which forces the scene to 3D — see Work in 3D.
Groups
group is a container with no geometry of its own — grouping (Ctrl+G) folds selected objects into one, which you can then move, scale, or animate as a unit while keeping each member's own animations intact.