A film is a map from spacetime ²× to colors. A film group is a crystallographic group of symmetries of such a film: transformations g : (x, t) → (M.x + v, st + τ), with M a 2×2 point operation, v a spatial translation, s = ±1 a time direction, and τ a time offset, containing a lattice of two independent spatial translations and one time period. Up to crystallographic equivalence there are exactly 275 such groups (Ke & Wu, arXiv:2604.05619) — the space-time analogue of the 17 wallpaper groups, and a subfamily of the 230 space groups read with one axis as time (Fletcher, Math. Gazette 40 (1956) 15–19; the 1+1-dimensional count of 13 is in Xu & Wu, Phys. Rev. Lett. 120, 096401 (2018)).
This notebook accompanies the FilmGroups package, a port of the interactive atlas at https://yaroslavvb.github.io/animated-groups-fable . Every group is stored as exact data, machine-verified against the group axioms, and rendered as a looping animation: the orbit of a single animated motif under the group.
This was done in attempt to animate 275 space-time groups of https://arxiv.org/abs/1703.03388
These were called Film Groups by Fletcher https://www.jstor.org/stable/3610262

Setup

Place FilmGroups.wl and FilmGroupsData.wl in the same directory as this notebook and load:
In[]:=
SetDirectory[NotebookDirectory[]];
Get["FilmGroups.wl"]

Init


The motif

Each copy of the motif displays its own internal time θ = s(t − τ): a vessel that fills once per period, its surface marked in red. The fill level is an injective function of θ mod 1, and it cannot be rotated — so two copies at different internal times always look different in a frozen frame, no matter how the pattern's own rotations act. Orientation and phase are independent readouts. The vessel is chiral and asymmetric (no accidental symmetry), and time-reversed copies drain instead of filling.
In[]:=
Row[Table[FilmGroupMotif[θ], {θ, 0, 5/6, 1/6}], Spacer[4]]
Out[]=

Animating a group

FilmGroupAnimation accepts an index 1–275, an ID like "g95", or a notation symbol from the catalog. Group #95 is 4₂4₂2, the film analogue of the space group P4₂
In[]:=
FilmGroupAnimation[95]
Out[]=
​
time
A hexagonal time screw, 6₂3₂2 (#244): the sixfold centres advance the film by a third of a period per sixth of a turn, so equal fill levels spiral around each centre.
In[]:=
FilmGroupAnimation["g244"]
Out[]=
​
time
Time reversal. In group #2 — o/m′ over the wallpaper group cm — a mirror runs the film backwards: each copy's mirror image drains as the copy fills.
In[]:=
FilmGroupAnimation[2]
Out[]=
​
time
In o/1′ (#12) the reversal fixes every site, so each vessel is drawn superimposed with its own time-reverse and shows two surface lines — one rising, one falling — meeting twice per period.
In[]:=
FilmGroupAnimation[12]
Out[]=
​
time
The animations are Manipulates with SaveDefinitions  True, so they keep working — play button and all — in a notebook opened without the package.

Window size and other options

"Cells" sets the width of the window in lattice translations; the default Automatic sizes the window so roughly 16 copies are visible. "ShowCell" overlays the lattice. A frame at a single time t is a Graphics:
In[]:=
GraphicsRow[{FilmGroupFrame[95, 0.3, "Cells" -> 2],
FilmGroupFrame[95, 0.3, "Cells" -> 4, "ShowCell" -> True]}, ImageSize -> 600]
Out[]=
"MotifScale" shrinks the stamps, "Colors" overrides any of "Body", "Outline", "Fill", "Line", "Background", and Background and ImageSize pass through to Graphics.
In[]:=
FilmGroupFrame[258, 0.25, "Cells" -> {6, 3}, "MotifScale" -> 0.9,
"Colors" -> <|"Fill" -> RGBColor["#8c4a3a"], "Line" -> RGBColor["#1a3a5c"]|>,
ImageSize -> 640]

Browsing all 275

The browser steps through the whole catalog (requires the package loaded in the current session):
In[]:=
FilmGroupBrowser[]

The catalog

FilmGroupData[] is the full catalog as a Dataset. Each entry records the notation Symbol (Conway orbifold notation with time decorations: gyration subscripts nₖ for time screws, ∼ for time glides, ′ for time reversal, c/r prefixes for space-time-centred lattices — see the atlas notation page), the crystal System, the base wallpaper group of the spatial projection, the flags ForwardTime / Product / Symmorphic, human-readable Generators, and the exact rendering spec (Basis, Ops, BasePoint).
In[]:=
FilmGroupData[]
In[]:=
Normal @ FilmGroupData[][GroupBy["System"], Length]
In[]:=
FilmGroupData[][Select[#ForwardTime && ! #Symmorphic &], Length]
In[]:=
Column @ FilmGroupData[95, "Generators"]

Exporting

Frames export to an animated GIF (here 40 frames, 4 seconds per period, matching the atlas):
Export["film-group-95.gif", FilmGroupFrames[95, 40, ImageSize -> 320],
"DisplayDurations" -> 0.1, "AnimationRepetitions" -> Infinity]

References

T. J. Fletcher, "Film Groups", Math. Gazette 40 (1956) 15–19. doi:10.2307/3610262
S. Xu, C. Wu, "Space-Time Crystal and Space-Time Group", Phys. Rev. Lett. 120, 096401 (2018). arXiv:1703.03388
C. Ke, C. Wu, "Two-Dimensional Space-Time Groups: Classification and Applications" (2026). arXiv:2604.05619
J. H. Conway, H. Burgiel, C. Goodman-Strauss, The Symmetries of Things (2008) — orbifold notation.
Interactive atlas: https://yaroslavvb.github.io/animated-groups-fable
Source: https://github.com/yaroslavvb/animated-groups-fable (wolfram/ directory; the catalog data is generated from the atlas's own, and the two renderers agree frame by frame).

CITE THIS NOTEBOOK

Film groups: 275 space-time symmetries and the crystallography of looping animations​
by Yaroslav Bulatov​
Wolfram Community, STAFF PICKS, August 11, 2026
​https://community.wolfram.com/groups/-/m/t/3778255