panel_grid — ANNOTATE compose op

• Data kinds: image2d → image2d

• Call: import fullseye as fs; fs.ledger.panel_grid(panels, labels=None, ncols=3, pad=10, label_h=32, background=0.05, title=None, title_h=0, font_size=15, min_font_size=9, font_path=None, text_color=None, border=0, border_color='neutral', scheme='okabe_ito', style=None) (to call the implementation directly, import annotate; annotate.panel_grid(panels, labels=None, ncols=3, pad=10, label_h=32, background=0.05, title=None, title_h=0, font_size=15, min_font_size=9, font_path=None, text_color=None, border=0, border_color='neutral', scheme='okabe_ito', style=None); from the registry, opsannotate.get("panel_grid"))

Usage

Lay panels out on a grid, with a label strip under each frame (montage / contact sheet).

6 generators each had their own implementation -- the most duplicated figure component in this repo. The conventions here:

• No upscaling -- small panels are centred and padded with margin. Stretching them makes it look as if "resolution that does not exist is there".

• Measure labels before drawing -- if they do not fit they are shrunk, and if that fails, an exception (via the boundary check of text_box).

• The cell size is the largest dimension over all panels, and the grid is always rectangular.

Parameters

panels : sequence of ndarray

Images to arrange ((H,W) / (H,W,C), sizes may vary).

Their channel layout must match.

labels : sequence of str or None

Heading of each panel. If label_h is 0, none are drawn.

ncols : int

Number of columns. The number of rows is ceil(n/ncols).

title : str or None

Overall title (if title_h is 0, font_size+14 is reserved automatically).

Returns

ndarray

New composite image (float [0,1]). Its size is

W = 2*pad + ncols*cw + (ncols-1)*pad,

H = title_h + 2*pad + nrows*(ch+label_h) + (nrows-1)*pad.

Raises

ValueError

panels empty / channel mismatch / ncols < 1 / negative margin /

number of labels does not match.

Detailed usage guide

• figure_annotation family guide

Background guides (the physics and conventions behind this op)

• dataset_conventions — Training-dataset conventions — COCO / YOLO / VOC and pitfalls in visual inspection

References (sample data, literature)

• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).

• Operator provenance and references — the sources of the research/methods this op family came from.

• The canonical algorithm (author, year) and its uses are named in the family usage guide above.

Runnable examples (verified samples that actually call this op)

• annotate_gallery — py -3.11 examples/annotate_gallery.py

• annotate_paper_tour — py -3.11 examples/annotate_paper_tour.py

Ops the type connects to (they accept image2d as input)

text_box · arrow · leader_line · label_points · crosshair · legend_box · color_bar · scale_bar

Same category (compose)

zoom_inset · compare_frame


*Provenance: annotate.py — ANNOTATE operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.