From 2970b4f4e3ff091a75d9364b4d47296cf6c3a644 Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Sun, 19 Apr 2026 01:18:24 -0700 Subject: [PATCH 01/25] Add inset_element class and ggplot._insets attribute Introduces the inset_element dataclass for placing a plot or composition as an overlay on a host plot at NPC coordinates, and the ggplot._insets list that stores them. Wiring into the draw and layout pipeline comes in later commits. --- plotnine/composition/__init__.py | 2 + plotnine/composition/_inset_element.py | 73 ++++++++++++++++++++++++++ plotnine/ggplot.py | 3 +- 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 plotnine/composition/_inset_element.py diff --git a/plotnine/composition/__init__.py b/plotnine/composition/__init__.py index 602b1e24c9..2fe524239d 100644 --- a/plotnine/composition/__init__.py +++ b/plotnine/composition/__init__.py @@ -1,5 +1,6 @@ from ._beside import Beside from ._compose import Compose +from ._inset_element import inset_element from ._plot_annotation import plot_annotation from ._plot_layout import plot_layout from ._plot_spacer import plot_spacer @@ -11,6 +12,7 @@ "Stack", "Beside", "Wrap", + "inset_element", "plot_annotation", "plot_layout", "plot_spacer", diff --git a/plotnine/composition/_inset_element.py b/plotnine/composition/_inset_element.py new file mode 100644 index 0000000000..55f102e8d8 --- /dev/null +++ b/plotnine/composition/_inset_element.py @@ -0,0 +1,73 @@ +from __future__ import annotations + +from copy import deepcopy +from dataclasses import dataclass +from typing import TYPE_CHECKING, Literal + +if TYPE_CHECKING: + from ..ggplot import ggplot + from ._compose import Compose + + +@dataclass +class inset_element: + """ + Place a plot as an inset within another plot + + The inset is rendered on top of the host. Adding an `inset_element` + to a composition attaches it to the most recently added plot in that + composition. + + Parameters + ---------- + obj : + The object to render as an inset. + left, bottom, right, top : + Bounding box of the inset in normalised parent coordinates, + in the range ``[0, 1]``. The bottom-left corner of the region + selected by `align_to` is ``(0, 0)`` and the top-right is + ``(1, 1)``. + align_to : + Which region of the host plot the bounding box is relative to: + + - ``"panel"`` — the data area only (default). + - ``"plot"`` — the panel plus axes, labels, and plot margins. + - ``"full"`` — everything the host plot occupies, including + any titles, captions, and legends. + """ + + obj: ggplot | Compose + left: float + bottom: float + right: float + top: float + align_to: Literal["panel", "plot", "full"] = "panel" + + def __post_init__(self): + from ..ggplot import ggplot + from ._compose import Compose + + if not isinstance(self.obj, (ggplot, Compose)): + raise TypeError( + "inset_element requires a ggplot or Compose, got " + f"{type(self.obj).__name__!r}." + ) + + if not 0.0 <= self.left < self.right <= 1.0: + raise ValueError( + "inset_element requires 0.0 <= left < right <= 1.0, got " + f"left={self.left!r}, right={self.right!r}." + ) + + if not 0.0 <= self.bottom < self.top <= 1.0: + raise ValueError( + "inset_element requires 0.0 <= bottom < top <= 1.0, got " + f"bottom={self.bottom!r}, top={self.top!r}." + ) + + def __radd__(self, other: ggplot) -> ggplot: + """ + Attach this inset to a ggplot + """ + other._insets.append(deepcopy(self)) + return other diff --git a/plotnine/ggplot.py b/plotnine/ggplot.py index 08a00ca8e2..b67cf5740b 100755 --- a/plotnine/ggplot.py +++ b/plotnine/ggplot.py @@ -55,7 +55,7 @@ from plotnine import watermark from plotnine._mpl.gridspec import p9GridSpec from plotnine._mpl.layout_manager._plot_side_space import PlotSideSpaces - from plotnine.composition import Compose + from plotnine.composition import Compose, inset_element from plotnine.coords.coord import coord from plotnine.facets.facet import facet from plotnine.typing import DataLike, FigureFormat, MimeBundle @@ -156,6 +156,7 @@ def __init__( self.environment = Environment.capture(1) self.layout = Layout() self.watermarks: list[watermark] = [] + self._insets: list[inset_element] = [] # build artefacts self._build_objs = NS(meta={}) From 241ff8e39bc107ee8e457127e1d124b74dfff2ab Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Wed, 29 Apr 2026 15:10:59 +0300 Subject: [PATCH 02/25] Draw insets into the host figure Adds ggplot._draw_insets to render each attached inset into the host's figure as the final step of draw(). Refactors _create_figure on both ggplot and Compose into independent guards for the figure and the gridspec so a pre-assigned figure (an inset reusing its host's) still flows through to gridspec creation. Adds a _zorder class default on ggplot and Compose that the inset path raises above the host. --- plotnine/composition/_compose.py | 31 +++++++++++++++-------- plotnine/ggplot.py | 43 ++++++++++++++++++++++++++------ 2 files changed, 56 insertions(+), 18 deletions(-) diff --git a/plotnine/composition/_compose.py b/plotnine/composition/_compose.py index d57c2954e7..029a459e23 100644 --- a/plotnine/composition/_compose.py +++ b/plotnine/composition/_compose.py @@ -130,6 +130,15 @@ class Compose: """ _sidespaces: CompositionSideSpaces + _zorder: int = 0 + """ + Drawing zorder for every axes in this composition + + It is propagated down the tree at draw time so sub-plots inherit their + parent's value, and raised on inset compositions so their axes paint + above the host. + """ + def __init__(self, items: list[ggplot | Compose]): # The way we handle the plots has consequences that would # prevent having a duplicate plot in the composition. @@ -461,19 +470,21 @@ def _create_figure(self): """ Create figure & gridspecs for all sub compositions """ - if hasattr(self, "figure"): - return + if not hasattr(self, "figure"): + import matplotlib.pyplot as plt - import matplotlib.pyplot as plt + from plotnine._mpl.layout_manager import PlotnineLayoutEngine - from plotnine._mpl.gridspec import p9GridSpec - from plotnine._mpl.layout_manager import PlotnineLayoutEngine + self.figure = plt.figure() + self.figure.set_layout_engine(PlotnineLayoutEngine(self)) - figure = plt.figure() - self._generate_gridspecs( - figure, p9GridSpec(1, 1, figure, nest_into=None) - ) - figure.set_layout_engine(PlotnineLayoutEngine(self)) + if not hasattr(self, "_gridspec"): + from plotnine._mpl.gridspec import p9GridSpec + + self._generate_gridspecs( + self.figure, + p9GridSpec(1, 1, self.figure, nest_into=None), + ) def _generate_gridspecs(self, figure: Figure, container_gs: p9GridSpec): from plotnine import ggplot diff --git a/plotnine/ggplot.py b/plotnine/ggplot.py index b67cf5740b..60bd234777 100755 --- a/plotnine/ggplot.py +++ b/plotnine/ggplot.py @@ -135,6 +135,14 @@ class ggplot: _sidespaces: PlotSideSpaces + _zorder: int = 0 + """ + Drawing zorder for every axes created for this plot + + The default (``0``) keeps the plot at the base layer. `_draw_insets` + raises this on inset plots so they render above their host. + """ + def __init__( self, data: Optional[DataLike] = None, @@ -373,6 +381,10 @@ def draw(self, *, show: bool = False) -> Figure: # Artist object theming self.theme.apply() + # Insets render after host theming is finalised so their + # own draw picks up a fully-realised host figure. + self._draw_insets() + return figure def _setup(self) -> Figure: @@ -387,17 +399,18 @@ def _create_figure(self): """ Create gridspec for the panels """ - if hasattr(self, "figure"): - return + if not hasattr(self, "figure"): + import matplotlib.pyplot as plt - import matplotlib.pyplot as plt + from ._mpl.layout_manager import PlotnineLayoutEngine - from ._mpl.gridspec import p9GridSpec - from ._mpl.layout_manager import PlotnineLayoutEngine + self.figure = plt.figure() + self.figure.set_layout_engine(PlotnineLayoutEngine(self)) - self.figure = plt.figure() - self._gridspec = p9GridSpec(1, 1, self.figure) - self.figure.set_layout_engine(PlotnineLayoutEngine(self)) + if not hasattr(self, "_gridspec"): + from ._mpl.gridspec import p9GridSpec + + self._gridspec = p9GridSpec(1, 1, self.figure) def _build(self): """ @@ -593,6 +606,20 @@ def _draw_watermarks(self): for wm in self.watermarks: wm.draw(self.figure) + def _draw_insets(self): + """ + Draw every inset attached to this plot into the host figure + + Each inset reuses the host's figure instead of creating its own. + The inset's zorder is raised above the host's so its axes paint + on top; for Compose insets this zorder is propagated down the + sub-tree when the composition is drawn. + """ + for inset in self._insets: + inset.obj.figure = self.figure + inset.obj._zorder = self._zorder + 1 + inset.obj.draw() + def _draw_plot_background(self): from matplotlib.lines import Line2D from matplotlib.patches import Rectangle From 2ece89130c37cc90b1bb09785167961c5006b7e7 Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Wed, 29 Apr 2026 15:47:48 +0300 Subject: [PATCH 03/25] Arrange insets within the host figure Adds PlotSideSpaces._arrange_insets, called as the final step of arrange once the host's panel/plot regions are finalised. Each inset's fractional bounding box is scaled into figure coordinates relative to its align_to region and applied to the inset's own gridspec, then a PlotSideSpaces or CompositionSideSpaces is built and arranged to lay out the inset's internal content within those bounds. Also updates inset_element's docstring to use 'fractional coordinates' instead of 'normalised parent coordinates' for terminology familiar to matplotlib users. --- .../_mpl/layout_manager/_plot_side_space.py | 43 +++++++++++++++++++ plotnine/composition/_inset_element.py | 8 ++-- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/plotnine/_mpl/layout_manager/_plot_side_space.py b/plotnine/_mpl/layout_manager/_plot_side_space.py index 2d52e08386..b31a69628b 100644 --- a/plotnine/_mpl/layout_manager/_plot_side_space.py +++ b/plotnine/_mpl/layout_manager/_plot_side_space.py @@ -772,6 +772,49 @@ def arrange(self): """ self.resize_gridspec() self.items._move_artists(self) + self._arrange_insets() + + def _arrange_insets(self): + """ + Position and arrange every inset attached to this plot + + The host's panel/plot/full region is now finalised, so the + inset's fractional bounding box is scaled into figure + coordinates and applied to the inset's own gridspec. The + inset's side-space layout then runs to lay out its content + within those bounds. + """ + from plotnine import ggplot + + from ._composition_side_space import CompositionSideSpaces + + for inset in self.plot._insets: + if inset.align_to == "panel": + (x1, y1), (x2, y2) = self.panel_area_coordinates + elif inset.align_to == "plot": + (x1, y1), (x2, y2) = self.plot_area_coordinates + else: # "full" + # Note that this isn't necessarily the figure's coordinates, + # rather the entire ggplot area. + bbox = self.plot._gridspec.bbox_relative + (x1, y1), (x2, y2) = (bbox.x0, bbox.y0), (bbox.x1, bbox.y1) + + params = GridSpecParams( + left=x1 + inset.left * (x2 - x1), + bottom=y1 + inset.bottom * (y2 - y1), + right=x1 + inset.right * (x2 - x1), + top=y1 + inset.top * (y2 - y1), + wspace=0, + hspace=0, + ) + params.validate() + inset.obj._gridspec.update_params_and_artists(params) + + if isinstance(inset.obj, ggplot): + inset.obj._sidespaces = PlotSideSpaces(inset.obj) + else: + inset.obj._sidespaces = CompositionSideSpaces(inset.obj) + inset.obj._sidespaces.arrange() def resize_gridspec(self): """ diff --git a/plotnine/composition/_inset_element.py b/plotnine/composition/_inset_element.py index 55f102e8d8..9833d06257 100644 --- a/plotnine/composition/_inset_element.py +++ b/plotnine/composition/_inset_element.py @@ -23,10 +23,10 @@ class inset_element: obj : The object to render as an inset. left, bottom, right, top : - Bounding box of the inset in normalised parent coordinates, - in the range ``[0, 1]``. The bottom-left corner of the region - selected by `align_to` is ``(0, 0)`` and the top-right is - ``(1, 1)``. + Bounding box of the inset as fractional coordinates in the + range ``[0, 1]``, relative to the host region selected by + `align_to`. The bottom-left corner of that region is + ``(0, 0)`` and the top-right is ``(1, 1)``. align_to : Which region of the host plot the bounding box is relative to: From e9b7cbc617f101bb6586318e8b29343daf52004c Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Wed, 29 Apr 2026 16:35:35 +0300 Subject: [PATCH 04/25] Set axes zorder at creation Pass the owning plot's _zorder to add_subplot in facet._make_axes so every panel axes is born at the right layer. Compose.draw propagates the composition's _zorder to its direct children before drawing, and the recursion carries the value down sub-compositions. Combined with ggplot._draw_insets raising _zorder by 1 per inset boundary, insets (including Compose insets and nested insets) end up above the host without any post-hoc subtree walk. --- plotnine/composition/_compose.py | 7 +++++++ plotnine/facets/facet.py | 4 +++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/plotnine/composition/_compose.py b/plotnine/composition/_compose.py index 029a459e23..8f7233ef72 100644 --- a/plotnine/composition/_compose.py +++ b/plotnine/composition/_compose.py @@ -549,6 +549,13 @@ def draw(self, *, show: bool = False) -> Figure: def _draw(cmp): figure = cmp._setup() + + # Propagate the composition's zorder to its direct children + # before they draw, so axes are created at the right layer. + # Recursion carries the value down sub-compositions. + for item in cmp: + item._zorder = cmp._zorder + cmp._draw_plots() for sub_cmp in cmp.iter_sub_compositions(): diff --git a/plotnine/facets/facet.py b/plotnine/facets/facet.py index ae784d8768..c9c84cd12d 100644 --- a/plotnine/facets/facet.py +++ b/plotnine/facets/facet.py @@ -399,7 +399,9 @@ def _make_axes(self) -> tuple[p9GridSpec, list[Axes]]: # Create axes it = itertools.product(range(self.nrow), range(self.ncol)) for i, (row, col) in enumerate(it): - axsarr[row, col] = self.figure.add_subplot(gs[i]) + axsarr[row, col] = self.figure.add_subplot( + gs[i], zorder=self.plot._zorder + ) # Rearrange axes # They are ordered to match the positions in the layout table From 2d15fcd8362f86d1a5e46c32f6b366811124db09 Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Wed, 29 Apr 2026 18:38:50 +0300 Subject: [PATCH 05/25] Stack inset figure-level artists above the host MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every figure-level artist owned by a plot — panel borders, titles, strip text, legends, watermarks, plus the plot/composition background and footer rects — now goes through a single _add_figure_artist helper on ggplot and Compose that offsets its zorder by the owning plot's _zorder. This guarantees an inset's whole stack paints above the host's whole stack, including the previously-missed strip backgrounds, titles, and legends. INSET_ZORDER_STEP is set to 1000 (well above the largest within-plot zorder, watermarks at 99.9) so host and inset bands never overlap. Watermark zorder is now managed entirely by plotnine; a user-supplied value is dropped with a PlotnineWarning, and watermark.draw reads its host's _zorder via the parent reference set in __radd__. plot_title and the other figure-level texts are constructed as matplotlib.text.Text and added through the same helper, dropping figure.text indirection. --- plotnine/composition/_compose.py | 44 ++++++++--- plotnine/composition/_inset_element.py | 10 +++ plotnine/facets/strips.py | 2 +- plotnine/ggplot.py | 105 ++++++++++++++----------- plotnine/guides/guides.py | 2 +- plotnine/watermark.py | 35 +++++++-- 6 files changed, 136 insertions(+), 62 deletions(-) diff --git a/plotnine/composition/_compose.py b/plotnine/composition/_compose.py index 8f7233ef72..67e081efc5 100644 --- a/plotnine/composition/_compose.py +++ b/plotnine/composition/_compose.py @@ -590,6 +590,20 @@ def _draw_plots(self): if isinstance(item, ggplot): item.draw() + def _add_figure_artist(self, artist): + """ + Add an artist to this composition's figure with the right zorder + + For a top-level composition this is a no-op offset; on an inset + composition every figure-level artist (titles, panel borders, + legends, ...) is shifted up by the composition's `_zorder` so + the inset sits wholly above the host. Returns the artist so the + call site can keep a single-statement assignment. + """ + artist.set_zorder(artist.get_zorder() + self._zorder) + self.figure.add_artist(artist) + return artist + def _draw_composition_background(self): """ Draw the background rectangle of the composition @@ -601,22 +615,27 @@ def _draw_composition_background(self): # backgrounds (which are at zorder=-1000), so the per-plot # backgrounds layer on top of it instead of being covered. zorder = -2000 - rect = Rectangle((0, 0), 0, 0, facecolor="none", zorder=zorder) - self.figure.add_artist(rect) + rect = Rectangle((0, 0), 0, 0, facecolor="none", zorder=zorder - 0.5) + self._add_figure_artist(rect) self._gridspec.patch = rect self.theme.targets.plot_background = rect if self.annotation.footer: rect = Rectangle( - (0, 0), 0, 0, facecolor="none", linewidth=0, zorder=zorder + 1 + (0, 0), + 0, + 0, + facecolor="none", + linewidth=0, + zorder=zorder - 0.4, ) - self.figure.add_artist(rect) + self._add_figure_artist(rect) self.theme.targets.plot_footer_background = rect line = Line2D( - [0, 0], [0, 0], color="none", linewidth=0, zorder=zorder + 2 + [0, 0], [0, 0], color="none", linewidth=0, zorder=zorder - 0.3 ) - self.figure.add_artist(line) + self._add_figure_artist(line) self.theme.targets.plot_footer_line = line def _draw_annotation(self): @@ -629,20 +648,23 @@ def _draw_annotation(self): if self.annotation.empty(): return - figure = self.theme.figure + from matplotlib.text import Text + targets = self.theme.targets if title := self.annotation.title: - targets.plot_title = figure.text(0, 0, title) + targets.plot_title = self._add_figure_artist(Text(text=title)) if subtitle := self.annotation.subtitle: - targets.plot_subtitle = figure.text(0, 0, subtitle) + targets.plot_subtitle = self._add_figure_artist( + Text(text=subtitle) + ) if caption := self.annotation.caption: - targets.plot_caption = figure.text(0, 0, caption) + targets.plot_caption = self._add_figure_artist(Text(text=caption)) if footer := self.annotation.footer: - targets.plot_footer = figure.text(0, 0, footer) + targets.plot_footer = self._add_figure_artist(Text(text=footer)) def save( self, diff --git a/plotnine/composition/_inset_element.py b/plotnine/composition/_inset_element.py index 9833d06257..1b04cf05e1 100644 --- a/plotnine/composition/_inset_element.py +++ b/plotnine/composition/_inset_element.py @@ -9,6 +9,16 @@ from ._compose import Compose +INSET_ZORDER_STEP = 1000 +""" +Zorder added to the host's value when an inset is drawn, so every +figure-level artist on the inset (axes, plot_background, titles, +strip text, legends, ...) sits above every figure-level artist on the +host. Must exceed the largest existing zorder used inside a single +plot — watermarks at 99.9 — so the host and inset stacks never overlap. +""" + + @dataclass class inset_element: """ diff --git a/plotnine/facets/strips.py b/plotnine/facets/strips.py index d62e038bb6..7353b74e6c 100644 --- a/plotnine/facets/strips.py +++ b/plotnine/facets/strips.py @@ -127,7 +127,7 @@ def draw(self): text = StripText(draw_info) rect = text.patch - self.figure.add_artist(text) + self.facet.plot._add_figure_artist(text) if draw_info.position == "right": targets.strip_background_y.append(rect) diff --git a/plotnine/ggplot.py b/plotnine/ggplot.py index 60bd234777..021fc0cbf5 100755 --- a/plotnine/ggplot.py +++ b/plotnine/ggplot.py @@ -516,7 +516,7 @@ def _draw_panel_borders(self): clip_path=ax.patch, clip_on=False, ) - self.figure.add_artist(rect) + self._add_figure_artist(rect) self.theme.targets.panel_border.append(rect) def _draw_layers(self): @@ -561,43 +561,39 @@ def _draw_figure_texts(self): """ Draw title, x label, y label and caption onto the figure """ - figure = self.figure - theme = self.theme - targets = theme.targets + from matplotlib.text import Text - title = self.labels.get("title", "") - subtitle = self.labels.get("subtitle", "") - caption = self.labels.get("caption", "") - tag = self.labels.get("tag", "") - footer = self.labels.get("footer", "") - - # Get the axis labels (default or specified by user) - # and let the coordinate modify them e.g. flip - labels = self.coordinates.labels( - self.layout.set_xy_labels(self.labels) - ) + targets = self.theme.targets # The locations are handled by the layout manager - if title: - targets.plot_title = figure.text(0, 0, title) + if title := self.labels.get("title", ""): + targets.plot_title = self._add_figure_artist(Text(text=title)) - if subtitle: - targets.plot_subtitle = figure.text(0, 0, subtitle) + if subtitle := self.labels.get("subtitle", ""): + targets.plot_subtitle = self._add_figure_artist( + Text(text=subtitle) + ) + + if caption := self.labels.get("caption", ""): + targets.plot_caption = self._add_figure_artist(Text(text=caption)) - if caption: - targets.plot_caption = figure.text(0, 0, caption) + if footer := self.labels.get("footer", ""): + targets.plot_footer = self._add_figure_artist(Text(text=footer)) - if footer: - targets.plot_footer = figure.text(0, 0, footer) + if tag := self.labels.get("tag", ""): + targets.plot_tag = self._add_figure_artist(Text(text=tag)) - if tag: - targets.plot_tag = figure.text(0, 0, tag) + # Get the axis labels (default or specified by user) + # and let the coordinate modify them e.g. flip + labels = self.coordinates.labels( + self.layout.set_xy_labels(self.labels) + ) if labels.x: - targets.axis_title_x = figure.text(0, 0, labels.x) + targets.axis_title_x = self._add_figure_artist(Text(text=labels.x)) if labels.y: - targets.axis_title_y = figure.text(0, 0, labels.y) + targets.axis_title_y = self._add_figure_artist(Text(text=labels.y)) def _draw_watermarks(self): """ @@ -611,39 +607,60 @@ def _draw_insets(self): Draw every inset attached to this plot into the host figure Each inset reuses the host's figure instead of creating its own. - The inset's zorder is raised above the host's so its axes paint - on top; for Compose insets this zorder is propagated down the - sub-tree when the composition is drawn. + The inset's zorder is raised by `INSET_ZORDER_STEP` so every + figure-level artist on the inset sits above the host's; for + Compose insets this zorder is propagated down the sub-tree when + the composition is drawn. """ + from .composition._inset_element import INSET_ZORDER_STEP + for inset in self._insets: inset.obj.figure = self.figure - inset.obj._zorder = self._zorder + 1 + inset.obj._zorder = self._zorder + INSET_ZORDER_STEP inset.obj.draw() + def _add_figure_artist(self, artist): + """ + Add an artist to this plot's figure with the right zorder offset + + For a top-level plot this is a no-op offset; on an inset every + figure-level artist (titles, panel borders, legends, strip text, + ...) is shifted up by the inset's `_zorder` so the inset sits + wholly above the host. Returns the artist so the call site can + keep a single-statement assignment. + """ + artist.set_zorder(artist.get_zorder() + self._zorder) + self.figure.add_artist(artist) + return artist + def _draw_plot_background(self): from matplotlib.lines import Line2D from matplotlib.patches import Rectangle - zorder = -1000 - rect = Rectangle((0, 0), 0, 0, facecolor="none", zorder=zorder) - self.figure.add_artist(rect) - self._gridspec.patch = rect - self.theme.targets.plot_background = rect + targets = self.theme.targets + + # The background sits just below this plot's own axes layer. + # _add_figure_artist offsets every figure-level artist by + # self._zorder, so for a top-level plot this stays at -0.5 + # and for an inset it sits between the host's axes and the + # inset's axes — the inset background covers the host. + targets.plot_background = self._add_figure_artist( + Rectangle((0, 0), 0, 0, facecolor="none", zorder=-0.5) + ) + self._gridspec.patch = targets.plot_background # Footer background and line only if there is a footer, and put # it on top of the plot background if self.labels.get("footer", ""): - rect = Rectangle( - (0, 0), 0, 0, facecolor="none", linewidth=0, zorder=zorder + 1 + targets.plot_footer_background = self._add_figure_artist( + Rectangle( + (0, 0), 0, 0, facecolor="none", linewidth=0, zorder=-0.4 + ) ) - self.figure.add_artist(rect) - self.theme.targets.plot_footer_background = rect - line = Line2D( - [0, 0], [0, 0], color="none", linewidth=0, zorder=zorder + 2 + targets.plot_footer_line = self._add_figure_artist( + Line2D([0, 0], [0, 0], color="none", linewidth=0, zorder=-0.3) ) - self.figure.add_artist(line) - self.theme.targets.plot_footer_line = line def _save_filename(self, ext: str) -> Path: """ diff --git a/plotnine/guides/guides.py b/plotnine/guides/guides.py index 433e5bcf58..ebd563cae6 100644 --- a/plotnine/guides/guides.py +++ b/plotnine/guides/guides.py @@ -380,7 +380,7 @@ def draw(self) -> Optional[OffsetBox]: self._apply_guide_themes(gdefs) legends = self._assemble_guides(gdefs, guide_boxes) for aob in legends.boxes: - self.plot.figure.add_artist(aob) + self.plot._add_figure_artist(aob) self.plot.theme.targets.legends = legends diff --git a/plotnine/watermark.py b/plotnine/watermark.py index b75e643a9a..7a9a7a5e56 100644 --- a/plotnine/watermark.py +++ b/plotnine/watermark.py @@ -1,6 +1,9 @@ from __future__ import annotations import typing +from warnings import warn + +from .exceptions import PlotnineWarning if typing.TYPE_CHECKING: import pathlib @@ -13,6 +16,15 @@ __all__ = ("watermark",) +_BASE_ZORDER = 99.9 +""" +Default zorder for a watermark on a top-level plot + +Plotnine manages the zorder of every figure-level artist so that insets +stack predictably above their host. +""" + + class watermark: """ Add watermark to plot @@ -29,13 +41,16 @@ class watermark: Alpha blending value. kwargs : Additional parameters passed to - [](`~matplotlib.figure.figimage`) + [](`~matplotlib.figure.figimage`). Note that ``zorder`` is + managed by plotnine and any user-supplied value is dropped. Notes ----- You can add more than one watermark to a plot. """ + _parent: p9.ggplot + def __init__( self, filename: str | pathlib.Path, @@ -45,15 +60,22 @@ def __init__( **kwargs: Any, ): self.filename = filename + if "zorder" in kwargs: + warn( + "watermark zorder is managed by plotnine; " + "the user-supplied value is being ignored.", + PlotnineWarning, + stacklevel=2, + ) + kwargs.pop("zorder") kwargs.update(xo=xo, yo=yo, alpha=alpha) - if "zorder" not in kwargs: - kwargs["zorder"] = 99.9 self.kwargs = kwargs def __radd__(self, other: p9.ggplot) -> p9.ggplot: """ Add watermark to ggplot object """ + self._parent = other other.watermarks.append(self) return other @@ -68,5 +90,8 @@ def draw(self, figure: matplotlib.figure.Figure): """ from matplotlib.image import imread - X = imread(self.filename) - figure.figimage(X, **self.kwargs) + figure.figimage( + imread(self.filename), + zorder=_BASE_ZORDER + self._parent._zorder, + **self.kwargs, + ) From e1c0bda7c617624b97ae186571095ed859c445e9 Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Mon, 4 May 2026 17:45:28 +0300 Subject: [PATCH 06/25] Use Insets container class for ggplot._insets --- plotnine/composition/_inset_element.py | 33 ++++++++++++++++++++++++++ plotnine/ggplot.py | 30 +++++++---------------- 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/plotnine/composition/_inset_element.py b/plotnine/composition/_inset_element.py index 1b04cf05e1..06cd45b5f3 100644 --- a/plotnine/composition/_inset_element.py +++ b/plotnine/composition/_inset_element.py @@ -75,9 +75,42 @@ def __post_init__(self): f"bottom={self.bottom!r}, top={self.top!r}." ) + def _setup(self, parent: ggplot): + """ + Receive the host figure and zorder from parent + """ + self.obj.figure = parent.figure + self.obj._zorder = parent._zorder + INSET_ZORDER_STEP + + def draw(self): + """ + Render this inset + """ + self.obj.draw() + def __radd__(self, other: ggplot) -> ggplot: """ Attach this inset to a ggplot """ other._insets.append(deepcopy(self)) return other + + +class Insets(list[inset_element]): + """ + List of insets attached to a ggplot + """ + + def _setup(self, parent: ggplot): + """ + Receive the host figure and zorder for every inset + """ + for inset in self: + inset._setup(parent) + + def draw(self): + """ + Render every inset attached to the host + """ + for inset in self: + inset.draw() diff --git a/plotnine/ggplot.py b/plotnine/ggplot.py index 021fc0cbf5..7ca7124efa 100755 --- a/plotnine/ggplot.py +++ b/plotnine/ggplot.py @@ -55,7 +55,7 @@ from plotnine import watermark from plotnine._mpl.gridspec import p9GridSpec from plotnine._mpl.layout_manager._plot_side_space import PlotSideSpaces - from plotnine.composition import Compose, inset_element + from plotnine.composition import Compose from plotnine.coords.coord import coord from plotnine.facets.facet import facet from plotnine.typing import DataLike, FigureFormat, MimeBundle @@ -139,8 +139,9 @@ class ggplot: """ Drawing zorder for every axes created for this plot - The default (``0``) keeps the plot at the base layer. `_draw_insets` - raises this on inset plots so they render above their host. + The default (``0``) keeps the plot at the base layer. + `inset_element._setup` raises this on inset plots so they render + above their host. """ def __init__( @@ -148,6 +149,7 @@ def __init__( data: Optional[DataLike] = None, mapping: Optional[aes] = None, ): + from .composition._inset_element import Insets from .mapping._env import Environment # Allow some sloppiness @@ -164,7 +166,7 @@ def __init__( self.environment = Environment.capture(1) self.layout = Layout() self.watermarks: list[watermark] = [] - self._insets: list[inset_element] = [] + self._insets: Insets = Insets() # build artefacts self._build_objs = NS(meta={}) @@ -383,7 +385,7 @@ def draw(self, *, show: bool = False) -> Figure: # Insets render after host theming is finalised so their # own draw picks up a fully-realised host figure. - self._draw_insets() + self._insets.draw() return figure @@ -392,6 +394,7 @@ def _setup(self) -> Figure: Setup this instance for the building process """ self._create_figure() + self._insets._setup(self) self.labels.add_defaults(self.mapping.labels) return self.figure @@ -602,23 +605,6 @@ def _draw_watermarks(self): for wm in self.watermarks: wm.draw(self.figure) - def _draw_insets(self): - """ - Draw every inset attached to this plot into the host figure - - Each inset reuses the host's figure instead of creating its own. - The inset's zorder is raised by `INSET_ZORDER_STEP` so every - figure-level artist on the inset sits above the host's; for - Compose insets this zorder is propagated down the sub-tree when - the composition is drawn. - """ - from .composition._inset_element import INSET_ZORDER_STEP - - for inset in self._insets: - inset.obj.figure = self.figure - inset.obj._zorder = self._zorder + INSET_ZORDER_STEP - inset.obj.draw() - def _add_figure_artist(self, artist): """ Add an artist to this plot's figure with the right zorder offset From 59a341b3f810082125afab823a9ff65b06716568 Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Mon, 4 May 2026 18:34:54 +0300 Subject: [PATCH 07/25] Clarify align_to region descriptions on inset_element MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous docstring placed titles/captions/legends in `"full"` and plot margins in `"plot"`. The actual region semantics are the other way around — titles/captions/legends are part of the plot region, and `"full"` adds the plot margin on top. Update the docstring to match. --- plotnine/composition/_inset_element.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plotnine/composition/_inset_element.py b/plotnine/composition/_inset_element.py index 06cd45b5f3..1d329f5cd7 100644 --- a/plotnine/composition/_inset_element.py +++ b/plotnine/composition/_inset_element.py @@ -41,9 +41,9 @@ class inset_element: Which region of the host plot the bounding box is relative to: - ``"panel"`` — the data area only (default). - - ``"plot"`` — the panel plus axes, labels, and plot margins. - - ``"full"`` — everything the host plot occupies, including - any titles, captions, and legends. + - ``"plot"`` — the panel plus axes, labels, titles, captions + and legends + - ``"full"`` — everything the host plot occupies plus plot margin """ obj: ggplot | Compose From 208068eb34e1ad73cf471d17807ff1e295d85ee6 Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Thu, 7 May 2026 14:03:38 +0300 Subject: [PATCH 08/25] Give each inset its own zorder band MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sibling insets all received the same _zorder (host._zorder + INSET_ZORDER_STEP), so their figure-level artists collided inside one band: an earlier inset's panel_border, titles, axis titles and legend sat above a later inset's panel because they had larger numeric zorders than the panel itself. The "later inset fully covers earlier" intent only held for the panel area, where equal-zorder ties broke by insertion order. inset_element._setup now takes the 1-based index among its siblings and assigns _zorder = parent._zorder + index * INSET_ZORDER_STEP, so each inset occupies its own band. Insets._setup enumerates and passes the index through. INSET_ZORDER_STEP shrinks from 1000 to 10 now that nothing inside a single plot reaches 99.9 anymore: watermark drops from 99.9 to 9, and the explicit zorder=99.1 on the legend's FlexibleAnchoredOffsetbox is removed (the mpl default of 5 is already above all decorations and below the watermark, and ggplot._add_figure_artist offsets it into the right band). The 0.5 gap between an inset's watermark (band top) and the next inset's plot_background (band bottom, -0.5) is the tightest the geometry permits and is safe — no other artist falls in it. --- plotnine/composition/_inset_element.py | 27 ++++++++++++++++---------- plotnine/guides/guides.py | 1 - plotnine/watermark.py | 6 ++++-- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/plotnine/composition/_inset_element.py b/plotnine/composition/_inset_element.py index 1d329f5cd7..6fcd80716c 100644 --- a/plotnine/composition/_inset_element.py +++ b/plotnine/composition/_inset_element.py @@ -9,13 +9,16 @@ from ._compose import Compose -INSET_ZORDER_STEP = 1000 +INSET_ZORDER_STEP = 10 """ -Zorder added to the host's value when an inset is drawn, so every -figure-level artist on the inset (axes, plot_background, titles, -strip text, legends, ...) sits above every figure-level artist on the -host. Must exceed the largest existing zorder used inside a single -plot — watermarks at 99.9 — so the host and inset stacks never overlap. +Width of the zorder band reserved for each inset + +The Nth sibling inset is drawn at `host._zorder + N * INSET_ZORDER_STEP`, +so every figure-level artist on a later inset (axes, plot_background, +titles, strip text, legends, ...) sits above every figure-level artist +on an earlier inset and the host. The step must exceed the largest +within-plot figure-level zorder — watermarks at 9 — by enough that the +next band's lowest artist (`plot_background` at -0.5) still clears it. """ @@ -75,12 +78,16 @@ def __post_init__(self): f"bottom={self.bottom!r}, top={self.top!r}." ) - def _setup(self, parent: ggplot): + def _setup(self, parent: ggplot, index: int): """ Receive the host figure and zorder from parent + + `index` is the 1-based position of this inset among its siblings. + Each sibling occupies its own zorder band so a later inset's + figure-level artists all sit above an earlier inset's. """ self.obj.figure = parent.figure - self.obj._zorder = parent._zorder + INSET_ZORDER_STEP + self.obj._zorder = parent._zorder + index * INSET_ZORDER_STEP def draw(self): """ @@ -105,8 +112,8 @@ def _setup(self, parent: ggplot): """ Receive the host figure and zorder for every inset """ - for inset in self: - inset._setup(parent) + for i, inset in enumerate(self, start=1): + inset._setup(parent, i) def draw(self): """ diff --git a/plotnine/guides/guides.py b/plotnine/guides/guides.py index ebd563cae6..302a2178f6 100644 --- a/plotnine/guides/guides.py +++ b/plotnine/guides/guides.py @@ -321,7 +321,6 @@ def _anchored_offset_box(boxes: list[PackerBase]): bbox_to_anchor=(0, 0), bbox_transform=self.plot.figure.transFigure, borderpad=0.0, - zorder=99.1, ) # Group together guides for each position diff --git a/plotnine/watermark.py b/plotnine/watermark.py index 7a9a7a5e56..a3085942c3 100644 --- a/plotnine/watermark.py +++ b/plotnine/watermark.py @@ -16,12 +16,14 @@ __all__ = ("watermark",) -_BASE_ZORDER = 99.9 +_BASE_ZORDER = 9 """ Default zorder for a watermark on a top-level plot Plotnine manages the zorder of every figure-level artist so that insets -stack predictably above their host. +stack predictably above their host. This value must stay below +`INSET_ZORDER_STEP - 0.5` so a sibling inset's `plot_background` +(at `_zorder - 0.5`) clears the watermark of the inset below it. """ From 9dc31524e0fc4cbd96c80e3a1d40a957a199ed91 Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Thu, 7 May 2026 17:59:08 +0300 Subject: [PATCH 09/25] Inherit figure_size/dpi onto insets and Compose items An inset_element's `obj` and a Compose's items share the parent's matplotlib figure, but their own theme.figure_size and dpi default independently. That caused the inset's `figure_size` themeable to resize the host figure, the inset's dpi to leak into rcParams during its draw context, and layout sites (`_plot_side_space`, `_composition_side_space`, `margin.setup`) to read inconsistent values. A new `theme._inherit_figure_props` method copies these figure-owner-only values from a parent theme. inset_element._setup calls it on the inset's theme; Compose.draw calls it on every item alongside the existing zorder propagation. Nested cases compose by recursion. --- plotnine/composition/_compose.py | 9 ++++++--- plotnine/composition/_inset_element.py | 8 ++++++++ plotnine/themes/theme.py | 14 ++++++++++++++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/plotnine/composition/_compose.py b/plotnine/composition/_compose.py index 67e081efc5..48101f5f6c 100644 --- a/plotnine/composition/_compose.py +++ b/plotnine/composition/_compose.py @@ -550,11 +550,14 @@ def draw(self, *, show: bool = False) -> Figure: def _draw(cmp): figure = cmp._setup() - # Propagate the composition's zorder to its direct children - # before they draw, so axes are created at the right layer. - # Recursion carries the value down sub-compositions. + # Propagate the composition's zorder & figure-owner-only + # theme props to its direct children before they draw, so + # axes are created at the right layer and child layout uses + # the composition's figure_size/dpi. Recursion carries the + # values down sub-compositions. for item in cmp: item._zorder = cmp._zorder + item.theme._inherit_figure_props(cmp.theme) cmp._draw_plots() diff --git a/plotnine/composition/_inset_element.py b/plotnine/composition/_inset_element.py index 6fcd80716c..1862dd5552 100644 --- a/plotnine/composition/_inset_element.py +++ b/plotnine/composition/_inset_element.py @@ -47,6 +47,13 @@ class inset_element: - ``"plot"`` — the panel plus axes, labels, titles, captions and legends - ``"full"`` — everything the host plot occupies plus plot margin + + Notes + ----- + `figure_size` and `dpi` set on the inset's theme are ignored. The + inset shares the host's figure, so these values come from the host + theme. The canvas size of the inset is determined by the bounding + box and the area it is `align_to`. """ obj: ggplot | Compose @@ -88,6 +95,7 @@ def _setup(self, parent: ggplot, index: int): """ self.obj.figure = parent.figure self.obj._zorder = parent._zorder + index * INSET_ZORDER_STEP + self.obj.theme._inherit_figure_props(parent.theme) def draw(self): """ diff --git a/plotnine/themes/theme.py b/plotnine/themes/theme.py index d32fbb03e4..b80d863624 100644 --- a/plotnine/themes/theme.py +++ b/plotnine/themes/theme.py @@ -472,6 +472,20 @@ def to_retina(self) -> theme: self._is_retina = True return self + def _inherit_figure_props(self, other: theme) -> None: + """ + Copy themeables that modify the figure + + Used when this theme is attached to a plot that does not own + its figure (an inset, or a member of a composition). Such a plot + has no figure to size or DPI; the values must come from the + figure's owner. + """ + self += theme( + figure_size=other.getp("figure_size"), + dpi=other.getp("dpi"), + ) + def _smart_title_and_subtitle_ha( self, title: str | None, subtitle: str | None ): From 7ef818bb88dd1a7dbe5abbbf327966ce12628c95 Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Fri, 8 May 2026 15:26:50 +0300 Subject: [PATCH 10/25] Add on_top parameter to inset_element --- plotnine/composition/_compose.py | 46 ++++++++++---- plotnine/composition/_inset_element.py | 87 +++++++++++++++++++++----- plotnine/ggplot.py | 41 +++++++----- plotnine/watermark.py | 16 +++-- 4 files changed, 141 insertions(+), 49 deletions(-) diff --git a/plotnine/composition/_compose.py b/plotnine/composition/_compose.py index 48101f5f6c..7c5b3af259 100644 --- a/plotnine/composition/_compose.py +++ b/plotnine/composition/_compose.py @@ -14,6 +14,7 @@ is_inline_backend, ) from .._utils.quarto import is_knitr_engine, is_quarto_environment +from ..composition._inset_element import INSET_ZORDER_STEP from ..composition._plot_annotation import plot_annotation from ..composition._plot_layout import plot_layout from ..composition._types import ComposeAddable @@ -135,8 +136,8 @@ class Compose: Drawing zorder for every axes in this composition It is propagated down the tree at draw time so sub-plots inherit their - parent's value, and raised on inset compositions so their axes paint - above the host. + parent's value, and raised or lowered on inset compositions so their + axes paint above the host. """ def __init__(self, items: list[ggplot | Compose]): @@ -598,10 +599,8 @@ def _add_figure_artist(self, artist): Add an artist to this composition's figure with the right zorder For a top-level composition this is a no-op offset; on an inset - composition every figure-level artist (titles, panel borders, - legends, ...) is shifted up by the composition's `_zorder` so - the inset sits wholly above the host. Returns the artist so the - call site can keep a single-statement assignment. + composition every figure-level artist is shifted by the + composition's `_zorder` so the inset sits in its own band. """ artist.set_zorder(artist.get_zorder() + self._zorder) self.figure.add_artist(artist) @@ -614,11 +613,32 @@ def _draw_composition_background(self): from matplotlib.lines import Line2D from matplotlib.patches import Rectangle - # The composition background sits underneath the per-plot - # backgrounds (which are at zorder=-1000), so the per-plot - # backgrounds layer on top of it instead of being covered. - zorder = -2000 - rect = Rectangle((0, 0), 0, 0, facecolor="none", zorder=zorder - 0.5) + # The composition background sits below the per-plot backgrounds. + # Two regimes, picked from `self._zorder`: + # + # - As a top-level composition (`_zorder == 0`): sit one full + # INSET_ZORDER_STEP below the deepest per-plot bg in the + # tree. Items with no below-insets give -0.5; items with + # below-insets push the floor deeper automatically, with no + # cap. + # - As an inset composition (`_zorder != 0`): `_add_figure_artist` + # shifts every artist by `self._zorder`, so a deep absolute + # anchor would land far below the host's stack and the bg + # would disappear. -0.6 sits between the host's stack ceiling + # (host_z + 9) and the items' bgs at `self._zorder - 0.5`. + if self._zorder == 0: + deepest_per_plot_bg = min( + ( + p._insets.plot_background_offset + for p in self.iter_plots_all() + ), + default=-0.5, + ) + bg_z = deepest_per_plot_bg - INSET_ZORDER_STEP + else: + bg_z = -0.6 + + rect = Rectangle((0, 0), 0, 0, facecolor="none", zorder=bg_z) self._add_figure_artist(rect) self._gridspec.patch = rect self.theme.targets.plot_background = rect @@ -630,13 +650,13 @@ def _draw_composition_background(self): 0, facecolor="none", linewidth=0, - zorder=zorder - 0.4, + zorder=bg_z + 0.1, ) self._add_figure_artist(rect) self.theme.targets.plot_footer_background = rect line = Line2D( - [0, 0], [0, 0], color="none", linewidth=0, zorder=zorder - 0.3 + [0, 0], [0, 0], color="none", linewidth=0, zorder=bg_z + 0.2 ) self._add_figure_artist(line) self.theme.targets.plot_footer_line = line diff --git a/plotnine/composition/_inset_element.py b/plotnine/composition/_inset_element.py index 1862dd5552..a207702319 100644 --- a/plotnine/composition/_inset_element.py +++ b/plotnine/composition/_inset_element.py @@ -13,12 +13,20 @@ """ Width of the zorder band reserved for each inset -The Nth sibling inset is drawn at `host._zorder + N * INSET_ZORDER_STEP`, -so every figure-level artist on a later inset (axes, plot_background, -titles, strip text, legends, ...) sits above every figure-level artist -on an earlier inset and the host. The step must exceed the largest -within-plot figure-level zorder — watermarks at 9 — by enough that the -next band's lowest artist (`plot_background` at -0.5) still clears it. +Each inset occupies its own zorder band above or below the host. With zorder +offsets relative to the host's `_zorder`: + + +20 ----- above-inset 2 + +10 ----- above-inset 1 (on_top=True) + 0 ===== host + -10 ----- below-inset 1 (on_top=False, last declared) + -20 ----- below-inset 2 (first declared) + +A band's within-plot stack runs from `plot_background` (-0.5) to +`watermark` (+9), so STEP = 10 keeps consecutive bands clear. When +the host has below-insets, `_draw_plot_background` drops the host's +`plot_background` one STEP beneath the lowest below-band, so they +all paint above it. """ @@ -27,9 +35,11 @@ class inset_element: """ Place a plot as an inset within another plot - The inset is rendered on top of the host. Adding an `inset_element` - to a composition attaches it to the most recently added plot in that - composition. + By default the inset is rendered on top of the host (`on_top=True`). + With `on_top=False` it is rendered behind the host's panel and + labels but above the host's `plot_background`. Adding an + `inset_element` to a composition attaches it to the most recently + added plot in that composition. Parameters ---------- @@ -47,6 +57,13 @@ class inset_element: - ``"plot"`` — the panel plus axes, labels, titles, captions and legends - ``"full"`` — everything the host plot occupies plus plot margin + on_top : + When `True` (default) the inset paints above the host plot. + When `False`, the inset paints between the host's + `plot_background` and the rest of the host (panel, titles, + legends, ...), so the host's panel area covers the inset. + Useful for backdrops, decorations, or branding that should + look like part of the page rather than an overlay. Notes ----- @@ -62,6 +79,7 @@ class inset_element: right: float top: float align_to: Literal["panel", "plot", "full"] = "panel" + on_top: bool = True def __post_init__(self): from ..ggplot import ggplot @@ -85,16 +103,20 @@ def __post_init__(self): f"bottom={self.bottom!r}, top={self.top!r}." ) - def _setup(self, parent: ggplot, index: int): + def _setup(self, parent: ggplot, zorder_offset: int): """ Receive the host figure and zorder from parent - `index` is the 1-based position of this inset among its siblings. - Each sibling occupies its own zorder band so a later inset's - figure-level artists all sit above an earlier inset's. + Parameters + ---------- + parent : + The host plot whose figure and zorder this inset adopts. + zorder_offset : + How to place this inset relative to the host. + Positive for above-insets, negative for below-insets. """ self.obj.figure = parent.figure - self.obj._zorder = parent._zorder + index * INSET_ZORDER_STEP + self.obj._zorder = parent._zorder + zorder_offset self.obj.theme._inherit_figure_props(parent.theme) def draw(self): @@ -119,9 +141,42 @@ class Insets(list[inset_element]): def _setup(self, parent: ggplot): """ Receive the host figure and zorder for every inset + + Later-declared insets paint above earlier-declared insets in + *both* bands: above-band stacks upward in declaration order; + below-band reverses so the last-declared inset gets the + smallest `|offset|` (closest to the host). + """ + above = [i for i in self if i.on_top] + below = [i for i in self if not i.on_top] + + for n, inset in enumerate(above, start=1): + inset._setup(parent, n * INSET_ZORDER_STEP) + + for n, inset in enumerate(reversed(below), start=1): + inset._setup(parent, -n * INSET_ZORDER_STEP) + + @property + def plot_background_offset(self) -> float: + """ + zorder offset for the host's `plot_background` + + It is a relative offset used to place the `plot_background` + below every below-inset's stack. + + Returns + ------- + : + Zorder offset relative to the host's `_zorder`. + `-0.5` when no below-insets are attached. """ - for i, inset in enumerate(self, start=1): - inset._setup(parent, i) + n_below = sum(not i.on_top for i in self) + if n_below == 0: + return -0.5 + # Sit one full band below the deepest below-inset, whose + # own plot_background lives at this offset: + deepest_below_bg = -n_below * INSET_ZORDER_STEP - 0.5 + return deepest_below_bg - INSET_ZORDER_STEP def draw(self): """ diff --git a/plotnine/ggplot.py b/plotnine/ggplot.py index 7ca7124efa..9dec274661 100755 --- a/plotnine/ggplot.py +++ b/plotnine/ggplot.py @@ -139,9 +139,9 @@ class ggplot: """ Drawing zorder for every axes created for this plot - The default (``0``) keeps the plot at the base layer. - `inset_element._setup` raises this on inset plots so they render - above their host. + The default (`0`) keeps the plot at the base layer. + For an inset, it is shifted positive / negative to render + above the host or below the host but above its `plot_background`. """ def __init__( @@ -610,10 +610,8 @@ def _add_figure_artist(self, artist): Add an artist to this plot's figure with the right zorder offset For a top-level plot this is a no-op offset; on an inset every - figure-level artist (titles, panel borders, legends, strip text, - ...) is shifted up by the inset's `_zorder` so the inset sits - wholly above the host. Returns the artist so the call site can - keep a single-statement assignment. + figure-level artist is shifted by the inset's `_zorder` so the + inset sits in its own band. """ artist.set_zorder(artist.get_zorder() + self._zorder) self.figure.add_artist(artist) @@ -624,28 +622,39 @@ def _draw_plot_background(self): from matplotlib.patches import Rectangle targets = self.theme.targets + bg_z = self._insets.plot_background_offset - # The background sits just below this plot's own axes layer. - # _add_figure_artist offsets every figure-level artist by - # self._zorder, so for a top-level plot this stays at -0.5 - # and for an inset it sits between the host's axes and the - # inset's axes — the inset background covers the host. + # The background sits below this plot's own axes layer and, + # when below-insets are present, below all of them too. + # _add_figure_artist then shifts by self._zorder so an inset's + # plot_background also clears its host's stack. targets.plot_background = self._add_figure_artist( - Rectangle((0, 0), 0, 0, facecolor="none", zorder=-0.5) + Rectangle((0, 0), 0, 0, facecolor="none", zorder=bg_z) ) self._gridspec.patch = targets.plot_background # Footer background and line only if there is a footer, and put - # it on top of the plot background + # it on top of the plot background. if self.labels.get("footer", ""): targets.plot_footer_background = self._add_figure_artist( Rectangle( - (0, 0), 0, 0, facecolor="none", linewidth=0, zorder=-0.4 + (0, 0), + 0, + 0, + facecolor="none", + linewidth=0, + zorder=bg_z + 0.1, ) ) targets.plot_footer_line = self._add_figure_artist( - Line2D([0, 0], [0, 0], color="none", linewidth=0, zorder=-0.3) + Line2D( + [0, 0], + [0, 0], + color="none", + linewidth=0, + zorder=bg_z + 0.2, + ) ) def _save_filename(self, ext: str) -> Path: diff --git a/plotnine/watermark.py b/plotnine/watermark.py index a3085942c3..fb7288e0e7 100644 --- a/plotnine/watermark.py +++ b/plotnine/watermark.py @@ -20,10 +20,18 @@ """ Default zorder for a watermark on a top-level plot -Plotnine manages the zorder of every figure-level artist so that insets -stack predictably above their host. This value must stay below -`INSET_ZORDER_STEP - 0.5` so a sibling inset's `plot_background` -(at `_zorder - 0.5`) clears the watermark of the inset below it. +The watermark sits at the top of a plot's within-band stack. It must +stay below the next band's `plot_background` so a sibling inset's bg +cleanly covers the watermark of the inset below it: + + +9.5 ----- next band's `plot_background` --+ + | 0.5 gap + +9 ----- watermark (_BASE_ZORDER) --+ + ... (rest of this band's stack) + -0.5 ----- this band's `plot_background` + +`INSET_ZORDER_STEP = 10` reserves the gap; the same step separates +below-bands when `on_top=False`. """ From 274ce91d2751859cd6122de3376dd30a2374632e Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Sat, 9 May 2026 01:00:29 +0300 Subject: [PATCH 11/25] Bind theme to its owner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace `theme._setup(figure, axs, title, subtitle)` with `theme._setup(owner)` where owner is the ggplot, Compose, or guide the theme is attached to. `theme.figure` and `theme.axs` become properties that resolve to the owner's current state at access time, so theme setup no longer requires axes to exist beforehand — they're read lazily at apply time. This removes the ordering constraint that coupled theme setup to facet.setup, and drops the vestigial `theme.plot` annotation that was never assigned or read. --- plotnine/composition/_compose.py | 7 +-- plotnine/ggplot.py | 7 +-- plotnine/guides/guide.py | 7 ++- plotnine/themes/theme.py | 85 +++++++++++++++++++++++--------- 4 files changed, 71 insertions(+), 35 deletions(-) diff --git a/plotnine/composition/_compose.py b/plotnine/composition/_compose.py index 7c5b3af259..c8d386c965 100644 --- a/plotnine/composition/_compose.py +++ b/plotnine/composition/_compose.py @@ -572,12 +572,7 @@ def _draw(cmp): # whole composition is applied last (outside _draw). with plot_composition_context(self, show): figure = _draw(self) - self.theme._setup( - self.figure, - None, - self.annotation.title, - self.annotation.subtitle, - ) + self.theme._setup(self) self._draw_annotation() self._draw_composition_background() self.theme.apply() diff --git a/plotnine/ggplot.py b/plotnine/ggplot.py index 9dec274661..656d5e5171 100755 --- a/plotnine/ggplot.py +++ b/plotnine/ggplot.py @@ -364,12 +364,7 @@ def draw(self, *, show: bool = False) -> Figure: # setup self._sub_gridspec, self.axs = self.facet.setup(self) self.guides._setup(self) - self.theme._setup( - figure, - self.axs, - self.labels.title, - self.labels.subtitle, - ) + self.theme._setup(self) # Drawing self._draw_layers() diff --git a/plotnine/guides/guide.py b/plotnine/guides/guide.py index 7a426f5938..ac4aa7d467 100644 --- a/plotnine/guides/guide.py +++ b/plotnine/guides/guide.py @@ -14,6 +14,7 @@ from typing import Literal, Optional, Sequence, TypeAlias import pandas as pd + from matplotlib.figure import Figure from matplotlib.offsetbox import PackerBase from typing_extensions import Self @@ -71,6 +72,9 @@ class guide(ABC, metaclass=Register): # Non-Parameter Attributes available_aes: set[str] = field(init=False, default_factory=set) + # Set in `setup()`; the guide's theme reads it via `self.owner.figure`. + figure: Figure = field(init=False) + def __post_init__(self): self.hash: str self.key: pd.DataFrame @@ -113,8 +117,9 @@ def setup(self, guides: guides): """ # guide theme has priority and its targets are tracked # independently. + self.figure = guides.plot.figure self.theme = guides.plot.theme + self.theme - self.theme._setup(guides.plot.figure) + self.theme._setup(self) self.plot_layers = guides.plot.layers self.plot_mapping = guides.plot.mapping self.elements = self._elements_cls(self.theme, self) diff --git a/plotnine/themes/theme.py b/plotnine/themes/theme.py index b80d863624..6ad76b3cf1 100644 --- a/plotnine/themes/theme.py +++ b/plotnine/themes/theme.py @@ -18,6 +18,8 @@ from typing_extensions import Self from plotnine import ggplot + from plotnine.composition import Compose + from plotnine.guides.guide import guide from .elements import margin @@ -94,16 +96,13 @@ class theme: complete: bool - # This is set when the figure is created, - # it is useful at legend drawing time and - # when applying the theme. - plot: ggplot - figure: Figure - axs: list[Axes] + # The ggplot, Compose, or guide this theme is bound to. + # Set in ._setup; figure and axs are derived from it. + owner: ggplot | Compose | guide # Dictionary to collect matplotlib objects that will # be targeted for theming by the themeables - # It is initialised in the setup method. + # It is initialised in the ._setup method. targets: ThemeTargets _is_retina = False @@ -300,32 +299,74 @@ def apply(self): for th in self.T.values(): th.apply(self) - def _setup( - self, - figure: Figure, - axs: list[Axes] | None = None, - title: str | None = None, - subtitle: str | None = None, - ): + def _setup(self, owner: ggplot | Compose | guide): """ - Setup theme for applying + Bind this theme to its owner + + `theme.figure` and `theme.axs` resolve to the owner's current state + at access time, so this method can run before the owner's axes are + created — they will be present by the time `theme.apply()` reads + `theme.axs`. - This method will be called when the figure and axes have been created - but before any plotting or other artists have been added to the - figure. This method gives the theme and the elements references to - the figure and/or axes. + `targets` is initialised here. Re-calling `_setup` rebinds + `self.owner` and re-creates `targets`. - It also initialises where the artists to be themed will be stored. + Parameters + ---------- + owner : + The plot, composition or guide this theme is attached to. """ - self.figure = figure - self.axs = axs if axs is not None else [] + self.owner = owner + title, subtitle = self._owner_title_subtitle() if title or subtitle: self._smart_title_and_subtitle_ha(title, subtitle) self.targets = ThemeTargets() self.T.setup(self) + @property + def figure(self) -> Figure: + """ + Matplotlib figure the theme renders onto + + Resolves to the owner's figure. All three owner types + (ggplot, Compose, guide) expose `figure` directly. + """ + return self.owner.figure + + @property + def axs(self) -> list[Axes]: + """ + Axes the theme iterates over at apply time + + Empty for `Compose` and `guide` owners — only ggplot has + per-panel axes. Reads the owner's current `axs` lazily, + so this property reflects post-`facet.setup` state even + if `_setup` ran earlier. + """ + from ..ggplot import ggplot + + if isinstance(self.owner, ggplot): + return self.owner.axs + return [] + + def _owner_title_subtitle(self) -> tuple[str | None, str | None]: + """ + Title and subtitle text from the owner + + ggplot stores these on `labels`; Compose stores them on + `annotation`; guide has neither. + """ + from ..composition._compose import Compose + from ..ggplot import ggplot + + if isinstance(self.owner, ggplot): + return self.owner.labels.title, self.owner.labels.subtitle + if isinstance(self.owner, Compose): + return self.owner.annotation.title, self.owner.annotation.subtitle + return None, None + @property def rcParams(self): """ From cb36e01cb04861a4624c38d88af308acb6a3342e Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Sat, 9 May 2026 18:27:02 +0300 Subject: [PATCH 12/25] Introduce p9Figure with dormant zorder stamping MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a `Figure` subclass that, when `_stamping` is enabled, stamps each figure-level artist with a strictly increasing zorder so insertion order dictates paint order. The override covers `add_artist`, `add_subplot`, `add_axes`, `figimage`, and `text` — the entry points plotnine actually uses. Stamping defaults to off, so plotnine's existing zorder constants keep controlling layering. This is groundwork for the upcoming restructure of `ggplot.draw()` and `Compose._draw_composition` into semantic insertion order, after which the explicit zorder bookkeeping (INSET_ZORDER_STEP, _zorder fields, plot_background_offset, _BASE_ZORDER, etc.) can be removed. Wire `p9Figure` in as the `FigureClass` at every plotnine figure creation site: `ggplot._create_figure`, `Compose._create_figure`, and `PlotnineAnimation`. --- plotnine/_mpl/figure.py | 51 ++++++++++++++++++++++++++++++++ plotnine/animation.py | 4 ++- plotnine/composition/_compose.py | 3 +- plotnine/ggplot.py | 3 +- 4 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 plotnine/_mpl/figure.py diff --git a/plotnine/_mpl/figure.py b/plotnine/_mpl/figure.py new file mode 100644 index 0000000000..20566d5f1e --- /dev/null +++ b/plotnine/_mpl/figure.py @@ -0,0 +1,51 @@ +from __future__ import annotations + +from typing import TypeVar + +from matplotlib.artist import Artist +from matplotlib.figure import Figure + +TArtist = TypeVar("TArtist", bound=Artist) + + +class p9Figure(Figure): + """ + Figure for plotnine plots + + It stamps figure-level artists (added through the public methods: + `add_*`, `figimage` and `text`) with strictly increasing zorders, + allowing insertion order to dictates paint order, since matplotlib + stable-sorts by zorder before rendering. + + For now stamping is gated by `_stamping` as the refactoring goes on. + """ + + _next_zorder: int + _stamping: bool + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # figure.patch sits at zorder 1; start above it. + self._next_zorder = 2 + self._stamping = False + + def _stamp(self, artist: TArtist) -> TArtist: + if self._stamping: + artist.set_zorder(self._next_zorder) + self._next_zorder += 1 + return artist + + def add_artist(self, artist, *args, **kwargs): + return self._stamp(super().add_artist(artist, *args, **kwargs)) + + def add_subplot(self, *args, **kwargs): + return self._stamp(super().add_subplot(*args, **kwargs)) + + def add_axes(self, *args, **kwargs): + return self._stamp(super().add_axes(*args, **kwargs)) + + def figimage(self, *args, **kwargs): + return self._stamp(super().figimage(*args, **kwargs)) + + def text(self, *args, **kwargs): + return self._stamp(super().text(*args, **kwargs)) diff --git a/plotnine/animation.py b/plotnine/animation.py index 88abc1666d..fd9263bb26 100644 --- a/plotnine/animation.py +++ b/plotnine/animation.py @@ -213,7 +213,9 @@ def check_scale_limits(scales: list[scale], frame_no: int): artists.append(get_frame_artists(axs)) if figure is None: - figure = plt.figure() + from plotnine._mpl.figure import p9Figure + + figure = plt.figure(FigureClass=p9Figure) # Prevent Jupyter from plotting any static figure plt.close(figure) diff --git a/plotnine/composition/_compose.py b/plotnine/composition/_compose.py index c8d386c965..ea8ca94620 100644 --- a/plotnine/composition/_compose.py +++ b/plotnine/composition/_compose.py @@ -474,9 +474,10 @@ def _create_figure(self): if not hasattr(self, "figure"): import matplotlib.pyplot as plt + from plotnine._mpl.figure import p9Figure from plotnine._mpl.layout_manager import PlotnineLayoutEngine - self.figure = plt.figure() + self.figure = plt.figure(FigureClass=p9Figure) self.figure.set_layout_engine(PlotnineLayoutEngine(self)) if not hasattr(self, "_gridspec"): diff --git a/plotnine/ggplot.py b/plotnine/ggplot.py index 656d5e5171..cf53685dbb 100755 --- a/plotnine/ggplot.py +++ b/plotnine/ggplot.py @@ -400,9 +400,10 @@ def _create_figure(self): if not hasattr(self, "figure"): import matplotlib.pyplot as plt + from ._mpl.figure import p9Figure from ._mpl.layout_manager import PlotnineLayoutEngine - self.figure = plt.figure() + self.figure = plt.figure(FigureClass=p9Figure) self.figure.set_layout_engine(PlotnineLayoutEngine(self)) if not hasattr(self, "_gridspec"): From bb416108aaf77f0aecc266be974638598595ac19 Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Sat, 9 May 2026 18:35:45 +0300 Subject: [PATCH 13/25] Split Insets.draw into "above" and "below" bands MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `Insets.draw()` now requires `which="above"` or `which="below"` and renders only that band's insets. Below-insets render last-declared first (closest to the host), above-insets in declaration order — both filters that were previously implicit in the per-inset zorder offsets. Update the single call site in `ggplot.draw()` to issue both calls back-to-back. Visual output is unchanged: explicit zorders still control paint order, the new method only changes the *sequence* of `add_artist` calls within each band. Groundwork for the upcoming `ggplot.draw()` restructure, where `draw(which="below")` will move to right after `_draw_plot_background` and `draw(which="above")` to the very end of the pipeline, so insertion order matches paint order. --- plotnine/composition/_inset_element.py | 18 +++++++++++++++--- plotnine/ggplot.py | 3 ++- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/plotnine/composition/_inset_element.py b/plotnine/composition/_inset_element.py index a207702319..46cf022ee6 100644 --- a/plotnine/composition/_inset_element.py +++ b/plotnine/composition/_inset_element.py @@ -178,9 +178,21 @@ def plot_background_offset(self) -> float: deepest_below_bg = -n_below * INSET_ZORDER_STEP - 0.5 return deepest_below_bg - INSET_ZORDER_STEP - def draw(self): + def draw(self, which: Literal["above", "below"]): """ - Render every inset attached to the host + Render insets in a single band, in paint order + + Parameters + ---------- + which : + ``"above"`` paints above-insets only, in declaration + order. ``"below"`` paints below-insets only, + last-declared first so it lands closest to the host. """ - for inset in self: + if which == "above": + insets = [inset for inset in self if inset.on_top] + else: + insets = [inset for inset in self if not inset.on_top][::-1] + + for inset in insets: inset.draw() diff --git a/plotnine/ggplot.py b/plotnine/ggplot.py index cf53685dbb..f62b0d5488 100755 --- a/plotnine/ggplot.py +++ b/plotnine/ggplot.py @@ -380,7 +380,8 @@ def draw(self, *, show: bool = False) -> Figure: # Insets render after host theming is finalised so their # own draw picks up a fully-realised host figure. - self._insets.draw() + self._insets.draw(which="below") + self._insets.draw(which="above") return figure From 7048409151d1747ed4423dc2481150ca8397a451 Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Sat, 9 May 2026 23:18:38 +0300 Subject: [PATCH 14/25] Reorder ggplot.draw() to semantic paint order MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move `_draw_plot_background` and `_insets.draw(which="below")` to the top of the draw pipeline, ahead of `facet.setup` (axes creation). Above-insets stay at the very end. The new order is bg → below-insets → axes → host stack → above-insets, matching the order each artist should paint. Visual output is unchanged because explicit zorders still control layering; this reorder is the no-op step that lets Step 5 swap zorder bookkeeping for insertion-order stamping. Theme and guides setup are axes-lazy (`theme._setup` since 274ce91d2; `guides._setup` always was), so deferring `facet.setup` past them is safe. --- plotnine/ggplot.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/plotnine/ggplot.py b/plotnine/ggplot.py index f62b0d5488..40a328970c 100755 --- a/plotnine/ggplot.py +++ b/plotnine/ggplot.py @@ -362,25 +362,24 @@ def draw(self, *, show: bool = False) -> Figure: self._build() # setup - self._sub_gridspec, self.axs = self.facet.setup(self) self.guides._setup(self) self.theme._setup(self) - # Drawing + # Drawing (order matters) + self._draw_plot_background() + self._insets.draw(which="below") + + self._sub_gridspec, self.axs = self.facet.setup(self) self._draw_layers() self._draw_panel_borders() self._draw_breaks_and_labels() self.guides.draw() self._draw_figure_texts() self._draw_watermarks() - self._draw_plot_background() # Artist object theming self.theme.apply() - # Insets render after host theming is finalised so their - # own draw picks up a fully-realised host figure. - self._insets.draw(which="below") self._insets.draw(which="above") return figure From 26ef1771ff5700ccc06110a504056938f5d08b3f Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Sat, 9 May 2026 23:30:52 +0300 Subject: [PATCH 15/25] Reorder Compose.draw to semantic paint order MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pull `_setup`, `theme._setup`, and `_draw_composition_background` to the head of the draw pipeline, before items render. Items (plots and nested sub-compositions) draw next, then the annotation overlay, then `theme.apply` populates final styling. The inner recursion is renamed to `_draw_items` and only walks plots and sub-compositions — the outer composition's bg / annotation / theme are now handled at the top level. Visual output unchanged; explicit zorders still control layering. This is the Compose-side mirror of the ggplot.draw() reorder so both pipelines insert artists in semantic order before Step 5 flips on insertion-order stamping. --- plotnine/composition/_compose.py | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/plotnine/composition/_compose.py b/plotnine/composition/_compose.py index ea8ca94620..f385fb6675 100644 --- a/plotnine/composition/_compose.py +++ b/plotnine/composition/_compose.py @@ -549,33 +549,26 @@ def draw(self, *, show: bool = False) -> Figure: Matplotlib figure """ - def _draw(cmp): - figure = cmp._setup() - + def _draw_items(cmp): # Propagate the composition's zorder & figure-owner-only - # theme props to its direct children before they draw, so - # axes are created at the right layer and child layout uses - # the composition's figure_size/dpi. Recursion carries the - # values down sub-compositions. + # theme props to its direct children, so axes are created + # at the right layer and child layout uses the composition's + # figure_size/dpi. Then walk plots and sub-compositions. for item in cmp: item._zorder = cmp._zorder item.theme._inherit_figure_props(cmp.theme) - cmp._draw_plots() - for sub_cmp in cmp.iter_sub_compositions(): - _draw(sub_cmp) + sub_cmp._setup() + _draw_items(sub_cmp) - return figure - - # As the plot border and plot background apply to the entire - # composition and not the sub compositions, the theme of the - # whole composition is applied last (outside _draw). + # Drawing (order matters) with plot_composition_context(self, show): - figure = _draw(self) + figure = self._setup() self.theme._setup(self) - self._draw_annotation() self._draw_composition_background() + _draw_items(self) + self._draw_annotation() self.theme.apply() return figure From 772826d4d1d7d1fae4a8bcb81270109daf723b22 Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Sat, 9 May 2026 23:49:09 +0300 Subject: [PATCH 16/25] Replace flat-zorder bookkeeping with insertion-order stamping Turn on `p9Figure`'s zorder stamping unconditionally and delete the band-allocation machinery the explicit zorders used to implement. Every figure-level artist now gets the next stamp on insertion, so paint order = the order plotnine adds artists to the figure. Removed: - `INSET_ZORDER_STEP` and the per-band offset math in `Insets._setup` and `inset_element._setup`. Insets just inherit the host's figure now; the band placement is what insertion order produces. - `Insets.plot_background_offset` and the host-bg offset that used to lower the host beneath every below-inset. - `_zorder` field on `ggplot` and `Compose`, and the `_add_figure_artist` helpers that shifted artist zorders by it. Callers go through `figure.add_artist` directly. - `_BASE_ZORDER` in `watermark.py` and the `zorder=` arithmetic on the `figimage` call. - All `bg_z` / `bg_z + 0.1` / `bg_z + 0.2` constants in `_draw_plot_background` and `_draw_composition_background`. - `zorder=self.plot._zorder` on the facet's `add_subplot`. This unblocks below-insets attached to ggplots inside an inset Compose: the case the previous scheme couldn't represent because its single `STEP=10` band had no slack below the panel. Insertion order has no such cap; arbitrary nesting works. `p9Figure.add_artist` is now typed as `(artist: TArtist) -> TArtist` so call sites preserve the precise artist type. `ggplot.figure` and `Compose.figure` are annotated as `p9Figure` so pyright picks up the narrower signature; one `cast` at each `plt.figure(...)` site bridges matplotlib's typing. Existing baselines pass unchanged: steps 3 and 4 already established the correct insertion order, so flipping stamping on is a visual no-op. --- plotnine/_mpl/figure.py | 23 +++---- plotnine/composition/_compose.py | 94 +++++--------------------- plotnine/composition/_inset_element.py | 70 ++----------------- plotnine/facets/facet.py | 4 +- plotnine/facets/strips.py | 2 +- plotnine/ggplot.py | 80 ++++++---------------- plotnine/guides/guides.py | 2 +- plotnine/watermark.py | 25 +------ 8 files changed, 57 insertions(+), 243 deletions(-) diff --git a/plotnine/_mpl/figure.py b/plotnine/_mpl/figure.py index 20566d5f1e..07fc809b6c 100644 --- a/plotnine/_mpl/figure.py +++ b/plotnine/_mpl/figure.py @@ -12,31 +12,28 @@ class p9Figure(Figure): """ Figure for plotnine plots - It stamps figure-level artists (added through the public methods: - `add_*`, `figimage` and `text`) with strictly increasing zorders, - allowing insertion order to dictates paint order, since matplotlib - stable-sorts by zorder before rendering. - - For now stamping is gated by `_stamping` as the refactoring goes on. + Stamps figure-level artists (added through the public methods + ``add_artist``, ``add_subplot``, ``add_axes``, ``figimage``, + ``text``) with strictly increasing zorders, so insertion order + dictates paint order — matplotlib stable-sorts by zorder before + rendering. """ _next_zorder: int - _stamping: bool def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # figure.patch sits at zorder 1; start above it. self._next_zorder = 2 - self._stamping = False def _stamp(self, artist: TArtist) -> TArtist: - if self._stamping: - artist.set_zorder(self._next_zorder) - self._next_zorder += 1 + artist.set_zorder(self._next_zorder) + self._next_zorder += 1 return artist - def add_artist(self, artist, *args, **kwargs): - return self._stamp(super().add_artist(artist, *args, **kwargs)) + def add_artist(self, artist: TArtist, *args, **kwargs) -> TArtist: + super().add_artist(artist, *args, **kwargs) + return self._stamp(artist) def add_subplot(self, *args, **kwargs): return self._stamp(super().add_subplot(*args, **kwargs)) diff --git a/plotnine/composition/_compose.py b/plotnine/composition/_compose.py index f385fb6675..c1bb32cfbb 100644 --- a/plotnine/composition/_compose.py +++ b/plotnine/composition/_compose.py @@ -14,7 +14,6 @@ is_inline_backend, ) from .._utils.quarto import is_knitr_engine, is_quarto_environment -from ..composition._inset_element import INSET_ZORDER_STEP from ..composition._plot_annotation import plot_annotation from ..composition._plot_layout import plot_layout from ..composition._types import ComposeAddable @@ -27,6 +26,7 @@ from matplotlib.figure import Figure from typing_extensions import Self + from plotnine._mpl.figure import p9Figure from plotnine._mpl.gridspec import p9GridSpec from plotnine._mpl.layout_manager._composition_side_space import ( CompositionSideSpaces, @@ -103,7 +103,7 @@ class Compose: """ # These are created in the ._create_figure - figure: Figure + figure: p9Figure _gridspec: p9GridSpec """ Gridspec (1x1) that contains the annotations and the composition items @@ -131,15 +131,6 @@ class Compose: """ _sidespaces: CompositionSideSpaces - _zorder: int = 0 - """ - Drawing zorder for every axes in this composition - - It is propagated down the tree at draw time so sub-plots inherit their - parent's value, and raised or lowered on inset compositions so their - axes paint above the host. - """ - def __init__(self, items: list[ggplot | Compose]): # The way we handle the plots has consequences that would # prevent having a duplicate plot in the composition. @@ -477,7 +468,7 @@ def _create_figure(self): from plotnine._mpl.figure import p9Figure from plotnine._mpl.layout_manager import PlotnineLayoutEngine - self.figure = plt.figure(FigureClass=p9Figure) + self.figure = cast("p9Figure", plt.figure(FigureClass=p9Figure)) self.figure.set_layout_engine(PlotnineLayoutEngine(self)) if not hasattr(self, "_gridspec"): @@ -488,7 +479,7 @@ def _create_figure(self): p9GridSpec(1, 1, self.figure, nest_into=None), ) - def _generate_gridspecs(self, figure: Figure, container_gs: p9GridSpec): + def _generate_gridspecs(self, figure: p9Figure, container_gs: p9GridSpec): from plotnine import ggplot from plotnine._mpl.gridspec import p9GridSpec @@ -550,12 +541,11 @@ def draw(self, *, show: bool = False) -> Figure: """ def _draw_items(cmp): - # Propagate the composition's zorder & figure-owner-only - # theme props to its direct children, so axes are created - # at the right layer and child layout uses the composition's - # figure_size/dpi. Then walk plots and sub-compositions. + # Propagate figure-owner-only theme props (figure_size, + # dpi, ...) onto direct children so child layout uses + # the composition's values. Then walk plots and + # sub-compositions. for item in cmp: - item._zorder = cmp._zorder item.theme._inherit_figure_props(cmp.theme) cmp._draw_plots() for sub_cmp in cmp.iter_sub_compositions(): @@ -583,18 +573,6 @@ def _draw_plots(self): if isinstance(item, ggplot): item.draw() - def _add_figure_artist(self, artist): - """ - Add an artist to this composition's figure with the right zorder - - For a top-level composition this is a no-op offset; on an inset - composition every figure-level artist is shifted by the - composition's `_zorder` so the inset sits in its own band. - """ - artist.set_zorder(artist.get_zorder() + self._zorder) - self.figure.add_artist(artist) - return artist - def _draw_composition_background(self): """ Draw the background rectangle of the composition @@ -602,52 +580,18 @@ def _draw_composition_background(self): from matplotlib.lines import Line2D from matplotlib.patches import Rectangle - # The composition background sits below the per-plot backgrounds. - # Two regimes, picked from `self._zorder`: - # - # - As a top-level composition (`_zorder == 0`): sit one full - # INSET_ZORDER_STEP below the deepest per-plot bg in the - # tree. Items with no below-insets give -0.5; items with - # below-insets push the floor deeper automatically, with no - # cap. - # - As an inset composition (`_zorder != 0`): `_add_figure_artist` - # shifts every artist by `self._zorder`, so a deep absolute - # anchor would land far below the host's stack and the bg - # would disappear. -0.6 sits between the host's stack ceiling - # (host_z + 9) and the items' bgs at `self._zorder - 0.5`. - if self._zorder == 0: - deepest_per_plot_bg = min( - ( - p._insets.plot_background_offset - for p in self.iter_plots_all() - ), - default=-0.5, - ) - bg_z = deepest_per_plot_bg - INSET_ZORDER_STEP - else: - bg_z = -0.6 - - rect = Rectangle((0, 0), 0, 0, facecolor="none", zorder=bg_z) - self._add_figure_artist(rect) + rect = Rectangle((0, 0), 0, 0, facecolor="none") + self.figure.add_artist(rect) self._gridspec.patch = rect self.theme.targets.plot_background = rect if self.annotation.footer: - rect = Rectangle( - (0, 0), - 0, - 0, - facecolor="none", - linewidth=0, - zorder=bg_z + 0.1, - ) - self._add_figure_artist(rect) + rect = Rectangle((0, 0), 0, 0, facecolor="none", linewidth=0) + self.figure.add_artist(rect) self.theme.targets.plot_footer_background = rect - line = Line2D( - [0, 0], [0, 0], color="none", linewidth=0, zorder=bg_z + 0.2 - ) - self._add_figure_artist(line) + line = Line2D([0, 0], [0, 0], color="none", linewidth=0) + self.figure.add_artist(line) self.theme.targets.plot_footer_line = line def _draw_annotation(self): @@ -665,18 +609,16 @@ def _draw_annotation(self): targets = self.theme.targets if title := self.annotation.title: - targets.plot_title = self._add_figure_artist(Text(text=title)) + targets.plot_title = self.figure.add_artist(Text(text=title)) if subtitle := self.annotation.subtitle: - targets.plot_subtitle = self._add_figure_artist( - Text(text=subtitle) - ) + targets.plot_subtitle = self.figure.add_artist(Text(text=subtitle)) if caption := self.annotation.caption: - targets.plot_caption = self._add_figure_artist(Text(text=caption)) + targets.plot_caption = self.figure.add_artist(Text(text=caption)) if footer := self.annotation.footer: - targets.plot_footer = self._add_figure_artist(Text(text=footer)) + targets.plot_footer = self.figure.add_artist(Text(text=footer)) def save( self, diff --git a/plotnine/composition/_inset_element.py b/plotnine/composition/_inset_element.py index 46cf022ee6..263b6bd823 100644 --- a/plotnine/composition/_inset_element.py +++ b/plotnine/composition/_inset_element.py @@ -9,27 +9,6 @@ from ._compose import Compose -INSET_ZORDER_STEP = 10 -""" -Width of the zorder band reserved for each inset - -Each inset occupies its own zorder band above or below the host. With zorder -offsets relative to the host's `_zorder`: - - +20 ----- above-inset 2 - +10 ----- above-inset 1 (on_top=True) - 0 ===== host - -10 ----- below-inset 1 (on_top=False, last declared) - -20 ----- below-inset 2 (first declared) - -A band's within-plot stack runs from `plot_background` (-0.5) to -`watermark` (+9), so STEP = 10 keeps consecutive bands clear. When -the host has below-insets, `_draw_plot_background` drops the host's -`plot_background` one STEP beneath the lowest below-band, so they -all paint above it. -""" - - @dataclass class inset_element: """ @@ -103,20 +82,16 @@ def __post_init__(self): f"bottom={self.bottom!r}, top={self.top!r}." ) - def _setup(self, parent: ggplot, zorder_offset: int): + def _setup(self, parent: ggplot): """ - Receive the host figure and zorder from parent + Receive the host figure and figure-owner-only theme props Parameters ---------- parent : - The host plot whose figure and zorder this inset adopts. - zorder_offset : - How to place this inset relative to the host. - Positive for above-insets, negative for below-insets. + The host plot whose figure this inset adopts. """ self.obj.figure = parent.figure - self.obj._zorder = parent._zorder + zorder_offset self.obj.theme._inherit_figure_props(parent.theme) def draw(self): @@ -140,43 +115,10 @@ class Insets(list[inset_element]): def _setup(self, parent: ggplot): """ - Receive the host figure and zorder for every inset - - Later-declared insets paint above earlier-declared insets in - *both* bands: above-band stacks upward in declaration order; - below-band reverses so the last-declared inset gets the - smallest `|offset|` (closest to the host). - """ - above = [i for i in self if i.on_top] - below = [i for i in self if not i.on_top] - - for n, inset in enumerate(above, start=1): - inset._setup(parent, n * INSET_ZORDER_STEP) - - for n, inset in enumerate(reversed(below), start=1): - inset._setup(parent, -n * INSET_ZORDER_STEP) - - @property - def plot_background_offset(self) -> float: - """ - zorder offset for the host's `plot_background` - - It is a relative offset used to place the `plot_background` - below every below-inset's stack. - - Returns - ------- - : - Zorder offset relative to the host's `_zorder`. - `-0.5` when no below-insets are attached. + Inherit the host figure and figure-owner-only theme props """ - n_below = sum(not i.on_top for i in self) - if n_below == 0: - return -0.5 - # Sit one full band below the deepest below-inset, whose - # own plot_background lives at this offset: - deepest_below_bg = -n_below * INSET_ZORDER_STEP - 0.5 - return deepest_below_bg - INSET_ZORDER_STEP + for inset in self: + inset._setup(parent) def draw(self, which: Literal["above", "below"]): """ diff --git a/plotnine/facets/facet.py b/plotnine/facets/facet.py index c9c84cd12d..ae784d8768 100644 --- a/plotnine/facets/facet.py +++ b/plotnine/facets/facet.py @@ -399,9 +399,7 @@ def _make_axes(self) -> tuple[p9GridSpec, list[Axes]]: # Create axes it = itertools.product(range(self.nrow), range(self.ncol)) for i, (row, col) in enumerate(it): - axsarr[row, col] = self.figure.add_subplot( - gs[i], zorder=self.plot._zorder - ) + axsarr[row, col] = self.figure.add_subplot(gs[i]) # Rearrange axes # They are ordered to match the positions in the layout table diff --git a/plotnine/facets/strips.py b/plotnine/facets/strips.py index 7353b74e6c..075912bfb7 100644 --- a/plotnine/facets/strips.py +++ b/plotnine/facets/strips.py @@ -127,7 +127,7 @@ def draw(self): text = StripText(draw_info) rect = text.patch - self.facet.plot._add_figure_artist(text) + self.facet.plot.figure.add_artist(text) if draw_info.position == "right": targets.strip_background_y.append(rect) diff --git a/plotnine/ggplot.py b/plotnine/ggplot.py index 40a328970c..918977a26e 100755 --- a/plotnine/ggplot.py +++ b/plotnine/ggplot.py @@ -53,6 +53,7 @@ from typing_extensions import Self from plotnine import watermark + from plotnine._mpl.figure import p9Figure from plotnine._mpl.gridspec import p9GridSpec from plotnine._mpl.layout_manager._plot_side_space import PlotSideSpaces from plotnine.composition import Compose @@ -104,7 +105,7 @@ class ggplot: by pickled objects should not reference variables in the namespace. """ - figure: Figure + figure: p9Figure axs: list[Axes] _gridspec: p9GridSpec """ @@ -135,15 +136,6 @@ class ggplot: _sidespaces: PlotSideSpaces - _zorder: int = 0 - """ - Drawing zorder for every axes created for this plot - - The default (`0`) keeps the plot at the base layer. - For an inset, it is shifted positive / negative to render - above the host or below the host but above its `plot_background`. - """ - def __init__( self, data: Optional[DataLike] = None, @@ -403,7 +395,7 @@ def _create_figure(self): from ._mpl.figure import p9Figure from ._mpl.layout_manager import PlotnineLayoutEngine - self.figure = plt.figure(FigureClass=p9Figure) + self.figure = cast("p9Figure", plt.figure(FigureClass=p9Figure)) self.figure.set_layout_engine(PlotnineLayoutEngine(self)) if not hasattr(self, "_gridspec"): @@ -515,7 +507,7 @@ def _draw_panel_borders(self): clip_path=ax.patch, clip_on=False, ) - self._add_figure_artist(rect) + self.figure.add_artist(rect) self.theme.targets.panel_border.append(rect) def _draw_layers(self): @@ -566,21 +558,19 @@ def _draw_figure_texts(self): # The locations are handled by the layout manager if title := self.labels.get("title", ""): - targets.plot_title = self._add_figure_artist(Text(text=title)) + targets.plot_title = self.figure.add_artist(Text(text=title)) if subtitle := self.labels.get("subtitle", ""): - targets.plot_subtitle = self._add_figure_artist( - Text(text=subtitle) - ) + targets.plot_subtitle = self.figure.add_artist(Text(text=subtitle)) if caption := self.labels.get("caption", ""): - targets.plot_caption = self._add_figure_artist(Text(text=caption)) + targets.plot_caption = self.figure.add_artist(Text(text=caption)) if footer := self.labels.get("footer", ""): - targets.plot_footer = self._add_figure_artist(Text(text=footer)) + targets.plot_footer = self.figure.add_artist(Text(text=footer)) if tag := self.labels.get("tag", ""): - targets.plot_tag = self._add_figure_artist(Text(text=tag)) + targets.plot_tag = self.figure.add_artist(Text(text=tag)) # Get the axis labels (default or specified by user) # and let the coordinate modify them e.g. flip @@ -589,10 +579,10 @@ def _draw_figure_texts(self): ) if labels.x: - targets.axis_title_x = self._add_figure_artist(Text(text=labels.x)) + targets.axis_title_x = self.figure.add_artist(Text(text=labels.x)) if labels.y: - targets.axis_title_y = self._add_figure_artist(Text(text=labels.y)) + targets.axis_title_y = self.figure.add_artist(Text(text=labels.y)) def _draw_watermarks(self): """ @@ -601,56 +591,24 @@ def _draw_watermarks(self): for wm in self.watermarks: wm.draw(self.figure) - def _add_figure_artist(self, artist): - """ - Add an artist to this plot's figure with the right zorder offset - - For a top-level plot this is a no-op offset; on an inset every - figure-level artist is shifted by the inset's `_zorder` so the - inset sits in its own band. - """ - artist.set_zorder(artist.get_zorder() + self._zorder) - self.figure.add_artist(artist) - return artist - def _draw_plot_background(self): from matplotlib.lines import Line2D from matplotlib.patches import Rectangle targets = self.theme.targets - bg_z = self._insets.plot_background_offset - - # The background sits below this plot's own axes layer and, - # when below-insets are present, below all of them too. - # _add_figure_artist then shifts by self._zorder so an inset's - # plot_background also clears its host's stack. - targets.plot_background = self._add_figure_artist( - Rectangle((0, 0), 0, 0, facecolor="none", zorder=bg_z) + + targets.plot_background = self.figure.add_artist( + Rectangle((0, 0), 0, 0, facecolor="none") ) self._gridspec.patch = targets.plot_background - # Footer background and line only if there is a footer, and put - # it on top of the plot background. + # Footer background and line only if there is a footer. if self.labels.get("footer", ""): - targets.plot_footer_background = self._add_figure_artist( - Rectangle( - (0, 0), - 0, - 0, - facecolor="none", - linewidth=0, - zorder=bg_z + 0.1, - ) + targets.plot_footer_background = self.figure.add_artist( + Rectangle((0, 0), 0, 0, facecolor="none", linewidth=0) ) - - targets.plot_footer_line = self._add_figure_artist( - Line2D( - [0, 0], - [0, 0], - color="none", - linewidth=0, - zorder=bg_z + 0.2, - ) + targets.plot_footer_line = self.figure.add_artist( + Line2D([0, 0], [0, 0], color="none", linewidth=0) ) def _save_filename(self, ext: str) -> Path: diff --git a/plotnine/guides/guides.py b/plotnine/guides/guides.py index 302a2178f6..eda98e3ed6 100644 --- a/plotnine/guides/guides.py +++ b/plotnine/guides/guides.py @@ -379,7 +379,7 @@ def draw(self) -> Optional[OffsetBox]: self._apply_guide_themes(gdefs) legends = self._assemble_guides(gdefs, guide_boxes) for aob in legends.boxes: - self.plot._add_figure_artist(aob) + self.plot.figure.add_artist(aob) self.plot.theme.targets.legends = legends diff --git a/plotnine/watermark.py b/plotnine/watermark.py index fb7288e0e7..cbe78b7b1a 100644 --- a/plotnine/watermark.py +++ b/plotnine/watermark.py @@ -16,25 +16,6 @@ __all__ = ("watermark",) -_BASE_ZORDER = 9 -""" -Default zorder for a watermark on a top-level plot - -The watermark sits at the top of a plot's within-band stack. It must -stay below the next band's `plot_background` so a sibling inset's bg -cleanly covers the watermark of the inset below it: - - +9.5 ----- next band's `plot_background` --+ - | 0.5 gap - +9 ----- watermark (_BASE_ZORDER) --+ - ... (rest of this band's stack) - -0.5 ----- this band's `plot_background` - -`INSET_ZORDER_STEP = 10` reserves the gap; the same step separates -below-bands when `on_top=False`. -""" - - class watermark: """ Add watermark to plot @@ -100,8 +81,4 @@ def draw(self, figure: matplotlib.figure.Figure): """ from matplotlib.image import imread - figure.figimage( - imread(self.filename), - zorder=_BASE_ZORDER + self._parent._zorder, - **self.kwargs, - ) + figure.figimage(imread(self.filename), **self.kwargs) From 9d9ddce5ca8fb24788f45223ae06d30ec067712c Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Mon, 11 May 2026 18:18:25 +0300 Subject: [PATCH 17/25] Make inset_element renderable on its own Standalone `inset_element(obj, ...)` now displays via an implicit blank ggplot host, mirroring ggplot's `draw` / `show` / `save` / `_repr_mimebundle_` surface. The existing per-host draw entry point is preserved as `_draw_in_host` and called by `Insets.draw`. --- plotnine/composition/_inset_element.py | 66 ++++++++++++++++++++++++-- 1 file changed, 62 insertions(+), 4 deletions(-) diff --git a/plotnine/composition/_inset_element.py b/plotnine/composition/_inset_element.py index 263b6bd823..e1fa9412a3 100644 --- a/plotnine/composition/_inset_element.py +++ b/plotnine/composition/_inset_element.py @@ -2,9 +2,11 @@ from copy import deepcopy from dataclasses import dataclass -from typing import TYPE_CHECKING, Literal +from typing import TYPE_CHECKING, Any, Literal if TYPE_CHECKING: + from matplotlib.figure import Figure + from ..ggplot import ggplot from ._compose import Compose @@ -94,9 +96,65 @@ def _setup(self, parent: ggplot): self.obj.figure = parent.figure self.obj.theme._inherit_figure_props(parent.theme) - def draw(self): + @property + def _blank_host(self) -> ggplot: + """ + Implicit host for rendering this inset standalone + + The host is a `ggplot` with no data and a theme override that + erases the panel background. Figure size, plot margin, fonts, + etc. come from the user's default theme. A fresh host is built + per access — no shared state. + """ + from ..ggplot import ggplot + from ..themes.elements import element_rect + from ..themes.theme import theme + + return ggplot() + theme(panel_background=element_rect(fill="none")) + + def draw(self, *, show: bool = False) -> Figure: + """ + Render this inset standalone on an implicit blank host + + Parameters + ---------- + show : + Whether to show the plot. + """ + return (self._blank_host + self).draw(show=show) + + def show(self): + """ + Display this inset using the matplotlib backend set by the user + """ + (self._blank_host + self).show() + + def save(self, *args: Any, **kwargs: Any): + """ + Save this inset as an image file + + Accepts the same arguments as [](`~plotnine.ggplot.save`). """ - Render this inset + (self._blank_host + self).save(*args, **kwargs) + + def _repr_mimebundle_(self, include=None, exclude=None): + return (self._blank_host + self)._repr_mimebundle_( + include=include, exclude=exclude + ) + + def __repr__(self): + from .._utils.quarto import is_knitr_engine + + if is_knitr_engine(): + self.show() + return "" + return super().__repr__() + + def _draw_in_host(self): + """ + Render this inset against an already-set-up host figure + + For standalone use, call `draw()` instead. """ self.obj.draw() @@ -137,4 +195,4 @@ def draw(self, which: Literal["above", "below"]): insets = [inset for inset in self if not inset.on_top][::-1] for inset in insets: - inset.draw() + inset._draw_in_host() From 424c93f29841fe130cd7e0fef4096104faf63239 Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Mon, 11 May 2026 19:15:02 +0300 Subject: [PATCH 18/25] Validate GridSpecParams on construction Move the validate() check into __post_init__ and rename it to _validate so that every GridSpecParams instance is guaranteed valid at construction. Switch _reduce_height/_reduce_width to build a new instance via dataclasses.replace instead of copy+mutate so the invariant survives aspect-ratio adjustment. --- .../layout_manager/_composition_side_space.py | 1 - .../_mpl/layout_manager/_plot_side_space.py | 34 ++++++++----------- plotnine/_mpl/layout_manager/_side_space.py | 7 ++-- 3 files changed, 20 insertions(+), 22 deletions(-) diff --git a/plotnine/_mpl/layout_manager/_composition_side_space.py b/plotnine/_mpl/layout_manager/_composition_side_space.py index e5d32b9848..64f238b7b6 100644 --- a/plotnine/_mpl/layout_manager/_composition_side_space.py +++ b/plotnine/_mpl/layout_manager/_composition_side_space.py @@ -364,7 +364,6 @@ def resize_gridspec(self): sized to accomodate the content of the annotations. """ gsparams = self.calculate_gridspec_params() - gsparams.validate() self.sub_gridspec.update_params_and_artists(gsparams) def calculate_gridspec_params(self) -> GridSpecParams: diff --git a/plotnine/_mpl/layout_manager/_plot_side_space.py b/plotnine/_mpl/layout_manager/_plot_side_space.py index b31a69628b..bda8d65c60 100644 --- a/plotnine/_mpl/layout_manager/_plot_side_space.py +++ b/plotnine/_mpl/layout_manager/_plot_side_space.py @@ -11,7 +11,7 @@ from __future__ import annotations -from copy import copy +from dataclasses import replace from functools import cached_property from typing import TYPE_CHECKING @@ -807,7 +807,6 @@ def _arrange_insets(self): wspace=0, hspace=0, ) - params.validate() inset.obj._gridspec.update_params_and_artists(params) if isinstance(inset.obj, ggplot): @@ -824,7 +823,6 @@ def resize_gridspec(self): sized to accomodate the artists around the panels. """ gsparams = self.calculate_gridspec_params() - gsparams.validate() self.sub_gridspec.update_params_and_artists(gsparams) def calculate_gridspec_params(self) -> GridSpecParams: @@ -1074,43 +1072,41 @@ def _reduce_height(self, gsparams: GridSpecParams, ratio: float): """ Reduce the height of axes to get the aspect ratio """ - gsparams = copy(gsparams) - # New height w.r.t figure height h1 = ratio * self.w * (self.W / self.H) # Half of the total vertical reduction w.r.t figure height dh = (self.h - h1) * self.plot.facet.nrow / 2 - # Reduce plot area height - gsparams.top -= dh - gsparams.bottom += dh - gsparams.hspace = self.sh / h1 - # Add more vertical plot margin self.increase_vertical_plot_margin(dh) - return gsparams + + return replace( + gsparams, + top=gsparams.top - dh, + bottom=gsparams.bottom + dh, + hspace=self.sh / h1, + ) def _reduce_width(self, gsparams: GridSpecParams, ratio: float): """ Reduce the width of axes to get the aspect ratio """ - gsparams = copy(gsparams) - # New width w.r.t figure width w1 = (self.h * self.H) / (ratio * self.W) # Half of the total horizontal reduction w.r.t figure width dw = (self.w - w1) * self.plot.facet.ncol / 2 - # Reduce width - gsparams.left += dw - gsparams.right -= dw - gsparams.wspace = self.sw / w1 - # Add more horizontal margin self.increase_horizontal_plot_margin(dw) - return gsparams + + return replace( + gsparams, + left=gsparams.left + dw, + right=gsparams.right - dw, + wspace=self.sw / w1, + ) @property def aspect_ratio(self) -> float: diff --git a/plotnine/_mpl/layout_manager/_side_space.py b/plotnine/_mpl/layout_manager/_side_space.py index 7994551d38..88a06c4bd5 100644 --- a/plotnine/_mpl/layout_manager/_side_space.py +++ b/plotnine/_mpl/layout_manager/_side_space.py @@ -49,9 +49,12 @@ class GridSpecParams: wspace: float hspace: float - def validate(self): + def __post_init__(self): + self._validate() + + def _validate(self): """ - Return True if the params will create a non-empty area + Raise if the params do not enclose a positive-area rectangle """ if not (self.top - self.bottom > 0 and self.right - self.left > 0): raise GridSpecParamsError( From 8d3d3ecfdc73704b8c83623cc04892df49628d86 Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Mon, 11 May 2026 23:42:09 +0300 Subject: [PATCH 19/25] Add inset images --- .../_mpl/layout_manager/_plot_side_space.py | 47 +++-- plotnine/composition/_inset_element.py | 82 ++++++++- plotnine/composition/_inset_image.py | 163 ++++++++++++++++++ tests/conftest.py | 46 ++++- 4 files changed, 311 insertions(+), 27 deletions(-) create mode 100644 plotnine/composition/_inset_image.py diff --git a/plotnine/_mpl/layout_manager/_plot_side_space.py b/plotnine/_mpl/layout_manager/_plot_side_space.py index bda8d65c60..2fb9964b1c 100644 --- a/plotnine/_mpl/layout_manager/_plot_side_space.py +++ b/plotnine/_mpl/layout_manager/_plot_side_space.py @@ -780,11 +780,15 @@ def _arrange_insets(self): The host's panel/plot/full region is now finalised, so the inset's fractional bounding box is scaled into figure - coordinates and applied to the inset's own gridspec. The - inset's side-space layout then runs to lay out its content - within those bounds. + coordinates. For ggplot / Compose insets the bbox drives the + inset's gridspec and its side-space layout runs to position + its content. For image insets the adapter's `_arrange_in_box` + does the aspect-fit math directly — no gridspec or side-space + work needed. """ from plotnine import ggplot + from plotnine.composition import Compose + from plotnine.composition._inset_image import _InsetImage from ._composition_side_space import CompositionSideSpaces @@ -799,21 +803,28 @@ def _arrange_insets(self): bbox = self.plot._gridspec.bbox_relative (x1, y1), (x2, y2) = (bbox.x0, bbox.y0), (bbox.x1, bbox.y1) - params = GridSpecParams( - left=x1 + inset.left * (x2 - x1), - bottom=y1 + inset.bottom * (y2 - y1), - right=x1 + inset.right * (x2 - x1), - top=y1 + inset.top * (y2 - y1), - wspace=0, - hspace=0, - ) - inset.obj._gridspec.update_params_and_artists(params) - - if isinstance(inset.obj, ggplot): - inset.obj._sidespaces = PlotSideSpaces(inset.obj) - else: - inset.obj._sidespaces = CompositionSideSpaces(inset.obj) - inset.obj._sidespaces.arrange() + left = x1 + inset.left * (x2 - x1) + bottom = y1 + inset.bottom * (y2 - y1) + right = x1 + inset.right * (x2 - x1) + top = y1 + inset.top * (y2 - y1) + + if isinstance(inset.obj, (ggplot, Compose)): + params = GridSpecParams( + left=left, + bottom=bottom, + right=right, + top=top, + wspace=0, + hspace=0, + ) + inset.obj._gridspec.update_params_and_artists(params) + if isinstance(inset.obj, ggplot): + inset.obj._sidespaces = PlotSideSpaces(inset.obj) + else: + inset.obj._sidespaces = CompositionSideSpaces(inset.obj) + inset.obj._sidespaces.arrange() + elif isinstance(inset.obj, _InsetImage): + inset.obj._arrange_in_box(left, bottom, right, top) def resize_gridspec(self): """ diff --git a/plotnine/composition/_inset_element.py b/plotnine/composition/_inset_element.py index e1fa9412a3..6bb27f22ba 100644 --- a/plotnine/composition/_inset_element.py +++ b/plotnine/composition/_inset_element.py @@ -4,8 +4,12 @@ from dataclasses import dataclass from typing import TYPE_CHECKING, Any, Literal +from ._inset_image import _InsetImage + if TYPE_CHECKING: + import numpy as np from matplotlib.figure import Figure + from PIL.Image import Image as PILImage from ..ggplot import ggplot from ._compose import Compose @@ -25,7 +29,12 @@ class inset_element: Parameters ---------- obj : - The object to render as an inset. + The object to render as an inset. One of: + + - `ggplot` or `Compose` — full plot pipeline. + - `PIL.Image.Image` or `numpy.ndarray` — raster image. The + image is letterboxed inside the user's bbox so its aspect + ratio is preserved. left, bottom, right, top : Bounding box of the inset as fractional coordinates in the range ``[0, 1]``, relative to the host region selected by @@ -52,9 +61,28 @@ class inset_element: inset shares the host's figure, so these values come from the host theme. The canvas size of the inset is determined by the bounding box and the area it is `align_to`. + + For image insets, ``inset_element(...) + theme(...)`` draws a + sibling rectangle around the image; only `plot_background` is + honored today. + + Examples + -------- + Composed with a host plot: + + >>> p = ggplot(mtcars, aes("wt", "mpg")) + geom_point() # doctest: +SKIP + >>> p + inset_element(p, 0.6, 0.6, 1, 1) # doctest: +SKIP + + Image inset with a black border: + + >>> from PIL import Image # doctest: +SKIP + >>> p + ( # doctest: +SKIP + ... inset_element(Image.open("logo.png"), 0.7, 0.7, 1, 1) + ... + theme(plot_background=element_rect(color="black", size=1)) + ... ) """ - obj: ggplot | Compose + obj: ggplot | Compose | PILImage | np.ndarray | _InsetImage left: float bottom: float right: float @@ -63,13 +91,20 @@ class inset_element: on_top: bool = True def __post_init__(self): + import numpy as np + from PIL.Image import Image as PILImage + from ..ggplot import ggplot from ._compose import Compose - if not isinstance(self.obj, (ggplot, Compose)): + if isinstance(self.obj, (ggplot, Compose)): + pass + elif isinstance(self.obj, (PILImage, np.ndarray)): + self.obj = _InsetImage(self.obj) + else: raise TypeError( - "inset_element requires a ggplot or Compose, got " - f"{type(self.obj).__name__!r}." + "inset_element requires a ggplot, Compose, PIL image, " + f"or ndarray, got {type(self.obj).__name__!r}." ) if not 0.0 <= self.left < self.right <= 1.0: @@ -93,8 +128,35 @@ def _setup(self, parent: ggplot): parent : The host plot whose figure this inset adopts. """ - self.obj.figure = parent.figure - self.obj.theme._inherit_figure_props(parent.theme) + from ..ggplot import ggplot + from ._compose import Compose + + if isinstance(self.obj, (ggplot, Compose)): + self.obj.figure = parent.figure + self.obj.theme._inherit_figure_props(parent.theme) + elif isinstance(self.obj, _InsetImage): + self.obj._setup(parent) + + def __add__(self, other: object) -> inset_element: + """ + Attach a theme to this inset + + Returns a new `inset_element` with the theme folded into the + underlying `obj`. For `ggplot` / `Compose` insets this is a + shortcut for ``obj + theme``; for image insets the theme is + stored on the adapter and drives a sibling `Rectangle` via + `plot_background`. + """ + from ..ggplot import ggplot + from ..themes.theme import theme + from ._compose import Compose + + if not isinstance(other, theme): + return NotImplemented + new = deepcopy(self) + if isinstance(new.obj, (ggplot, Compose, _InsetImage)): + new.obj = new.obj + other + return new @property def _blank_host(self) -> ggplot: @@ -156,7 +218,11 @@ def _draw_in_host(self): For standalone use, call `draw()` instead. """ - self.obj.draw() + from ..ggplot import ggplot + from ._compose import Compose + + if isinstance(self.obj, (ggplot, Compose, _InsetImage)): + self.obj.draw() def __radd__(self, other: ggplot) -> ggplot: """ diff --git a/plotnine/composition/_inset_image.py b/plotnine/composition/_inset_image.py new file mode 100644 index 0000000000..c33f62c1ae --- /dev/null +++ b/plotnine/composition/_inset_image.py @@ -0,0 +1,163 @@ +from __future__ import annotations + +from copy import deepcopy +from typing import TYPE_CHECKING + +import numpy as np +from PIL.Image import Image as PILImage + +from ..themes.theme import theme + +if TYPE_CHECKING: + from matplotlib.figure import Figure + from matplotlib.patches import Rectangle + from matplotlib.transforms import Bbox + + from plotnine._mpl.figure import p9Figure + + from ..ggplot import ggplot + from ..themes.theme import theme as theme_type + + +class _InsetImage: + """ + A raster image rendered inside an `inset_element`'s bounding box + + The image keeps its intrinsic aspect ratio — when the bbox does + not match, the image is letterboxed with transparent padding on + the two opposing edges so it stays centred. + + Theming the inset (`inset_element(...) + theme(...)`) draws a + background rectangle around the image; only `plot_background` + is honored, and it styles that rectangle's fill and border. + """ + + # The host figure this inset renders into. + figure: p9Figure + # Theme that styles the background rectangle. + theme: theme_type + # Background rectangle drawn around the image. + patch: Rectangle + + # Bbox that defines the position and size of the final image + # artist. When the original image is mapped onto the figure, + # this bbox sets where on the figure it lands and how big it is. + _frac_bbox: Bbox + + def __init__(self, image: PILImage | np.ndarray): + from matplotlib.transforms import Bbox + + self._image = image + self._image_size = _image_size(image) # (W, H) px + self._frac_bbox = Bbox.unit() + self.theme = theme() + + def __add__(self, other: object) -> _InsetImage: + if not isinstance(other, theme): + return NotImplemented + + new = deepcopy(self) + new.theme = (new.theme or theme()) + other + return new + + def _setup(self, parent: ggplot): + self.figure = parent.figure + + def _arrange_in_box( + self, left: float, bottom: float, right: float, top: float + ): + """ + Place the image inside the given box, preserving aspect ratio + + The image is letterboxed — centered inside the box with + transparent padding on the two opposing edges — so its + intrinsic aspect ratio survives. The background rectangle + tracks the same fitted box. + + Parameters + ---------- + left, bottom, right, top : + Fractional figure-coordinates of the box assigned to this + inset by `inset_element.align_to`. + """ + l, b, r, t = _fit_aspect( + left, bottom, right, top, self._image_size, self.figure + ) + w, h = r - l, t - b + self._frac_bbox.bounds = (l, b, w, h) # pyright: ignore[reportAttributeAccessIssue] + self.patch.set_bounds(l, b, w, h) + + def draw(self): + from matplotlib.image import BboxImage + from matplotlib.transforms import TransformedBbox + + image_artist = BboxImage( + TransformedBbox(self._frac_bbox, self.figure.transFigure) + ) + image_artist.set_data(np.asarray(self._image)) + self.figure.add_artist(image_artist) + + self.theme._setup(self) # pyright: ignore[reportArgumentType] + self._draw_plot_background() + self.theme.apply() + + def _draw_plot_background(self): + from matplotlib.patches import Rectangle + + self.patch = self.figure.add_artist( + Rectangle( + (0, 0), + 1, + 1, + facecolor="none", + transform=self.figure.transFigure, + ) + ) + self.theme.targets.plot_background = self.patch + + +def _image_size(obj: PILImage | np.ndarray) -> tuple[int, int]: + """ + Return the (width, height) of a PIL image or ndarray in pixels + """ + if isinstance(obj, PILImage): + return obj.size # PIL exposes (W, H) + + arr = np.asarray(obj) + h, w = arr.shape[:2] # ndarray is HWC or HW + return w, h + + +def _fit_aspect( + left: float, + bottom: float, + right: float, + top: float, + image_size: tuple[int, int], + fig: Figure, +) -> tuple[float, float, float, float]: + """ + Shrink the user's bbox to the largest centered sub-bbox with the + image's intrinsic aspect ratio + """ + # figure size in px + W, H = fig.bbox.size + + # box size in px + box_w = (right - left) * W + box_h = (top - bottom) * H + + img_w, img_h = image_size + img_aspect = img_w / img_h + box_aspect = box_w / box_h + + if img_aspect > box_aspect: + # Wider than the box: fit width, letterbox vertically + new_box_h = box_w / img_aspect + pad_frac = (box_h - new_box_h) / 2 / H + return left, bottom + pad_frac, right, top - pad_frac + + # Taller (or equal): fit height, letterbox horizontally + new_box_w = box_h * img_aspect + pad_frac = (box_w - new_box_w) / 2 / W + return left + pad_frac, bottom, right - pad_frac, top diff --git a/tests/conftest.py b/tests/conftest.py index c18c1c8afd..0e123d09cd 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -11,7 +11,13 @@ from matplotlib.testing.compare import compare_images from plotnine import ggplot, theme -from plotnine.composition import Beside, Compose, Stack, plot_annotation +from plotnine.composition import ( + Beside, + Compose, + Stack, + inset_element, + plot_annotation, +) from plotnine.themes.theme import DEFAULT_RCPARAMS TOLERANCE = 2 # Default tolerance for the tests @@ -259,3 +265,41 @@ def composition_equals(cmp: Compose, name: str) -> bool: Compose.__eq__ = composition_equals # pyright: ignore[reportAttributeAccessIssue] Beside.__eq__ = composition_equals # pyright: ignore[reportAttributeAccessIssue] Stack.__eq__ = composition_equals # pyright: ignore[reportAttributeAccessIssue] + + +def inset_element_equals(inset: inset_element, name: str) -> bool: + """ + Compare standalone-rendered inset_element to its baseline image + + Parameters + ---------- + inset : + The inset under test. + name : + Identifier for the test image. + + This function is meant to monkey patch inset_element.__eq__ so + tests can use the `assert` statement. The test theme is applied to + the implicit blank host (not the inset itself) because + `figure_size` and `dpi` on an inset's theme are deliberately + ignored — they belong to the host. + """ + test_file = inspect.stack()[1][1] + filenames = make_test_image_filenames(name, test_file) + + host = inset._blank_host + theme(figure_size=(8, 6), dpi=DPI) + with _test_cleanup(): + (host + inset).save(filenames.result, verbose=False) + + if filenames.baseline.exists(): + shutil.copyfile(filenames.baseline, filenames.expected) + else: + raise_no_baseline_image(filenames.baseline) + err = compare_images( + filenames.expected, filenames.result, TOLERANCE, in_decorator=True + ) + inset._err = err # pyright: ignore[reportAttributeAccessIssue] + return not err + + +inset_element.__eq__ = inset_element_equals # pyright: ignore[reportAttributeAccessIssue] From 8f6bfb5a04919340c8b863fae7da9ac63130b544 Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Wed, 13 May 2026 13:54:47 +0300 Subject: [PATCH 20/25] Add lines, areas, texts and tiles to yippie._Geom --- plotnine/_utils/yippie.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/plotnine/_utils/yippie.py b/plotnine/_utils/yippie.py index 2359ad3244..ab8f44f50d 100644 --- a/plotnine/_utils/yippie.py +++ b/plotnine/_utils/yippie.py @@ -9,8 +9,12 @@ element_blank, element_rect, element_text, + geom_area, geom_col, + geom_line, geom_point, + geom_text, + geom_tile, ggplot, labs, theme, @@ -69,6 +73,26 @@ def points(self): def cols(self): return geom_col(aes("cat", "value", fill="cat"), self.data) + @property + def lines(self): + return geom_line( + aes("cat", "value", color="cat2", group="cat2"), self.data + ) + + @property + def areas(self): + return geom_area( + aes("cat", "value", fill="cat2", group="cat2"), self.data + ) + + @property + def texts(self): + return geom_text(aes("cat", "value", label="cat"), self.data, size=16) + + @property + def tiles(self): + return geom_tile(aes("cat", "cat2", fill="value"), self.data) + class _Legend: """ From 0d85e5633bf68d734f6411544ca5fd53e7852746 Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Wed, 13 May 2026 18:51:18 +0300 Subject: [PATCH 21/25] Broadcast `&` / `*` from a host plot into its insets `(host + inset_element(p, ...)) & theme(...)` now themes both the host and the inset; `*` is host-only. Both operators are guarded on `_insets` and return `NotImplemented` on a bare ggplot, so the existing `+` remains the answer there. The broadcast lives on `Insets.__and__`, mirroring how `Compose.__and__` iterates `self.items`. `Compose.__and__` now descends into ggplot children that carry insets so themes broadcast on a composition reach every attached inset. --- plotnine/composition/_compose.py | 9 ++++++-- plotnine/composition/_inset_element.py | 20 ++++++++++++++++++ plotnine/ggplot.py | 29 ++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/plotnine/composition/_compose.py b/plotnine/composition/_compose.py index c1bb32cfbb..b0531b9627 100644 --- a/plotnine/composition/_compose.py +++ b/plotnine/composition/_compose.py @@ -284,12 +284,15 @@ def __and__(self, rhs: PlotAddable) -> Self: """ Add rhs to all plots in the composition + Recurses into ggplot insets too: a plot with insets receives + `item & rhs` (which broadcasts to its own host and insets). + Parameters ---------- rhs: What to add. """ - from plotnine import theme + from plotnine import ggplot, theme self = deepcopy(self) @@ -297,7 +300,9 @@ def __and__(self, rhs: PlotAddable) -> Self: self.annotation.theme = self.annotation.theme + rhs for i, item in enumerate(self): - if isinstance(item, Compose): + if isinstance(item, Compose) or ( + isinstance(item, ggplot) and item._insets + ): self[i] = item & rhs else: item += copy(rhs) diff --git a/plotnine/composition/_inset_element.py b/plotnine/composition/_inset_element.py index 6bb27f22ba..8dc73beff3 100644 --- a/plotnine/composition/_inset_element.py +++ b/plotnine/composition/_inset_element.py @@ -262,3 +262,23 @@ def draw(self, which: Literal["above", "below"]): for inset in insets: inset._draw_in_host() + + def __and__(self, rhs) -> Insets: + """ + Apply rhs to every inset's obj, recursing into nested structure + + Insets that themselves have insets receive `obj & rhs` so the + broadcast reaches every nested child. + """ + from ..ggplot import ggplot + from ._compose import Compose + + new = Insets(deepcopy(self)) + for inset in new: + if isinstance(inset.obj, Compose) or ( + isinstance(inset.obj, ggplot) and inset.obj._insets + ): + inset.obj = inset.obj & rhs + else: + inset.obj = inset.obj + rhs + return new diff --git a/plotnine/ggplot.py b/plotnine/ggplot.py index 918977a26e..9d45d71c84 100755 --- a/plotnine/ggplot.py +++ b/plotnine/ggplot.py @@ -312,6 +312,35 @@ def __truediv__(self, rhs: Self | Compose) -> Compose: return Stack([self, rhs]) + def __and__(self, rhs: PlotAddable) -> Self: + """ + Broadcast rhs to this plot and every inset + + Only defined when the plot has insets. On a plot with no insets + use `+` instead. + """ + if not self._insets: + return NotImplemented + + new = deepcopy(self) + new += rhs + new._insets = new._insets & rhs + return new + + def __mul__(self, rhs: PlotAddable) -> Self: + """ + Apply rhs to this plot only, leaving insets untouched + + Only defined when the plot has insets. On a plot with no insets + use `+` instead. + """ + if not self._insets: + return NotImplemented + + new = deepcopy(self) + new += rhs + return new + def __sub__(self, rhs: Self | Compose) -> Compose: """ Compose 2 plots columnwise From d071c644b50bde4379aa17424a41f51e2675b1f5 Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Thu, 14 May 2026 14:46:11 +0300 Subject: [PATCH 22/25] Anchor parameter for image insets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `inset_element(..., anchor=...)` chooses where an aspect-fitted image sits inside the user's bbox. Default `"center"` reproduces the previous behaviour; named anchors cover the eight corners and edges, and a `(h, v)` tuple in [0, 1]² sets the anchor point directly. `_fit_aspect` now splits the letterbox padding by the anchor's fraction instead of always 50/50. The anchor is resolved once at `_InsetImage` construction so the per-render path stays cheap and typed as a plain tuple. The parameter is ignored for ggplot / Compose insets, which fill the bbox via gridspec sizing and have no letterbox to anchor. --- plotnine/composition/_inset_element.py | 26 ++++-- plotnine/composition/_inset_image.py | 114 ++++++++++++++++++++++--- 2 files changed, 119 insertions(+), 21 deletions(-) diff --git a/plotnine/composition/_inset_element.py b/plotnine/composition/_inset_element.py index 8dc73beff3..4fd8a5ae53 100644 --- a/plotnine/composition/_inset_element.py +++ b/plotnine/composition/_inset_element.py @@ -13,6 +13,7 @@ from ..ggplot import ggplot from ._compose import Compose + from ._inset_image import Anchor @dataclass @@ -37,16 +38,16 @@ class inset_element: ratio is preserved. left, bottom, right, top : Bounding box of the inset as fractional coordinates in the - range ``[0, 1]``, relative to the host region selected by + range `[0, 1]`, relative to the host region selected by `align_to`. The bottom-left corner of that region is - ``(0, 0)`` and the top-right is ``(1, 1)``. + `(0, 0)` and the top-right is `(1, 1)`. align_to : Which region of the host plot the bounding box is relative to: - - ``"panel"`` — the data area only (default). - - ``"plot"`` — the panel plus axes, labels, titles, captions + - `"panel"` — the data area only (default). + - `"plot"` — the panel plus axes, labels, titles, captions and legends - - ``"full"`` — everything the host plot occupies plus plot margin + - `"full"` — everything the host plot occupies plus plot margin on_top : When `True` (default) the inset paints above the host plot. When `False`, the inset paints between the host's @@ -54,6 +55,16 @@ class inset_element: legends, ...), so the host's panel area covers the inset. Useful for backdrops, decorations, or branding that should look like part of the page rather than an overlay. + anchor : + Where to anchor the image inside the user's bbox when its + aspect ratio doesn't match. One of `"center"` (default), + `"top"`, `"top-right"`, `"right"`, `"bottom-right"`, + `"bottom"`, `"bottom-left"`, `"left"`, `"top-left"`, + or a `(h, v)` tuple in [0, 1]² with `h = 0` left / `h = 1` + right and `v = 0` bottom / `v = 1` top. Only meaningful for + image insets; plot / composition insets fill the entire area by + resizing without constraining the aspect ratio, so the anchor + has no effect. Notes ----- @@ -62,7 +73,7 @@ class inset_element: theme. The canvas size of the inset is determined by the bounding box and the area it is `align_to`. - For image insets, ``inset_element(...) + theme(...)`` draws a + For image insets, `inset_element(...) + theme(...)` draws a sibling rectangle around the image; only `plot_background` is honored today. @@ -89,6 +100,7 @@ class inset_element: top: float align_to: Literal["panel", "plot", "full"] = "panel" on_top: bool = True + anchor: Anchor = "center" def __post_init__(self): import numpy as np @@ -100,7 +112,7 @@ def __post_init__(self): if isinstance(self.obj, (ggplot, Compose)): pass elif isinstance(self.obj, (PILImage, np.ndarray)): - self.obj = _InsetImage(self.obj) + self.obj = _InsetImage(self.obj, anchor=self.anchor) else: raise TypeError( "inset_element requires a ggplot, Compose, PIL image, " diff --git a/plotnine/composition/_inset_image.py b/plotnine/composition/_inset_image.py index c33f62c1ae..6f5df02483 100644 --- a/plotnine/composition/_inset_image.py +++ b/plotnine/composition/_inset_image.py @@ -1,7 +1,7 @@ from __future__ import annotations from copy import deepcopy -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Literal import numpy as np from PIL.Image import Image as PILImage @@ -18,6 +18,19 @@ from ..ggplot import ggplot from ..themes.theme import theme as theme_type + AnchorName = Literal[ + "center", + "top", + "right", + "bottom", + "left", + "top-left", + "top-right", + "bottom-left", + "bottom-right", + ] + Anchor = AnchorName | tuple[float, float] + class _InsetImage: """ @@ -25,7 +38,8 @@ class _InsetImage: The image keeps its intrinsic aspect ratio — when the bbox does not match, the image is letterboxed with transparent padding on - the two opposing edges so it stays centred. + the two opposing edges. The `anchor` parameter chooses where the + image sits inside the bbox (centered by default). Theming the inset (`inset_element(...) + theme(...)`) draws a background rectangle around the image; only `plot_background` @@ -44,12 +58,22 @@ class _InsetImage: # this bbox sets where on the figure it lands and how big it is. _frac_bbox: Bbox - def __init__(self, image: PILImage | np.ndarray): + # Where the image sits inside the user's bbox when its aspect + # ratio doesn't match. + _anchor: tuple[float, float] + + def __init__( + self, + image: PILImage | np.ndarray, + *, + anchor: Anchor = "center", + ): from matplotlib.transforms import Bbox self._image = image self._image_size = _image_size(image) # (W, H) px self._frac_bbox = Bbox.unit() + self._anchor = _resolve_anchor(anchor) self.theme = theme() def __add__(self, other: object) -> _InsetImage: @@ -69,10 +93,10 @@ def _arrange_in_box( """ Place the image inside the given box, preserving aspect ratio - The image is letterboxed — centered inside the box with - transparent padding on the two opposing edges — so its - intrinsic aspect ratio survives. The background rectangle - tracks the same fitted box. + The image is letterboxed inside the box with transparent + padding on the two opposing edges, positioned by the + configured `anchor`. The background rectangle tracks the + same fitted box. Parameters ---------- @@ -81,7 +105,13 @@ def _arrange_in_box( inset by `inset_element.align_to`. """ l, b, r, t = _fit_aspect( - left, bottom, right, top, self._image_size, self.figure + left, + bottom, + right, + top, + self._image_size, + self.figure, + anchor=self._anchor, ) w, h = r - l, t - b self._frac_bbox.bounds = (l, b, w, h) # pyright: ignore[reportAttributeAccessIssue] @@ -128,6 +158,52 @@ def _image_size(obj: PILImage | np.ndarray) -> tuple[int, int]: return w, h +# Named anchors → (h, v) fractions in [0, 1]², where `h = 0` +# aligns the image to the bbox's left edge / `h = 1` to the right, +# and `v = 0` aligns to the bottom / `v = 1` to the top. +_ANCHOR_FRACTIONS: dict[str, tuple[float, float]] = { + "center": (0.5, 0.5), + "top": (0.5, 1.0), + "top-right": (1.0, 1.0), + "right": (1.0, 0.5), + "bottom-right": (1.0, 0.0), + "bottom": (0.5, 0.0), + "bottom-left": (0.0, 0.0), + "left": (0.0, 0.5), + "top-left": (0.0, 1.0), +} + + +def _resolve_anchor(anchor: Anchor) -> tuple[float, float]: + """ + Normalise an anchor spec to a (h, v) tuple in [0, 1]² + + Accepts a named anchor (e.g. `"top-right"`) or a numeric + `(h, v)` tuple. Raises `ValueError` on unknown names or + out-of-range tuple values. + """ + if isinstance(anchor, str): + try: + return _ANCHOR_FRACTIONS[anchor] + except KeyError: + names = ", ".join(repr(k) for k in _ANCHOR_FRACTIONS) + raise ValueError( + f"Unknown anchor {anchor!r}. Expected one of: " + f"{names}, or a (h, v) tuple in [0, 1]²." + ) from None + try: + h, v = anchor + except (TypeError, ValueError): + raise ValueError( + f"Anchor must be a name or (h, v) tuple, got {anchor!r}." + ) from None + if not (0.0 <= h <= 1.0 and 0.0 <= v <= 1.0): + raise ValueError( + f"Anchor tuple values must lie in [0, 1], got ({h}, {v})." + ) + return float(h), float(v) + + def _fit_aspect( left: float, bottom: float, @@ -135,10 +211,18 @@ def _fit_aspect( top: float, image_size: tuple[int, int], fig: Figure, + anchor: tuple[float, float] = (0.5, 0.5), ) -> tuple[float, float, float, float]: """ - Shrink the user's bbox to the largest centered sub-bbox with the - image's intrinsic aspect ratio + Shrink the user's bbox to the largest sub-bbox with the image's + intrinsic aspect ratio, positioned by `anchor` + + `anchor` defaults to `"center"` (image centered, padding split + 50/50 on the short axis). Named anchors map to corners and edges + of the bbox; a `(h, v)` tuple in [0, 1]² sets the anchor + point directly, where `h = 0` aligns the image to the bbox's + left edge / `h = 1` to the right, and `v = 0` to the bottom / + `v = 1` to the top. """ # figure size in px W, H = fig.bbox.size @@ -151,13 +235,15 @@ def _fit_aspect( img_aspect = img_w / img_h box_aspect = box_w / box_h + h, v = anchor + if img_aspect > box_aspect: # Wider than the box: fit width, letterbox vertically new_box_h = box_w / img_aspect - pad_frac = (box_h - new_box_h) / 2 / H - return left, bottom + pad_frac, right, top - pad_frac + pad = (box_h - new_box_h) / H + return left, bottom + v * pad, right, top - (1 - v) * pad # Taller (or equal): fit height, letterbox horizontally new_box_w = box_h * img_aspect - pad_frac = (box_w - new_box_w) / 2 / W - return left + pad_frac, bottom, right - pad_frac, top + pad = (box_w - new_box_w) / W + return left + h * pad, bottom, right - (1 - h) * pad, top From b290bcd52279ca4dced072a8eeb17ae5739840ca Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Thu, 14 May 2026 15:29:52 +0300 Subject: [PATCH 23/25] Background wraps the user bbox for image insets The background rectangle on an image inset now tracks the full user bbox (the letterbox envelope) instead of the fitted image. A themed fill or border now surrounds the whole requested region, with the fill visible in the letterbox padding bands. The patch is now added before the image artist so its fill renders behind the image; previously it sat on top because it hugged the image and only the border was meant to be visible. --- plotnine/composition/_inset_image.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/plotnine/composition/_inset_image.py b/plotnine/composition/_inset_image.py index 6f5df02483..3d3ef75256 100644 --- a/plotnine/composition/_inset_image.py +++ b/plotnine/composition/_inset_image.py @@ -95,8 +95,10 @@ def _arrange_in_box( The image is letterboxed inside the box with transparent padding on the two opposing edges, positioned by the - configured `anchor`. The background rectangle tracks the - same fitted box. + configured `anchor`. The background rectangle wraps the full + user bbox (the letterbox envelope), so a themed fill or + border surrounds the entire requested region — not just the + fitted image. Parameters ---------- @@ -113,22 +115,24 @@ def _arrange_in_box( self.figure, anchor=self._anchor, ) - w, h = r - l, t - b - self._frac_bbox.bounds = (l, b, w, h) # pyright: ignore[reportAttributeAccessIssue] - self.patch.set_bounds(l, b, w, h) + self._frac_bbox.bounds = (l, b, r - l, t - b) # pyright: ignore[reportAttributeAccessIssue] + self.patch.set_bounds(left, bottom, right - left, top - bottom) def draw(self): from matplotlib.image import BboxImage from matplotlib.transforms import TransformedBbox + # Background first so its fill sits behind the image — the + # letterbox. + self.theme._setup(self) # pyright: ignore[reportArgumentType] + self._draw_plot_background() + image_artist = BboxImage( TransformedBbox(self._frac_bbox, self.figure.transFigure) ) image_artist.set_data(np.asarray(self._image)) self.figure.add_artist(image_artist) - self.theme._setup(self) # pyright: ignore[reportArgumentType] - self._draw_plot_background() self.theme.apply() def _draw_plot_background(self): From a66d74a5c0f9bae231aa01e8b838da279c8a86d5 Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Wed, 13 May 2026 15:28:51 +0300 Subject: [PATCH 24/25] Add tests for inset_element MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Covers the inset_element work that's accumulated over the branch: - `TestInsetAlignTo` — panel / plot / full host regions. - `TestNestedOnTop` — `on_top` toggled on a deeply nested inset. - `TestQuadrantInsets` — four-in-a-grid via separate insets vs. one composition inset. - `TestPropagateTheme` — `&` / `*` broadcast from a host into its insets (including Compose and nested ggplot insets) and the TypeError guards on bare-ggplot operands. - `TestImageInset` — aspect-fit + anchor placement, themed background wrapping the user bbox, ndarray/PIL parity, standalone render, and construction-time validation. --- .../test_inset_element/align_to_full.png | Bin 0 -> 12766 bytes .../test_inset_element/align_to_panel.png | Bin 0 -> 13066 bytes .../test_inset_element/align_to_plot.png | Bin 0 -> 13043 bytes .../test_inset_element/and_non_theme.png | Bin 0 -> 13045 bytes .../test_inset_element/compose_inset.png | Bin 0 -> 14878 bytes .../host_compose_inset_and.png | Bin 0 -> 16121 bytes .../host_compose_inset_mul.png | Bin 0 -> 16304 bytes .../test_inset_element/host_inset_and.png | Bin 0 -> 12231 bytes .../test_inset_element/host_inset_mul.png | Bin 0 -> 12240 bytes .../host_nested_inset_and.png | Bin 0 -> 17171 bytes .../host_nested_inset_mul.png | Bin 0 -> 17299 bytes .../image_aspect_fit_bottom.png | Bin 0 -> 4545 bytes .../image_aspect_fit_top_right.png | Bin 0 -> 17918 bytes .../test_inset_element/image_basic.png | Bin 0 -> 17998 bytes .../test_inset_element/image_standalone.png | Bin 0 -> 14888 bytes .../image_themed_bg_wraps.png | Bin 0 -> 18031 bytes .../inset_attached_to_compose.png | Bin 0 -> 8954 bytes .../inset_on_facet_host.png | Bin 0 -> 17425 bytes .../nested_on_top_false.png | Bin 0 -> 12037 bytes .../test_inset_element/nested_on_top_true.png | Bin 0 -> 12217 bytes .../test_inset_element/overlapping_insets.png | Bin 0 -> 13394 bytes .../test_inset_element/quadrants_composed.png | Bin 0 -> 22782 bytes .../test_inset_element/quadrants_separate.png | Bin 0 -> 22715 bytes tests/test_inset_element.py | 376 ++++++++++++++++++ 24 files changed, 376 insertions(+) create mode 100644 tests/baseline_images/test_inset_element/align_to_full.png create mode 100644 tests/baseline_images/test_inset_element/align_to_panel.png create mode 100644 tests/baseline_images/test_inset_element/align_to_plot.png create mode 100644 tests/baseline_images/test_inset_element/and_non_theme.png create mode 100644 tests/baseline_images/test_inset_element/compose_inset.png create mode 100644 tests/baseline_images/test_inset_element/host_compose_inset_and.png create mode 100644 tests/baseline_images/test_inset_element/host_compose_inset_mul.png create mode 100644 tests/baseline_images/test_inset_element/host_inset_and.png create mode 100644 tests/baseline_images/test_inset_element/host_inset_mul.png create mode 100644 tests/baseline_images/test_inset_element/host_nested_inset_and.png create mode 100644 tests/baseline_images/test_inset_element/host_nested_inset_mul.png create mode 100644 tests/baseline_images/test_inset_element/image_aspect_fit_bottom.png create mode 100644 tests/baseline_images/test_inset_element/image_aspect_fit_top_right.png create mode 100644 tests/baseline_images/test_inset_element/image_basic.png create mode 100644 tests/baseline_images/test_inset_element/image_standalone.png create mode 100644 tests/baseline_images/test_inset_element/image_themed_bg_wraps.png create mode 100644 tests/baseline_images/test_inset_element/inset_attached_to_compose.png create mode 100644 tests/baseline_images/test_inset_element/inset_on_facet_host.png create mode 100644 tests/baseline_images/test_inset_element/nested_on_top_false.png create mode 100644 tests/baseline_images/test_inset_element/nested_on_top_true.png create mode 100644 tests/baseline_images/test_inset_element/overlapping_insets.png create mode 100644 tests/baseline_images/test_inset_element/quadrants_composed.png create mode 100644 tests/baseline_images/test_inset_element/quadrants_separate.png create mode 100644 tests/test_inset_element.py diff --git a/tests/baseline_images/test_inset_element/align_to_full.png b/tests/baseline_images/test_inset_element/align_to_full.png new file mode 100644 index 0000000000000000000000000000000000000000..6a22b4741f882ae89a94d4947613d0ac62785d8a GIT binary patch literal 12766 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 literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_inset_element/align_to_panel.png b/tests/baseline_images/test_inset_element/align_to_panel.png new file mode 100644 index 0000000000000000000000000000000000000000..d3c6b4d1e3ef9c961254de3911d60fe98e1cde3b GIT binary patch literal 13066 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 literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_inset_element/and_non_theme.png b/tests/baseline_images/test_inset_element/and_non_theme.png new file mode 100644 index 0000000000000000000000000000000000000000..a3ed85d77f430b65a966e10867a80a1a5992424a GIT binary patch literal 13045 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 X!}ZxKjIk7a29dp|csKjblNbLBuw;Ka literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_inset_element/compose_inset.png b/tests/baseline_images/test_inset_element/compose_inset.png new file mode 100644 index 0000000000000000000000000000000000000000..4f934dced0a33eb850d78b5015fc0ca57ed80092 GIT binary patch literal 14878 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 SIvdaq(ooS=E>V2={C@zQ+6-#| literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_inset_element/host_compose_inset_and.png b/tests/baseline_images/test_inset_element/host_compose_inset_and.png new file mode 100644 index 0000000000000000000000000000000000000000..557979306075c952788602ebd018c87c2c1ff97d GIT binary patch literal 16121 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 S={#@~r1C&Rq43_57yk|0k|e4C literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_inset_element/host_compose_inset_mul.png b/tests/baseline_images/test_inset_element/host_compose_inset_mul.png new file mode 100644 index 0000000000000000000000000000000000000000..c81c5cd830142654198547230017fbd53cd6bbaa GIT binary patch literal 16304 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 MN#lO;-6t>p8<-iF%K!iX literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_inset_element/host_inset_and.png b/tests/baseline_images/test_inset_element/host_inset_and.png new file mode 100644 index 0000000000000000000000000000000000000000..f49ceda5fd2a41259d9af961be3e71337588f3f3 GIT binary patch literal 12231 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 SDoF4XdZ4Izzf8gE+5Z4M$B8-s literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_inset_element/host_inset_mul.png b/tests/baseline_images/test_inset_element/host_inset_mul.png new file mode 100644 index 0000000000000000000000000000000000000000..35fa8db4aee886e9e1d4c64e7f6b17b01bb4d006 GIT binary patch literal 12240 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

b8kT^?ZW3t{Y-TCG&>Slzd} z{cRtp$c~_mKY2$8EBTlWvt-Z|`DY3cg8vPoH}HWMEKTpMOHI#jc@}DG;2S{e&>!H4V#L{Y90{2G=g2<|9dyiyhbT$r9OvVdOZES;=! zvsxXi!t`T4%e+>hum^~6W@bjUYAucwsOHoiMMcG>;nM7@T!t@*O-xNw&a+4s#Km2E zk|5BU6#3!9=jo`8tS1JBWmqZ%KZ zX0M<#!HYAG$7@ZlD`f2=U1oof6?!|Oj5IVf62v@sMM^_Aq+i^}D;%*@>K(0DDaW$}7L2WIDUoCAZb)f%^R0}O{U7g8o1>4bz!U~5`OG9ENRk{r| zsgsPJ9`$7Spg~)A_fVM)hH5EKGgGPU=TDJUT^WMB5lMw+9J6(vv=WvDU0wlstd5Jf zx<6hgJ|n=t6lQy6)S7UwT7?@QXkOHZ4556oo(aWrQv?~x`zxxpOALO%MT@dp9a&D|Ekor zm!T`>K@q2z@jvdam3Sm|*B_bCi?y|xu>)cYz=q+)Mu@$%W4TQPytn3FodAUS3Tf4q zl#6KwDI5j#jF*nXZQgYiU5b9ip`&RXN$vikMR<$a+j}H%@+m*%ZP%WssVsQxU-wun ze&9QCH%txW`Do`{;}vi4Voh1ibgG`~j34b&GSp3Z1d+v>U;b+z@bxXXSf*X8<_xL; zR|H+W(I-0&bAPb-rn}i^f%)7ci@K{1{EPq>8ojVQ4vGhW;?TVD6kyeVdgo_<9_U_N zK%?}r!4e0?@9Km>$o}_!d#WXgQMTpBkAy_o{gq*@*4EY_Q$oQ^-)=h`Dd^QVJHdU% z*)WOmvC~+k2H=e~0H?Gw7pZpD=NwQPXwWvmRJQJc`=ET z!`ZRfv0@Le%0^EB>Sq}L!Yz%vYWsYq#S81sm?zaUFKaqCqjpGqaM6r#>`vEjUjN|* zz7xrpS|vWawoj5_I)I@OlaJw8M_2==;UR{GkZTG)Vi2`S9nYH zc_Ap1t8#ESWWg;_lPyf|(Yj=tak-{W>Y@4j{`7}S1DHfLNlw&g;Yn-j(qV(i(nXs5 zw&_a=dp-BYkAFJrgchX{IG;C{(rHb^!}#si}E| zo<0|R`8_c)qf*OGjy`x$1q4&*EQDE#AvUWYIw7=y9V$xUGqVU%e&5Vn3?Ld zsP%uz)#|U(Oxq1!9~C9A{Axg7hNTouRs-mckJ3BAADd?A0g zHzvq%WATcF|54&`*c2uy>G#gyRlP4Sxs=JCjvJUFX0dI1GYfpK#JZW_FZqR8oZC>m0 z&a~BXncu8cOI-`HRVw$P{u`K3l_5!W*dPk+s8N46m4%O36MQkK1J<&s#62~{FAWyv zgPb}?D_hk<3kD%}zYZ2^bj5Jx!4~PO9?H_XXz|=p^U>5{X5@(-HBpy}cC0grP)*EJ zM0RO}ZZj+#!>|dnHG8Ld8vI$-jg{|0LUJ;4o8$u^;3*ye-Wf<7BTM4rdA93$vy#;m?l*P%x z9n-5`X8+#YrBM(}n6?%aR(E=2FC=exXX^mo3nID#wMTPWRnT(sQG*_U&l&H1nsf@b zTlRLM0-)<4of!^i_CJ3AV0)YX3N;9loU#jlQ!}P>c2rE`OJjS@2D)=O625y6C_&+~ zA%d0xVgxkH-^{V%dfk4?NQFcGs1v&Gr<3!>lnh{4J8M-jSx?}df^P(z!gR=kD`#nFra0w&Y;#Wws;V9Mml@mX=AD}LBh8}@?=M= zbWQ<`z&VmyZ-MteprdC3R~jM#a@nCBAzN`jfZ6m-zmdY8B0}kSBr}C;uqnPBXKC-M zGYkGHPKjK5dygmJnKLdyVjLUmo(;te^tZtQ@my<0pZ%v zq2$tEXr$*)J0OhiHnY#-FV+gw5UB0D78=O7c%)uTsL2;|ZzX0TR1HtxE zgqj*;d-o(IO?Q`vhRh=*vQ|e?`9>(mOtXjJ*h%XDDyTSDBO)Us;Uh%A2pidU?y#}h z0v_D3-ml7McPTTT-^v!WvINxwc|uCTrJ9NSr`=UfZXgD^PY2O00o&sN00itT@hp%J z6$GYja9bTu_FipB;}C#gG*YKZfUgeSwFK)oN*QIq0UPkNBZOQL@k#HK-O*LLzv09m zy1jvV@IA-Gfy0lOF<%T}&P8cs?%2M*K2@Ld|6Nax)bBBhYK`>A1n%}nIPi(Qe+Jc7 z$7}RXj`oLUnnMWylqp#Zo1$0i~mg#Wy|=>HG=hlZ>FZINg#5jg|$l8}@Dr6Dky zeF32L2l5hw_7-|&3D_1`zw)0Z0d>+w4h!(axrzcaqT0$$1P&A?S6N} zXKsxQuXnLW4+VJ!!E2&ffNGzP5sNraNjr>H_KJgLPh|)yB#j_z@LjLd0}M*v+IY=C zrZSzNO|d*;l&z zJc*#DW7(Btz=32MTpiT(Ho;|=^fK0(km4>zaCVH!AuiZpEYeY-P!u}>ZAN*}74sj= zPBp&H+U4QlQPauO=B1J85}6H?qWdxb$?6U|1Mq|EE^zxy&G08LF=WQTkCt2aJ|wjA z40~1picy^V7+mFsv?0VaigFrqK#gb3&ApJ5le6hc5(QNJ^k&fC71(=vP&pK%2;Ju( zc=8RMB8Uo6KpN+ml!%m#(dD_pcy?i zNrLl(&^+q*suAE0pf~jFMG$uOJuXej;`X6a2}Cz}(%HYw8{C27B6qAZU}y+iN;O)& z9sf7p^RNoA#)pF-IY1NvINN9BRF_Fa za>g2H$g%kSn5d{1rw@`IJbNYNG*Q4)k9$~X=z`Q?1R-=t<-Ad?SII#b1vT|H*ua8R zT8fa8n|MtJWsz+R=$Q%POP(R?{f`m~F~rwsXwrdG^R7|Ya9uV788hfr)!QI{sI7fP ziiWz-3_an;CX#yYJodt)U+2?-Au zBEbirrBAc$Oo*RmO$|I11s4!aCF8g3P~Tr0@3bPVlbd?nLvY%EgO&e{5U$^9AX@`k zMhNfTi)^3h599z?!EbPHbrilgY-NY-O16{&Kuvhu9pi!pxK!S9nBOYsb=H$aTRVbcW%g)qRSQr`9pzoKFUgtjVb*D&Hbdul z^eyPhN18$Az+;zjui5uLVB1~L;U6s*;?ApgEj_SqR+|h z5PaAoHWwhjC6MwMFmSQ5&ZrG_Ckl7p&&PqJD&Yj!XuxBLn1OHy!&FIsm5VFA>A{o; z(9{51O9ED~3_7DRpfB+0D>DG72|3qxl3O7S^X$w_M?$44=QQ3Hll6YWcU=P1NmM{9 zoraf}SG=DSG{prVmn7HSyYc`{>VUrDC(9`W%_4w2khD4NtyeE|!&iP02&7&h9c>WM zrMNusAQ4;$={CS#VW3yz@gx)EMGkDyF9E}WB`u9L^-&}c zIRx4gU}OAZ641B-0MmhuviNPhtUuWseTALynmt!&S~v1W;qC*NOs{vc`N>Ap1vUZL zEOoNm(hw2}+K$M`Hih{R4UZtu(>>w0{e<73iP8@o8?(@x4hQbn4ix{W&Y#ZC+8yII ztB=-dI=4aNFdvQ7b*WQa`dZz-DZk=v7|f9R>V0*m1f+)Qs9i$1N_ZEl+cmM^ICS5>!limr6NbkM( zF1;j#lDT=__xq;4GvCag`7!fDbD89v+~+QPuf5jV2CFK|k(1GpK@dd#;<=1E1mPng z2ygZhF?a{oH@OI2L|kQGx@tIBx_X#8TR=*tu8y`2uC~^%nB6U$U927K`FS5c;C;-^ z{Myyk(M5!h&+gy9!Rz2`#rH$stsC5h)bY8l3j|%JzW9R&#V6i`peOz>WTZ7c6E~+w zT(2+v{Jm=xDa9=H2`#e(5pNwz$SsC$CeY^L@+@o|KmsD!SUn}YLJ0bP3!fQ+kX=_HJP5K4gf2B&ku!*BBCrQ9ri`i_Q|T#!D(t7? zYl@T-1if)*Xsz!iKNOM|dQ+d)EXC-nR~maQ(Xg_zS~#`gHC9qVco=T3Djvfc0XLtq z5(}H&uhQ!hSpzx7e#f$12|}np!XYpdM0gRd{P zMTP_itD(21v`~Hsts)~s74gF;(imvA=kL33O;#&CD8-*y8_1%erOk@r(dT^hsK3sB zQ&Q)|;}qirvl(oC|I@T7(0XU~2W^tW-eTLbS91u>GX3%X$_NsVU@%{ozd*P2_a9N` z#lI}O6W8Wc$e?7J#kmbUslb+< zPS7^nDg_~ExPsg3;8Vi*oE?sIx%>Loh0yYKdypcHSs?tKV?QL~5@(iHd^XA8tjCZ*Pwln`O@2fiV1F z`BP%Jba?sq(35`|Db#x(x`J8Y3Olc-&$Gr1>pLhh5blAOIJzb}m`%1`xlLwxs+&Eu zV?|LpbPhHRH1U=AD%e$)|Fc~MK_>hX<=39CZG_s)%%SQGuYgS#8pWyAuBf<8>1)F% z71VSG-CsV<3l3hREPdBT+!D(fo>Jq#-l!M1B$NW5C)|O+wjRBL_a7Ps<7H%15M^xB zTrb!MVs0xdD;c)IqDf=PQn-O@k4BEY`MlLzxYQM^4i815u)KL6hwYI zGlyYi26HrE;QZusgGbRRTMw$4ydydI zy;;P8_D3=d*%8AtaI`t0m8p13gWx6&O$JygjZj)XWrRwRQN7~xGDh%At=<%s6PqzX zFYh?c{S3&}D__sJyx`bc?^=)*LI5G9$-nxy|DltT+xOlxv29oHB)D`j8@l5pJ2OXH zQyXm^U}Uq`vhn^$2mJqV-u@4!`u|@7HYe$xJKik&Uchtd)5mzN$v@k@w)8ki)eWLn z3P}veaAqtnFX#A#18PZ`_2q-nljU!phBjU>@sO#(c!=qBQ5M?=!5`P4 zKOZiJ=)BUNfz`^5YxEG|Rdyn^8Z1$xmOXE10%6<1D68QZi^++!(X0;?>^@U$@;>OB zt(>V^^^GJ!nJ4RXo`&CD>DD>-O{LpeehkYq)PY+f(psxi)}9|Yb)7ml1W9s0m>X(?$RDW~7mp)MvEYD9zd=Q+gVwvo5}w>?`$+6+QJWLStLgR3K=K5(K=uT($D}@skm0 z#L)mcr>kCQBsb4PA}R0mcrQn>c>b1%af6tbE2p5KTkU37aIS1m+K?=v6h>!1sYy!DvEe`YS!w zX3-P8yK|dR3PZzn`Y`sJ_`UbbeQ}t37vJrliz<0dXd9Waj$N$fsyBdhD6=K&QN$e_%-FVrH+d}q(jc*7J zF$>{7^Cdg{x7}?Aa(NOobDyg@&=Lu1Elg{VAFVLa{;72^k=zvaWbQKC_Df4>IB`2> zHBLC`!apnapCOtEzrx@-hBn%QK|48Wji#nJ#UaP_K@K9q-n|bWUMR||gS`*iF5k78 z-cYk=^8KAf&1SqWyo}h-AbTH>XV9j;r!^-u)Vc>x#JFk17!x$=GAg{9s`b!m`^{XN4Mh z65+YpS+xSb?J}hf-6O{LomT|KalMlNhFdPfs}5&;%7dqy?ssA z!^G!4KJ)$(s-cXAgQvSB2eU3`ZWv6lt3Pk-L;>7wZ}G*)+d^CMJp|0RNg8kQTfWAf zp8-@5MNE#hlE})@$jY^!s#(S}Xm6jnTW)`%eYklr%W9m09r7L8JpAqjO%GcAQa!9g zOBZ}Oi}Ritk-hCTq(Z*l?=Uq6=XKrO2VUkiaIiw8Z(jNYjMFKw#O3C%A z4_vO#^A8=|@#}d#vBs?y&84>LHC9=2pf!ZXP82-(M2QKn{NehhBVbb$UWSZc{HhH@lsD ziO;h~ymHdMrt$r9R~A`D`|F+`_or0n`@0&*b4N6fKWB7}7;f7au~B-ot9soyE7ANU zS`jxcsSq-d(_80NT}z|k(l%e^hgyH*JrESsW>-#B4Zgjm88ZYVJKqq8x+s;HyojzU; zhyQ#}no}VDj)Zc!g~>m^Es{N9n8DHyvb_l{%+CW<#J*2|^XBWfDKz*wn*_5ePxcqJ zG9C%7mTuFoO^fQm2f890$hp;e#Rr8= zzD-)Rw&Ti2?b{vvFB(ND_a#0&pVd(v@9DE<^R;#?V^73@2h%I~D4v8-3*i@5YPy7kQw;aZvwWuVi zCa~AW*~NBb*l%vvGDE*>ro3g9dFlht{Z5WH2l#u$(#zo^xr%X*GUF;;KvF|UK*@6; zLK8~-#9kf-h_EvBO&%2^C#w&R&p(fnS@P*o#MO8?t9eA;0E&iqf3e%nFIJc3?S#ab zA$*zl0nD+%GH4>>hkW0Ujyn58yt)o5&mRI0w5h*q5nzs2Qu5T&pJkGclKG-%{88@P z(*?7$CgRxDbiD@OYJe@_)5dk4P6LYc*RQ)O4K%uXT132hmL>kxyq+bi@b@w-dWl2& zPJhmU7R3S`%(j?UV>>n7OMIaICzGe|)k_d252kMTd6_4 zsQGN6bSR)@9VcYc2n`gp(DlALJS(j^e)*%94(hLQgHuC2^(ci{-dyd1cxz6}tCwa) zLB$dA!oFZ;RLpniR;7OW;$Ry5^bxf{H}h`1I?v#%5io9C=@+aC(U1BKq2}Fogcv)%@ zdDp{!paYRyvv?L){`!rj|4GKk))Y+)Juy-MJj(1fZCit)8T6J~mvTYZQEIx}ptTf} z65XT8&O@|go=<1fEAp$mWxc0aG*SGrh3}#2DLk@EuIt!qLE=Ufl>;2CzZHJmaZaq1 znT~!L`E+}-S|d0(m{X@P5tPE#Y$3$6!WU2cKC4#3o^fTcsxo@{V}kiG`j80kjlEVL z%8&$oUG3EqWe_9f148K0uWu#FQF2%;?3E6Evaft=Gn3!=R(3$FJ6>R15BBSk>#FKU z22pLZ-ye3Rg7FdoOM$fIydR{I!71alG_Kv1Lh8?fgkzbmk!^1D_aY`n+9&USCP^ACBVC=&WfB zAfxG@tagFfjSFn?%$h0^k~i{o;dVuve>KM!$#r?^pea`KS{Wwl47qVs^snL(d?t4K zCq=V>av-~WS>p{pks^~+9*zm>xqw{?Mg9VYsa|_FXBAyo>q9c}-ja{RC|SwU&R4K~ zJ;eF-D2;Y1+vI}HvUq<`z31GvulgZyA_yN=1ZTXv>=E8`$#^6lCWBtu%D?zX!;?8ha+G7e`Jv#$?p7$v^?0;x)$#HQtGDw3m!8PJnOD1ZrGn3rwi{74A-^O+ ztIWkMa-_@SZ606?1~+fZNA-_dCHM3ScLzu+DB9-Z(2*KK-@J?=2h;;4S!Foe7rMzL4cjMr*Ce-dfqW@Bl_UHu^YKPKK>no-j zWK%?P{`!8ZTXVzF!tn8rl5#Br3ZfI~%@nP7Uf2WcrLKgL30XYbk6wW7%3v%KE2`qR zQm@2`xXaj`pr506i+6WJL{2@{k1A2z8lJDSe?D!B8oEnQfheHo=vk2K}lFivBsJ4=q=is}|x!bbo&a9!@a^^p!H&mijFx#x^ubrtU_ z(zqlZxuKJns*PaOdfA}b<-aek#ce1!)j}I~|Lb;ES9kv-OAr5h1;gx4d|!lV3#1=W zF5XJN?L4fqU)9(sCHw4|%}RHY&16+^yr5m~&w$H5-#Vf0G}4iU;k8= z>_-0qE+KX<_^Z=Wyd>8tYn95z2hrbR{`Ba&v6L794dYfqXt?4tX0;3SnhS`HD9^wlK3#c$^a$+8!KdgE12>41J~t;E}Tfc<;2 z6=E7*8*gM*dS-B+x6O$#4>O-oX1FU;?y zWqip!rO^oOkY7v>$HRv&y4D3FIyU^$QAd{rb5 zs`StZMdet99*+$dtrfb{<(o^SZ3T=BOwXr;;C=XA=SLk^QnjQuK z9M(Tf6sS4dd@A&t{p}{btni ze*2E^iw`f0J-5DcA4Xn$bC1lkX7HFHbVQ5!wen!V2>E$jTZsg(7Ta#1TN$_}O zCHx!^A5Yv=aLIIn$4UtF#vZ&uxbNEBcHKpUNy5w^ijze-n*XTe9Thn*wX>ZjB^0uY zi6t@_G&WsA?sygNI*B+=6V@5?7^nT!`#|=6fLFP}j$Ob{7J;2U#&OKr6Y-dHD zB<4OyoE^dIamQJl`gQMXDy)lAgbIhw-X-_Gt<1_2KI_ow@asKCQLM#+liY4`>${Ug zUe63_1Dn5j*ZTCipv~a(i3&S@*qh;zm3U+h5usQpbScHd@XcGj!#Od)c#L(r02KMt zLNabhG_ygB6V^E8BL|1APV#mwY}!EX9y5Vd$tr4YTy8r|K?Z`w9^+vzyFb4H7Y~_i?$8y;0LWF3ez{!oa z#``9DxD+jdON~B&b)Jn){^RSu)u2$_V3NvRojDP=r-CW1N_0*Mi4i?7qxa&aNIP#N zLs--qUV?5t0|+lK0^avz>3nPBvPV4C_tK;F6I z%HQjG7Lx0L{d4oIi3JJyVCxUAcCr2fg~v`Zox3t6dBWQ*wjK0}td@NqHJ7;E@{xoE zB75#a_>HU|yu81AB|5Mmj!WLdo?s_y8X>VJ99tGX#N@QxU0b+z*y&3NC58h8uY1oe zqE)LQIc~d+lQ-)r>8@~>i?=Sdv`(((3mANO@GmNsk}_Y27qGAp*15UGDq-KK zyKUjP?0ki8ye_lEtD<7S83QuYYTwh#H@H;+i}m*1J8^Ywh!zY7deoV_J5hd2EUfWX zooU!z5B4Tcr$~Eqyj-jJm2Bx0;5N1-W{Ixg;~^E@7l&e_%KTF%+uGXI@~g<|cRu6q z8$PC;ZS%sZo$_@oDl2Mw_B6CloDPR}M}A)tV(|C)Jh|&+DVpZsA28_f1?xRo!Wxo% zR7fxE!l_ak8r~!SB3PKWUXmloc}aQiwJu~%4`%q0?wj)-&IkT}`)&sZ93sM2F=PjR z^Ka3Q@$ofJ-wCtbXIvjps)i40ns~~rZ*+gr5ILQ9sj**typ*eLXrHA~h$E6#kUwx@ zU_i%*D0>+TE5tk++4+|Eqb+tiWxxNV$9nX8Dx?3Y6L?Ampk|GHxW!+R{T?cO&t?L( znrETT^wg#phu_FCYW_jba9EFQ)7G;aCsZttkvaUJ;p8ygh`DT}GFhT4EFb%Du4n$z zmAbDt9y(2EyCk~R2^&uwF`h{f6V_-ojN20tXMB^$w}a!Nuk#wb9LQ7}nDUq@0IC#3N4-SY4&64+hMk6Ymwhku z)ziJuE`5>$ii7$&%Eoe%MyG|}h6}pjEFu+Y`oDg9Ma$R!rW?)qfE(pJl%4ZybAs19 zg=RI4(f|3@dqNs|%uk{-9QT`4(@fmVuE+G}6UDdJXH{iTS=ZGo&&NiZSTtYvUOhWI zEp;X&;ZiBp$0*~E4Yo&f!Cv=%9i(yk4H8ImC@malzJO0r|M8Xx=CZ69&8a1ShCSrJ z(;F|xfA5|Qmv(+tE?i{NzH%ZqhQOK6aAWh;tj*u-vJuK7tVRoSt0ee+ub2q+_E=x$ zu)3r8;#rD|%FRNlsijMbQxvG2XEDb6zlsugPxOLxh&e1>$IBTv7=(+~$A=99ldoOB zn}lsLi!Ch=qoMyXxrN6tE)f4QL6kc zol}lgI;13fE#E3Itkt$?k9ycumn7=ZJqW*$)Q{9x=9i~!+#cZ`C1jbO3(xrjy7Zgf zL`7V@)CN3n%>xjq?Q#5Bg{X7yY6ISS^t4aTHYJd~fjXQ+bA_x1d$Z-f2?Q0sTFe-_ zg;LLu&s9qgw69rXE6|UvKI<}}q@tn%YX(GW&3bRQp&Si4P@At0=0sZ4+4p{ZlS3qi zJ2R|tRV%j{Qcw6;MEp)FLii>jKBd{!zpO~!cMLYxW&sn+zt;|<@+9=*h)dkQ=K}a55C3~fKfrl{9;ih z0LjG{@15?xIUfJO^vU|*Z9pFiYB;=1e^@}**xK5vki4DbG2LhAF_nRY*0mzU!K^YT zTq@Lz+gW)BzK7=o)P2BBd0Em>wmP5YyyZr>&C7-ae}oxR`Z#>nlNi(3sB~EBZsKFz zoXA5kOx!=-Ms*$qQ)X`LbnqD+H1KZ>ubOPPblEVIFnXyLOL7aI7zUGucz-LM_cL-o zLI8bBDpnbU>9x+^hav0d-^aGas0vWYTUKG^j4jiCP3b8EDOuBBgdCD9Y{y<{8$Eyi zylVboivM}Fk?*c70zKtXvsJSprma1zr$+D>x6s~MP7N+hTd#CU2vNDGBYrsh)Z6*= ze!&;vpjt{)WT~dL?7?at3m+!ZhLD<9(W{W^F z|5L(@KdxRrmbc4JE|8UCD^($o#FIYf1y#oW+EQCr!+iz)Ki$%B5IY(*vrHQH*{&bCLQ%{J zU?_S%3%@^{PRi5#qgCE5%tCYM!P4#RFNhayZIfOY9uMb|&*<|UWZm)NhcLktiX&ge zt;Ksp@85rkN0}9cYbCP@ZPbkXj`L?BVf=I7qhAt!oBh1u=^NAIXy=1g)}l{&Hf}U2 z!unRjg=&B1WiK*SNWJKkSxO(%OX==hJTYT{h6J4Ee+_QVH3en)i6gK9X!L4dI^%uT z2v|0rOiY5n>%W!}=#M#PTpIaR?wd1N`s>3h-AxV*{%E^_U;2w(FGNI4Kd6V%YZqHH zWn)NO6an&iWk%zQprSsXA1Tz{`;k4kun@zi_S4}Lr^Ja_a}lO_@Zd~;FZErf%yp-lfiJb($_wqN+bx8@;{Y`f6E#zeZ?< ze5vz%5dhQCUn5$JU2SAn$Oqh-z)q4@$s3KjMQgxrxRL!YT*ks%Nk&2Mdjy9n z_?_luXt-bY`ilQ&nyz~OA*dOqC>QI-yw`sedfU&B374PSO==KSpX`Ww+1mqF@O?#f zi`Y5OHzR`RMD!SIkJ@@^K#uVWx6eCy#8LFINcN5!r-WI|vB->}M*<1d84pu%S?+v@ zPzTC^X6lmw0SAEOblG&eP4*Lmy4N7zu97RfRKxl9+R=nnY?8Rs(oDs;3k@V&HT8+5 zaytk>hCa~gVx-Dot`-+Rq2K6tQ@v8lk48S5F#cC$RiBL*w)uPb(0_dT;M}o95BCn#41I8_3Iq20n?+h!H>rCAOyGriH_my(db)@rh zt10m(MTWf+vH-aqa%dJdd}%Az*iYBk|E&C2#q-yt;n#sHy24#H1zp)+UAyLv+Sn}% zn)pzs{eMbDZsD(4!0?0$jWmSZHgb1*RS}Y2HTK*tPiw+G9)DY5^fTzf3AuHC4W>Rg z{U&sH{=jbxf2R-(5Drk6@9l`qZ)1dF*8TTNdDFB`thz!P;3K?K&K*3-91N#F-=J{) z-*dKC8z#0j``!i!tVIgT%PZrUsHjYjHJVZ~Oo!IT(dbleP9Esn3`@A!&&?+l*Q1i- z`catq(80~UrH%yEOW#J6rWpHI*^|{`we6x3Kj*)3P*Qy-$2j=AIyM=9K|cQni-yFB zjGe=B_*G~+R%pAq;}mcD<%G}x{#RJe>_x^}N%qerPY-?}k~GjtXEqI)e5Whn*FD34=fW*X&XYU}8 zbmcuw+D=}sw8V%J%+M7Xo}f4KgxI-e>u4ywr>1_0aRZoBSX}m;4{kUSrG#pAyC;tq zpwK>`c1LdVRuV(nvar=8FHf}iaIv4Fbow5@8l2Fh; zfI~ALGYC$-vg|l~HWq4WIT@L6fszVMf#l^5GYzgx;eWQzC-mco#PTy|*rsZ8e;HQh z7-x|HZtGhlzfI+59qzlQcu2~P;erIO3LB_k>4G(Nvx6bEyJkQ}8p=?hWo2iF0{{kW zmTv^@Cq3O9K@|!H3T}zE3glW}K_22hO09ca##CMlpS^3f*W|?a&R_5TvISjC1c1 zN1IofXm_P*WfwJI*MAC6dLPOsIsabgyM(JSpQ3Z1#j|!iFIVA6(0R^r^ktg@I+d1} z53w1_&A?zhHLBe+&i&WOkf^hx1k%?Df_Cb!<|X|}g_F8nX>D2~?&zWX>Ko3na3T_t ztdqx>AOKpHuruf+uTtOGiKWjjEh56`t&7LC{ecZ1*1PNprZh94Gxx#q!GH>w?$L-7 ze;0MjZvlc`&}fzl(?@z?bpqlmy_GY5c|gSGGHy8FJ2pRS`i{K{(#wwz^2Im5=S~~y*BnKPYvkRVQ0_gIy z(|0DG19#!Qd#e=__WT5oL#}hY`e_1;mja$Uv#y3;<)b+Vv7?g?`w}B%$GD+_dM2Hv z5}_|tjdtvbJiYu(s;WP6~AM`t>N0 zq|l)&20*Q45Pimj*I(o)gGatOtXRB?y=@&sz>899-*p;3OM)bVl zMfcR2@n_0L$@Ul?xL&p2>8@O<>f50y>;2^}Q1Q`Lk}?{DkSm7=aO9aKES%QJQyLTm zY8Q3`V^OJRzt|J|KJZBl?5u6)8U%m#E^zSQ96ia>lN?I8y+*Y4i(lU8Oni>Aidaoe z&2n!FApf;4p&5ZZ16esa7nM0Cu)${}6@X2$i?U+qUg9SSWFxhioXz=Xrop3SeF3Xq zkF|JorYEDic_y;eTLdSWDP0(F`fZ;i6@sm*(2cO~HYfSf1>NKy$~fioiKvkW&fI5O zx905qBE@b%JyvI5QRmo=ICrPfr)z1=WrqVqWR&E!tL3a3J>B|*Js+;QY)#)?DSQrp zr%z#!4vt(LNd$w%eTY}Ln2@chRUMxIc^>d0%+C2O?RVT=bC&LRos zE(xS|6L7+N>Vd!H>S(n%1C+6w+PbAFp&M0zTw~lY*P%ooH& zLFIHVSdav;F~)nHn071x6wa_U;ux7ZsWZIZh|ZT3b=p4`EXw&4od(6JomefEx`f)j zWEp5`YAUKH9o18?U+qoBg2*?NE=Q?B{kmY$l$=-?<#iM3;Mgp~bv#l;>JK6FD3L3} zqKOa90s|?T3IWHuRz6}h5XK-n2rA|SdWy!Ui6rhEUd?x_7gSt&@EVChg=-$eQf7nC zqfPDT9mA?vN{R_)Pkyl34(i^aL}3@ravQBu6fiU7YUZe0Mlm$PoJBRFN-UxcNN|fr z_{fhkGBRHhExRV@fm<7igp|HKkmk`Vt2&Zq9#$8MwNbIuyV-bRP@EN2Vj4GD%wBJJ z9YWH+Ji~PlL76)7c#a?@UM$h4ySHj?B0HDF%37`*MeqmcUxr%agTLZoh$}mCqU<&n z$58`7$%D+F5=t>A6cc;ib1>jV=PXR~l0nP~-EuD=!V;>LIRg2ygS@EEi<@Z>RPqp? zIfA^(kXP8lKEkD^nR*l-D#_B~1KI((ocVM)DH0j(!u~78Zcp6l*WdRhpa^=JrIMmO zUFXGj!idj2+hou}!6Cdy%Mq;Q0YPy=&?O9WDLe-gz2$ zU#HOEf|OY1AtGsXnG7bCH#&KjSSv_%4y?tl{~bpd%}6NK7*v%Oet&Hwz?tc!;~yjV zZ}`C;R|Yxi2eT~d=aV+iuVU$Y(m6>YCyKmd zF-)`>K>~S_<6Ry5*;x5|qco*qWcn#d`SAjuX1Rfvg;4jq+UOFC@^Q0VolBeOw{qq}SJFk7R3|nk8030 z;zLrLU{z%e`hueCw%9pX<9x0_I~<^<@zFrV7p+}JMHD$DiOFLKAj~~{=8}4#PduOu z1+H5lyg*P&3o|gDU%1fk>aR-rMTJy0XsO9jwu;I`=|al4DbI}E*bl|eR7oBXO^Uu`V_uj2ggbLa~^=WmI{iS z^^rB{GYQ=7{Ym&B*EH`n;C;P;cU58=F!Xk##fFsAW8=2^J;O(R)P2*ubl}r#7oRrH zp|tWHO^Jw!7C?eoO6Jjl_H6jV8|1_{BQ0_mx4-7F~ehNjkqF;iV)ha`L16Vv5_mQ|uE{_Kj zO$Zw)dkL?k=sZqC+GuBg^O`}JRTQk~(QxIcdV;+}3`teUkTaJApaZWAu<%j##)W`?!_b*l-5OXMXU_2F$AK7<*2$`28 z%7!?qyit^a-W!jd454EYcJhikUgIb4=+_0OdHh$pddApYkF*$cT9RC~T7iwLs)!J9Hrb;3CI)=+}oMB@WKvEvYSx<;DRDsfU; zvLe-pM|feO9<+6w3tln@Krvnd;T@AGx|^V@>uhAusn+oMI@8K0{mA{yTFeayibx_b z`P+K=iu^j>=?{{k&AvH;VEGsBIjVgoZivFDCwpFJDf%&(xyUB$=7@&8yz5%>maNvs zvg2|3=#1dn?1V$xAxhFUhc-3p*#{ znX{Yd)b_(CG@toe^Q-n2XGb)@nMk|ceyF(LqNLd%Mq4N=X4Us( zN;UtzpC=koinzNR)gr+HVL;Y`imV;w@HQts^)!MuhfArsI6aaZL#JJ^<{_5h6Im=I z)HF9&RVUZ3Ge|^aKZ<^*_?K@vn%ZV^^G^M7r^!&R>w;{HP`>t4hwh{dX=?Ut-OZYs z(mo|dtSdBI3wlsyVH|C|4C4u3BkH6x-FqGtZc}_*FE%WaEFZA-KOM%4E{aomI)hSs znmLob^F%m0aZz5pC6Hl4>%M=Gbw93Uy+s4gpx-U{ey+%4wdbVMj$L@s06^mLM*qg!P%=f3K2 z!NQSY720g;@SveOWkh*R&Kgn6w(!l2`4Ph`k}cbU%<}bYgA;A%YJ<;BW=zzOF9k3_ z>ByWrtJmH&JDjYgiDt1v>PZ^N@XKxW4LE2%P^w=k+fY+vQW5)FBzdZk!5NtSa%|EP z1@l}S@Su2o=wp2UE;mZz)?p1OVf48yyQ^nKK<~`ZZ5Ii36BDEXZ{@U)=@)!_{Ckxx zl8+$F70_>a6leTy*ch{w0q5WJ4W8+2FLRk|r(fcFvFpTGtt9MFvymH?aBToK(1E|b zK`nBU8@mDtMUT(?DBz?~ zqGzgY@33h7yJQ-zmABd~f%>b$_3zDF{xMPSn4AcWhfEbauhgcJf-ctob?4vz6$tYG zz`#83LFeZu+ctyQpMdSvB-vwgd?~mCV8cdzyzd^{)9WKeDWq?QT|lN4bJ7LD(US#Y z6n2)mEoj>dxSH1$1y=AAz$NJ-tpEApV@D~__^NTybX$=Ov=Eyk0&utew~H1US;|8P zYXhZ=lRpZWxoVzpw;35fixKnr>m(cJwJBdWQ$%|9M_nU*&n^zzz(GRbnnyHG1{ zSQgYE5ag#$@OrG+EQrx-kt*r2)04TmIq)gmV}N#za4Bq_<$++IU)O&_9JKt0e%uquvmvhk6{uZgWar2J5_Owin&oESB>ReMSn%-SNUMnHOU?nSDpuxnF2lTjsRz3}!ppdofcN zobx{{RyVQ+UPziIl=#uUL{aC@kjH=qCePaEJCDE*g6wC z=>{DyvrfP0YyzFQ01?&QzkBzm>nYO%6C}{R?Q25wjZw+l!Q{HA%V3T&YquLFPQ$*I zUjk0@iv@U{Mo z3l4tFf3cMcu<$?W;o=u|g>XM*Xs3)h+?WdLZzF@JKl|8!hMp+`4MSRhni&EOJ$&9N z2l%g(>~i;pjS_6Cp0W<7;xxa z@Zn-@Pg`Kq(4`*9Wj(D7B)@IbmnM5*RJ_4!kX`4s@4Z-xhpYr#0jBKRw|jO|HClih z6Ds$KAttBGw(N?x0VMp`)<9NxypTg7_%8>z9z9YA&J>hM@d=w%thpGeQ~(VsE1C+S0|UT>9Z=cPsG>g!ha4z{Hj?`tC^c=$6PxOXE(lbo`bdut%G4qaxs_xP>tttMw?t zqPHE0g8?D78mS_o2AFH5zr<49J^~4&>EKS;+Zmvp%V7v+N4^jfUnIQOGa#b;tG40) fI-*G(?cv-PcF6vyP=YENf?mif%M?B_dHbILr^r3` literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_inset_element/host_nested_inset_mul.png b/tests/baseline_images/test_inset_element/host_nested_inset_mul.png new file mode 100644 index 0000000000000000000000000000000000000000..7d558c2e71688fdab193a37c1f76c20dc6e18cb0 GIT binary patch literal 17299 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 Rf>aB=mQr|`|NQO8{|6cHU|IkG literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_inset_element/image_aspect_fit_bottom.png b/tests/baseline_images/test_inset_element/image_aspect_fit_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..06aedc56bfe63071ec6f0984d00f27a0653f4c4a GIT binary patch literal 4545 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 Gzw--t6fGtI literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_inset_element/image_aspect_fit_top_right.png b/tests/baseline_images/test_inset_element/image_aspect_fit_top_right.png new file mode 100644 index 0000000000000000000000000000000000000000..c086ba028a8481f726828812f06e861c452272a6 GIT binary patch literal 17918 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 literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_inset_element/image_basic.png b/tests/baseline_images/test_inset_element/image_basic.png new file mode 100644 index 0000000000000000000000000000000000000000..f6512e7b945ad320a87b1c7efb4b60632e9c1518 GIT binary patch literal 17998 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 P3sO_keqQ;^=FR^At03qE literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_inset_element/image_standalone.png b/tests/baseline_images/test_inset_element/image_standalone.png new file mode 100644 index 0000000000000000000000000000000000000000..d9b24f62a9f6855cd27d2bcd36e71c8eac5acc79 GIT binary patch literal 14888 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 OJ{qdJD%DSI-~KOhx(amw literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_inset_element/image_themed_bg_wraps.png b/tests/baseline_images/test_inset_element/image_themed_bg_wraps.png new file mode 100644 index 0000000000000000000000000000000000000000..df224499e4bcd095a23c076d58d72d456d31d258 GIT binary patch literal 18031 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 AC;$Ke literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_inset_element/inset_on_facet_host.png b/tests/baseline_images/test_inset_element/inset_on_facet_host.png new file mode 100644 index 0000000000000000000000000000000000000000..b94bb0c00583ea5ab9f3a23868c2744e7492006d GIT binary patch literal 17425 zcmd74by!qy+cvrY5h*bUgRp365NQ+&TI*i-y6@{cuk$=F-ak{8qa?dV20;+z(Kd5=|A;!uYCEdi7&|(@us4E~UO3uX+BjO88QyR*vUf1Eu@>Ow zb;y{4X%nt>mf73!X4Gih`h2WJg+PVa_OKHF_RLtBfWajAB7`9CmyZf6zyP2} zT!c5kxAhkw0tlk_h0a0H1n(JXaK!H>L};tSpg3`O3rPQ|IBZH{p6ISKecjvq% z+;+gSQP3OEJJB z>&4hO5r@ZR4)gaCb4@zpm%3A0WLl2rVr*JZ%aO~i{8J49X?v@~XzAC4L#1}fQO;X4 zPXiexME#}Mp-0&Zs+E$E3%6!%!JGKrZn{gC4B^LWDe^`^M1^x&IeLSY?Tw9%^i-xz zVVn`7jtd)#EeR6t#iXbN&%LOqYPa3YOU&}$RY<+%Zi9(9oQ8A@O>as`N%g3iG$lyY zgmdegm%G*+EpZC)7`H}VT+e$rm91M6Z+6(%%WKjen=#Y$S+1KEg8F6Xc%cYme|EzRN7${ElB>t$- zv`f&U@9rt~cs*06Aob1Lw=_~-9u+Nww?WP{}keL#HYx>MOtWOI; z)&UQ0*t*j37=#7~2jdsubzy7Mp+YmKh%>eIBcnO=k{;S%LufvG_HmS%AjF?my0p^c zaLa6OWpM6`B?^UduxxLS6If}WJKt^b*K$oE z%zjgc-=|x?UDmHaDxv$bKe5_o^werk+SHYbI7JZ9%`-{)dQAVwt)M7ncjTtwj+V_H`X#*m z`3?#Owx-vVJCB|?=0&{}Y7RNu7NH3if!o?V1huQDI$fn?5;%G7+V|w}SD6~xG%N|e zy&av#ecLD~^a#1$3Zo_Z6-R)ZnHX$gl0KPCUuJ2u&#NTKwvdY*16*JK#HCA+w*7{4{~g8-Vi+DyZf_SWyb zc?VYF;&yeyPSqG18*fGsTjCNQU~Y9v3UG~$d_sz41h$R=DUCaw+R)H3ggmyi#?8)Zfy?zWTe zPsfu3W<<6!Rj0t1oaw$sG^}X-;V?C1dYwqmhBv37~a;up$ zQzs+UEArrNRJG&bCu5$->~h$$Q#x&+dj%)`Kk)p zIJ2sI+ym*vEwrXh&CEw%+DP1%14{($zCW@u$k$m^OAE;FI2V(1rn|^O%b}u$?6t#u zJIt5j>dYBUfunbmpB0yfd=vUjyQW00NgC$Twv8XuE@xd3HeM+yx8KdT9xp!~nANXx zlfCX`kPQ~2Tx*5LY(A;!;T8>FPcOR4WDRT^N*ZpBx=Kl_p${Dz>+61d%eAjP&3lj9 z`R@u_>j`hGrJnOx>!5;cPpzLXYu5&sdwy*yVBu8R6PMr7Od>HTaBNefToU>zu6*$L zVHlg;GNe>U%#qcra+{&qX!GA*rfd5B4eUiK9}>}g78WwM-b zOZoEAZl@SkT|LbN(|F;1LP#7jw-cq5UI1VAirje%7dAV^ggZFn3SVG->4v1f$*7$1 zJlJ^AScugLVv`DhwOkl3YETKm*bw>+ z@^kO5oZ)}9VahO2(?|j3S+AGmm^>yQH!7OYc`KdOUt&7ebr+W)TDY8XF}Ye$h)cIx z+NLIKpta;|)`x3+vIX;su+2{*8ig*oAeLzg+l;+y#gIbJlcQ-YqF-MX;^^aTB*ym8 zoz`>)jf%D2_;^W3K5}hp=k+3!+h`=F(X_+Hy%oB!thtOcUp(>Io+}Hd)XjW)%tAqE zchg|9?}(O9Ld;ENG@d}i4WW|FD4TQsaq)){>kJd`D2E%}_Z;!%`O z7T~4kiQ)uY-XO^TGo<(@3>zeJ(b4wc(*;(oZGjvxEPwb?q8>z3mM_)AcC3e-;5 z2$XyOJEZ)tY3iS_&OZ(8zrgjso-%!pz_xuPqug;Z$@OHA?oRJ%eUxw80sATicZkzS5t-`Af6FD@wzjB0G;Bj4TeTs4jyi9(kyBJYo_AQ^dS?gZH z5)5tPtmAFsOfYVQBrs`-Ru4ndh9w}x1Fs9nWvHd*{hqpla&HHcdCk{b#4}7Ch;7z( ztsxCFfbVP{lTYNml-nJgz;dW(ej0o7@!2?zS5es7_LeCmJ#(~;k?K9}8Ou~F_P~;NRe9UaB5S>nRkK>dyNmj>oOZXA!CComEL_kuQT45yS#K6> zuG`jCeq4;_#zfFaD!I$ZfXLi^X@w70_57T*UUyUXSGGHNMfhYCGf-hF0 zh)s`kRz)55K9u1H_n07pU4QVeYA~jB`66fJ@t#$Y&3@wVInnF2hbc`IlzWkDvYGBl zRf*Z1yEGC5=AI=`H|F>avA@}Icyg-3K%?J-8<6+U-W(k<2SnvFySNe0Zb#DNeBA38 zhZydOV@mp8Z#PJwclM)a9dDm}yIpDou;GiaQD#thnKlg3I7LABIU%^xnzN6e-!PmU zsug)CGl;9*e)JT|dY1Tx-=sYYUpphJJ%&ID;=ptJ4g$V=oQ@8nKh&3zWTIh55<(j) z><+0KX_9e{8ygQ!H+HE!9&DUby#%2SCP}QutM&24cw-PlZ|;lwd4nHs61>6_5^Bu* zxKpr9&OO~J+qY9RA!x0{Xp#2t_z15-`UV-$-|+gpQe@v!jD&YSV|Dj+$#| z8?#r`e<>Z=!VRyok1*G?`9kGh3>!OH+*$p3lgg2b2-@IhcHw$mUbLDze(xmpanbdR zUXtuk4igSfzLfxyaz6s+OGat0%|=S|062aXG_ITb{96tD2S86koJg;O6di&0pV{%r2gR9tEMbFyV=P@TQ zZ&ef`(E|xe3}$&rBB<6C?rf1AwQZ8An8$x@d-sablh5B;F#tI7&s1z*u@zSJy0rkv zg-o-aR8fby4^xf77~{6+s2FCOv0K5Oh@?mBrcHH9bN6de(Y#pY$TQG{kwWzSjAEW~ zZk!9%I*L{$WtVD=y_;xawj~0&HX_2T96O*0icdKL0)n|c@n|8lA6h+Sd3tVxOh_>Kj+w<0s z;#o`IIw+ZhEF#bkXCHFtu$1_R{mdD3NR2#9OzhXFe03gFT>Xj|{gQ`10mfZmjtjl& zIl|cK4CfLgJ=KbqLhr2?S$iHMgStCNAzLo@{dHKrWs~E~!bO46^#ZTVQ&bVaLHWHc z)N1!0eOo`vnQr?LpZMkw6;4W^Q0iJCE@<1?5^4#%i8!lY?(vkfKU<^yl1SSLs3|jD zil*kO`m$v(=T(nHCO3L&OEW{+346<4+7wyBR91&Q({&11@dXW4757Wu8%i;ikHC8r zMK1l-97?77`b2hiejZ~}&4@1FZDxP)M!2`kf}D~`)Id_QnyL~tm-STs)19&(!7(PO zJbL%(j1oXO>el^LKG}H4uEZ#!Q;i$IeMpcrX!^|3U)Mz5wo|sfg3<$!jr)sQ z16)4jR#CJd`bD{=r{}cfPPBlDGWzhiXxIAv^IkNDZL( zmTTB)Fy{@Z+#8TA3nk-wY}R^GaiX4et(*W>%ZIn8aP*D|^^Cd~s^-KV7MfytqNQx! zUaCGU&OuNGYX87g6m#B~5Msa`W8`vf>-NPSnXQQ$wSJWCF;RXN2xm@S=mDd3#TB@Z zTQ_V6quq>*0&7h%_i$#L!adF|-S>{CN4xKgEJw>= zm`0R7O2QcTS?qp^m(ET=zHxIVQyMls3FiN}E3N)>C-Dm5S&9|oH-jb#6#ed$9Og&A zjG~2J&JtnDTo&H|cJUS<)3Ob!H2i|;Ke$+bs~a3TXn}L-ls<)J(y8a@9crXM-y|8s zH758encmeZ&a{8kfj;r!=eT=Uu`6j)3T!=CgqOY|?{y)U(B?jFG^{|&Y_t+dRXGQ6 zy?iuV20)EEWsgYCk5-g7wH^u-&CLr9ReMyB!R~$~bR|oFGMhkWr|_Lhm?ES6&bLYqv-oy)k$(S`_qd<85lg9 zf}mK#C`RS8TSZeCV-w_p)1AkIu1Pt?15Tw=7=itAM9CR-!L^3+x~ADoI;NG6UUTDm zC+gfJ6+~~@ccKF?^GfM!(@)dRGhD3SW6D$x5QXz2n~07R2u9DQ!%8%lw#}G`Nr*XL z4t+4jPD)XsNBve?^E?T#1V?rQ!5ms?v7{mU1!w=Fz&hntCcARp6;~XmIPpCVCf^{V zqN0ij_!(33j^#tlOXsV$cG%6AKZUI+@RdzIoSm^q$9=@3_R=4k>wtgbQ3^VuuMXyX zwxCq(2nT}f|AT@5*COE`bwz~e#hoH_M61Y{H>>L`4c3NW!``)FL#?pXQg`FkJWoPI znr+7A2M$S^fJ$X}@i$|Na{eFO<9{a%{D)!vucxqpoCGL;jZ6)8;qrH2DFOE}-n?c0>PQDg7WP6!JnY-)Dp^e$V*2)}qqA3M%qArze5@&hAf(2YJ ztjvBk$-W4J=!}XEl!mmG5`{Y!huR9}yrzC+7M>xDr-pQk%$b>(n2Ib1`3=W5ChKYF z=`F1x$fS(gP0?V>?RmVAr^t@YusLCDEvGp6;?VpBAT~%oG7fXCs;!ZHO!^-pB9hYS zA;u-U;fuvQIm3je$YVGc%DKUR64TBc%h=G; zQe}SfOfccgSn~ItP+bJCo$UPiJ|KZ0OhpRuV#0ta z2)bmXq^dyTXtU}{l3g0eOU^gxuucu2W>2~;7ZllFjl&+N((tmeJpp|FVgK@1;tSq# ziNqJAHEa+D-+^or#;q@^lpr~JrW`0<%Ye9_!ve8P0CQEu{%iPMouv1dS*r_aYZrKS zz$(m8)-kxhFRfYi=frs(&eAa} zge!tW>e=ujgC)`XXYn!%3y`k*) z+D$Jl^`d!3IG*5PT<%k_wM4KO&*MFy>3z;OYDr!0$Dn~yk!o=ta9yc18`ypz`RQI2 zFn)F695m8!;{p`#aV;`}xmy>?e$lFFUsPR)XX5j<@T_|U(Q_X%nnLql4#31eTH`pG zQ}Rg=v04MbaYX-XFk!K>oqu%J;(_8Q88J!n_7+PwKtGE!?9~7N{Dh(Em?5eH6|!V$RZW! zT~RSD@0U%=J(->>9sejo-vS5ssl0PqIRV+xnqb%%4pfT$zCs};a7}$zAGs}3D|m^u zm9nkN$$_1N>h!_pG#~->t&v^~0!RHzd%J-O2Sj@G^8{xu^bSWv#EWFfbWR;fILzfL zQ&icEOF9rPhO(=h?<{o9xz!b)t(~9DB)H&xd;=nUx3n5CYQiYuc~ofjs=(u5(r=F6 zj)>%Z;l3a*7?n$qK=4U0axTPl^jNBh*%kzoqs>Mpt^1YQ?5pRDu2i=%)xNK;x?v$aGKAbPu#}zHti8hzp_G%@IjB=!>O**(`Q)?7n@;E4x8h| zN|yRDxTGR5=m{q4vGcuyoHa4W^P5eq32ba^KWB!5W72l|JrI^q#+(ZT&$%&k zg2J4E;urP4tku{If==^8i^2Sq>f<%BZ2byNKEv1nAk1%aTzszlGVZ(^nyU1;Bqo9KwQfp z<^&2O&Cq-@U1iC_veJrV!?PP-VoRVBS(l9 zUXD%rE)Ymq-J%{X0d}FD>cT4TsTbF;5h*kfWMk~E0Z@2PczI@yNBrC!v+l2RYPMYP z!cLHw;>&>j1ro1dHtEP1TJyZ9MHuyoJJA2kclRmx_IL?27?}Cd&Z4pHS0U|vuv2&> z&&>ea!_nTbP1|5s_Gcq}R_0Jo{cuYr_P(9t>QK=WoqLeUI|i}ht6W$WO9b?&Z*SHJ z`| zm%H^euN3;W)wHVCItmcI`>=Wr*c5o0IWIZ*_pZixZac+QAvp~Vq<0pELb(b)H3aPf z{3}37nAg1qSft)G6{Zx$C^aU}oshk?Q8X}yNc1;@r`^acF>q~gJRa+aRz7Ivbo(?? z<`DBaO1F_<%qmyRc`eqUl(^G;vEV4IC5+RA(F6p)sWL&c?#LSl`5R24-am(ea(~CL zhzO&_!R^d)_jLybB2%3b>p0+b_yTrXWB{|r(PA10yl^3aSlZ%d;5DI7H8nVyj?>fq z@wubgjyiLRmC=e4r?rto>31Gqt^k3f@&@4z@1IjN#3Bu%v>WT!g%w-IKL?$!loshYbf`{Tj1i@^5_Mxy762E`)KK%swqy{fSYpuvka^68&70)AP?1k z3_|#=EQ?~~mp8=ZkN1`U{J$=Wk{*(3GB*|=sbPmvvKx?9pttlw`il>wB;5Bj;zW_H zhiAY=8GE-(d}@XhyH_oo*Y;H^1(>X_K-m}BfnkE5HN-0x_-yZ;!F+kI!)v2@V zUIyKPE%#_&y<=AxcU!@XnEOaGv7*rk*MX;ImWkr#`?*ly7{a|G4xKz8h zVJc!XFXIM@%iQG$H58iXV#S=flf4NZU3*MGw6=KiO>DF}$AjWaL`-b<_ss3?6oswL z%{&_biJ;mZ?H4?{^WX!TEeYy!1ae_)l->ZV1U2I)McB}%TAM1tX+X6O+mKS%J<7rWD+NQ>jOiCUyC z#04-^Uy^KqqP;=x^Vi*JD(j$fj0cIV?oxZ~;MV$GGOG4b z3){~;IRzN>8t-#&z#&rep#a+rYNLC?wKO{T)jfWiwOC^_lAFx};CvGCh8GA0eO<|N zc2K>D~DR)Z_mmq|cTTS=9O=@frO31&Q*qlGLl` z2q9ao5D>}%$jXElWtQ#l?cMvPZ?arJ^El@lPgEnqV z3d_)VE&Gld)i%ujq`jjusYbwSurkmcr4DRQT68!hh^i6IWT;84j;-ve_rN6;lJAxM-?oZ-D~G~-PV0Cyv_$}^+AL+cl5uOm z2g$M+mq zsBlRq+ox^VSv~xOIkZUn>FVLC^ml%DiUW<;gXA1qU0X+HoB8h!jVuHOvjd&mA}ges zGk*m}8Wfvn+gIt1RhGEpR2WSeEXS)bThy3zGGz1u0FO(*wr?AqXScTQducH?+oHAe zcqwZxkNIW1b8n^t)wauYxD^?@&Y-yUKz=gZaUmy(#++Sg?_uV6lIM5H3mw6L-9+r4 zrslkr>`CHFE_(Tm-snjjJlkzQ&;=X8Ahvtx$7H(R?c>kD8E#%=hS`*n>|bk;GMgV8 zzxBpo^W^3b?@RyU_L!9S2(QF_Q769biW1A5l1q0wf8o50;MaRni9g!FRTu}h0XCo1)qp#VMS-#gkBAp#)-JMi|;ph#~-;aT3YE= zNiTMP?f$~!CtGRLKXz&kuPH9hfq&tcRj{ZvLBt$7(BADDAyz1KJrvK@zpsD1$MnIa z<5+2|r?YGNRw_=+JPR&ZNe4Nv4`YP3)1vmTYv|uSIQVsJ2JG-A1LmRQbvyvO+UU%+b?n%F72CatRvlO+!d?wdCl-V7?qo zuz5IFGPA|nnWvEVasVw?bZYRarhzAUX7I{p<;S(%8&(5{6P8=C^6>RX>Q-${ps2<)2zzTeGixSjwf$( z=vO}ZzP+2Nb?^Aja#b%!c-L0%{@x2A&WPZJBmHvo>@l>e4yJO;zpNLd)6iN#-5w#Q zpq10r4YO#?pFTWXT*#{_a-4&w>m`zn>war1M4KlIAD!*;vRdL# zgG-zR8~j~yg(V_6b!r7l?w);BXbx)k{=&6}r!h|x`!U060?-ZfS5K~+T610N70^#Z z1Rp$@PHX+Obf~_2WU(pqV(D(+6@i;myHqPONv_L#**&Jr^cpNa7;z}N2Hr%e?{Q35B)zQn-mrO3l?f4Br zD;-1A9H$_atxeMf7dD)_Q{_I666;txX;6?4XA5x^ciYm?ud!Q?4!864aGdN;d1q!J z{WHBuy)Ex@1UI7Zd)fAmb#*1rEGSQJjU!M@{YQx6M~b@HMrrM_Lf@KraxhaQ2f#D7 zd}MtRYI6R0pPd)Lf9tE*+$weZlSjh zx6NC>nw7h5rzHkihlx3@b{z%AgbC<=^rt@81@;Pu#TTqzS?$%9qZAvAS-{W`TV3_YH5F@;-N}T)rT`H-Dn6l_$?@6S zAy|<`hmCwpK`!a*L;Lwo9^GOoq^prXU6-$tZfMbScA&bmqsC%I_x9hvn+K(vqSi)H z=d+%Cmzvs8_Eu?1i`@4}y~Ls{IkPPTC5HQs+TVQER@}$9LRA8ndwGMixko4NMp2K7 zl^cG4m$;(Czc_Ljz!AEBc>U3aWo4bd={cp%%Ce%3M!tV!wWfW8T4L;={%(5P(DWQp zc&-H0pnXnKbR z=*bT9pAM`TMwSNquR1A0g>?v*C0r;N=OtD;aN?5_Mk70_>{Ue0v-a zK7GoaRt@@IJRzWyjpJ8Os8NItS1laOPJ}YZx<2 zt0jj@ttx19K;8=DNQbR^@l@e`9>Npb7#h%1aJ|H`CutU~Q37W!I{YGxxHJL>69fdE zMLW!UXzX2Pno9%2x|fB6$YE-tu&R}I&M zGS&5k(4qai&-SEjZJfQ(w^c#uPs7NFRa0hti6l~q6;mmYqY&D*9;rOM!~v`gO~*{= z>jUL&SA^f3Qi;DA)+3!kk4Xr=*wgDdinwcMxGLqS?PEXt$MkbuJhy~JIU(B@naQd1 z>H83B<0F~xOn$}P+9F*D5iUNMZ$4K7IOe+f;Ai*DBN6nW)@mw%O(D$SJal(D@zxzDUJv6L-WZ%4JDMX8w0J_01n2l%|*QqCR3*$+#ZU@DEHhex5s-|PY?U~b{P+RGQ)YY|FU7}6u#~C97j|#e~*CIruUk; z4koDj_|=y_ftO0k-l zJ5Mg!5sgFv$JU&L8ye+TEFUKLJ}3u~LKQ9CzzuiyaJ{^0mA1CyUQG(goEqq>ce;+5bmxID67x&{INq;FuLi>Zq38AwM(xOk6?7= zloBMy|JXYh#>VC(Ydchio!7gf9OfO5RzTGOJZSgV7o7K`u$w1^r~RX%4t+zo*dnle zuO@q=BiM}|j+1ajvwwwijaGZ=dJao?cs_<8gH&^x=E%7nBu}4h~ z?lAPX8I5V@lxmWS@f#P>#1^I0Fy6rPS~F)57^#*Hw39w_(zJA#$h{143OlHM_O5D+E#XmMf@$ z66BeY0(EcXi??Ant-eGd3glf=I$+<|wxEvl-cK(xcjw4%x7vB*3O(wybufFsC zvRUJhEZ!6b=XZF+B}5QJ>dg>y&uztl^zxl|-5_DKcO@G2G)hKnD1o=7VvVG@0g{LT z{eSGn`k$~Nkqh?k?%33DVN}UixrsUs1&AQ$aDe!>GPbLLqZ)BCA|CgWaAHyjyd=;v z!b?(;lUH$OB4mLOP$7S}e_eni22vTsU=>y*6)m6uZ%xe>(*V^R$laI0F>Tw_5BNC) z2m`W>1aL&q>EQXFV^+oc6Azf%KO^LVuturJ6o>LcaETK{Pj}IBXoZ@P5xc&@RfW*5 z?;;LuCl-l`%^FEr#$0g2)QD_djG(Ola`$WtJa5v3I0F4@EseB?RV5Tr`cl8vo3PFxx~ zTM?Zg#6&F`q5If9b8Z3qcD`oT;Fnn0=BPtfl{n2jd1R}5w(jxTY0{2E-DI-2J}jD= zUGU3GcbHADrsr@`*MW}1ZcCOK@Nil9?!X0%-c(jqA*X(s8F6ZK?!I# zED34Uoxz}0Bi5oNS1b;X4#YRGOeSrb{?21vpX{U}7r_R2G-z@LDvcM+P)o=8F~AD! zICs~ElrN{Xb^9_GfGE?ac(u@cEL7|`;d5GO@)Hpn&R7HpB7!e|33KSA#E*FhypAqj zO=2IX`ixnBdz`STZo)3x?ObSjbYH-8P5hWit`Krs8BlHd#QYhc8?V#d{+|YMx|zBe zZ@Rxe$suclo1T2^px$RfiHED3v}ei(Xf{8qEcCDGe`eBw=&T;6lEoXl<}%b|RD}YW#kdf^RPXs zpmW|pRP4-zp+oOH{q)lyY`ENR+Sh4y9OD9X@$ZX0#s>djT()4@W~njz3n_2P?9J!j zlnw3mSTeh9EBP4IFy?*Ws#)t^CLj=XJNbUQKSa!e)+$a+eULx3f8eSBEM0Sy?Z^>= zw8n5NW5+e89T{M@M;bWTbib)_JWI`t@~Tm%qWKx4Fs#YbIY%SKu39HdbIr{LSAcB9 zxJh_<2Qi9ae?na);&&=@vG%k{)JNBWgHl?VbOW|@)BH>h)rUj<$YIr*@`Eu;QNc1lxeSL(v>dJJH5}t%m=>z_47D;AXhaZ_(*xID~bK? zUA=nAC7A;vh$LpW=T^2}#e-$qb`2mN_9m-a^jZ(W6-<;}p5wMvJKD{AGt!PIu4PSp zQEU#C42(h@1SgvxKVWjOM0lgb1DOuPn)^&mAI_X+At@L|<;TYQu&j!>)1BMk5&pIV zg$kOfwZ(~PUFCn}@*E2kNFl@T=eF;AwO)ZAOh=}(k*wXtE`PESuR#B^0cfEDOy(mw|$#mH;2CAx2sVxUI7vy}z`G7cbz2>D_54mv{HU zA#pYc7(pU{+6X$;8iSdDYoX$ndl)$4LiithR6Z!^liqO}ap5qih{w~EaWzg#*GsHR zKr3c?qrUS7*(1@ceH1HY#3F{cRabNOD>oGTyPkmr;3!vcMOnti1C_Er0U*_3P++R?)Hl>dUc@ z2Cf}WaMwBKL`033Q^fSefgib^dAXi1j)8dBQ#-MV_nU2&0#$lazueJoq~GW?dS|hx zQGBez*~Ud$TKWJOaq8k`TB8IeZ7Me(9}E>)wC#Y#>N?Peczx{-m{(yb_hskWtpwaj z_egY437;impjvyN`jG@2N-zWpb#pjZj2QvFlvgDXZCF^%f2D_%mB1mO z;$#93^-nWgT$)0JGO!Er^#EoFi2V_tPk?GaXJT`DUK>1~x${%T*H#q6bj3WDh!ttb z<4rGG3*Wm62P8fa=Q6OT$DD$Kf=gbakodLXE0EJoNb=j^_B`T`sOzV02;x+uc`mFUwq;T z(D~GWk_(UqWckhY&v}3x;I>#FtCEksp9kt@!_?!Q#pG*3=Hff$pshc;WmiXwttpZ( znMFC)6mPU{(@DLyg zzQcyN4T<08%%TKc;@~xC0R>&i>%`@BtA&TEs=ZusI$FqLW_30DGOKc=!Y&PufgTo% zjTU#!2O4!M=;O}BJ1jnVRfCjOiECs+2}XG8<-d9##c1_O7WbQ{&D69u^>DN=x z7#bEFtP<*R56UG6rXz)l-??lk1+Vh=NhkpO1`Rd!SI`X}wFpdy=;zi+t4c6K(UA%G6_krG|(Xp7{N0S=>kH@nF`Xg(_pcc=ko z%&1ON283x93s@**DZjb zMD1(yt|T8f=KT@fP!>sA)%M3pi)E>0Vx3lsi8;>Jt$J7 zg^tt&=^%s_dbx}5y!*zx?|f&x_um`m-9M5&#_oHqx#pa|5~8J{#Bk!`2?&B1lpj6N zfgnm01W^!=(}F!>T_clVBZW{jLg>2KAUvPIts(U%2-jyWh-dbeoF3M2cY7CS5kcWw zf_H9m+943G?ovWRPXF@^K^M5K&^J?L2e=EJ>my@#2%~7p@dEb!w!RhCn zPwt-9(()k*C~&^LwkEsz;Nd+5&M$4Q2e_Fy+v%7JclfJIV~OyB)JYoESevjon_G@r_}*X_S(o zp5W7;o}O;M^1H!dxNK4Jopz4ijrIfye6fs8+Xe8 z_XqoNX-e;Myw|3=&(|)0r}vr9&Mdl2TEr5>@v5#vr4#KqZ>b=5k8$!E}O)_%4$m>{s|P zgs5Y`+B^A!Eo-*Gp%Q!Uy|;cBcp@> zGNM1v)NyH~A|qk5U4kIG@Z#l5S(4j5O9zK}Yc@hf!t}=*x`z2&`rLT7`r9#3c1j)zc^Id ze&PPiFNoLjK?L=u(42;#y4zs5A*l5<1j6j*eTW)@zMiD`Uk*&pqZRn{vQp5} zp3~Dx;8fz3mRKPd!B@$d0~Ck~*tEDZ*xBsM(rSsIp!%EO{FhPt-}(SuGl}xoZ#AFF z?(WfTvy+e^rz|;q#NNJ_m3W_$ii+v{`HzH#WgqG~ncqRUAHD0ro_!iSoLAvK$Z5FDe!4BrXR&lZZOi=*1>T_oc31Rq9aQQx zY`~+D*!io_s;|b^vlyR;9m|pR-T1UAyVfS+GlTY&X)?z;qwVz(l-G&;$H51jtl8BV z-6Xy=sdRYD?lpTR&%E?@&xUN3=iIPlp~*6iDSm7G*ifZ)G3}__1M)@DUd%+JlfErFgt|#je5_d@3n!|-xl8;is1``;VlanFLKkaHO`N^(Cv zkHcP^>*h1a%>t<{Y^m6X>`=46F>F%q`gxG_`89iYIID=LZO3KuT#u3vZm(#N)FDmk zZQ=<0L+8igxBUFoN!EK|Tz)6a>gqULP5uO!;mrMa8E&8GB?#FTJdpETb}D?T#eS^X z+o3b%dF|nW@7s%Fq4TdbK~;+#f7eJE92DebzPr22znFN)TZGi1-D*W2>^f0JMSYMd zKr_E?Qj*IXel_BzpG@&9!ywOOsMfz~ZV353No3k(%f@OB4M{7Wt z5Enpc{MsFV&7l@XH1-@t#>(x?UOjgWEjao0>sP;>pQt~d=`Uahr4sG^Lo`YWO<(I z0;MIKW&v))u&=r{#-Tq4X*`;Lf2p!59PhjKcID#k4DJ(BJs#UhuPL9NXIhr^AmoG3 z41wdRx5Y$;dS8aWZ>gP@=Jm8ReT)Yi+nuk3XA2U`;%u^TJy|K+@EeE&tIFNlV|o}3 zvsxwMS@XbsWX($BB^yhn$B$F&$^6=>LH2|0m2PV%ff1mt&<_G6f_@ZQ4RxB0t7w{OBcAk%`h8XesN;SBao#g%i!q zr0g4pkfCqF+eoQg*z{{RRubiDQSM|C!Qv$?gAP7PHv57QJixPd5ytYIqfNox;c^$RqRt{vqI%3s1;z5=MF}0@MN)hu^DQWk6eK$>-tjY zLFfCo?Lw3S>Y0kFYR`)XdApt%^y=oCu7U!}M695IFPdK~6M_mrw^C%^KXP3v3jT2O zWW`_*u3qWgTv$P^?xW|AqXpQ|_7+%aGeH)HB?uxZfRo1`_*IKP8_D>*xgjx**Uo+P z(L^*av!T@hWAN51?+_XG;sqrWi>HokCAP1_%$L0I%1K4jlb^HB0xeyp7h(q*pRgnNu~kK)ZFCq3BO?e2h)w zL2xkh?N<5xZE}$uk5uKSQ|wYX<>y%Qf*1N-R-f^k z{Z93U-q(~$#ItN69=y(D1r(nlpQBu>_aeLk;hx+Pk9}M*-Eo*~ZykP|QI{ZxR%a1` zAeISul~5NR!IXHI0$*8{yM9AVJtTXs0{$n9@~%m#yda3)*ce{VmXOP`+(kUsuPffY zdv}_QUy!h0#9u<19wzl0Wb*UE<_>7!>z^3Xt|D&=TX7?~Zz!wCL`$~KeC$qFbzGnA zs(?SMqwUx(_9TtnT&S==t7U^y7>@ft|^0j^MbbtWeI|lpnxJ5M)+`H)X=gU zwL)EMshtTy2DIHb)F?p*_;(4X{@Uru3Qqz$Wr9vm=D^6y=m|qjrhFeYRDput$jk)c zv?a7xwydnUlT$+>&e%?xlm7)${`=K3pZ#yT)#g&tG_3n(YoE zXowoBJ9Zj+FL1ONU9}=NIPQE|l-|fPXm5#^^}JC^2cZ}_p)02aJAgFF8;Q z3g%ndqKoFgr2f}sl&e+HvU<8|bf(4c=1bs9aw5S$4&E;1n4pwb-@tARlBa- zfB+W8X5GWBCi(LhFXr@N3?09{pqU@W79{yDN!HRpwHy#tpkrU0tZ&&;#SA;cF0DwYJ1s-hA9Dy?9*wtY+&Pew}ACJoCXrOt)wj;9TkSz);YcHTNzScu`mXePJ47Z6mM3F7L)!ooJA6@eEhPoZNT}m8% zQJQkz-xf76ocUu_E;ZT5*nN!Bl32kmD|7EYe$4g+9;ZG0sd1Xwb#87h)a)zla2pZ7 zblJ};fQ6wMd5&A{R?U@;YZdfQt{jJ4JiDL^XU|$DDR)&YJdPlG59Y(bfq)zh5T0HOX$q&txX~ zk7dqpKiiTvj8>UiOTVdLeo4mbt2aA<+?r@Cz$KN$Z$K{QV8_kCnOzv9QCCB)eSDLZ^eGZI*L(vtH8Di zH`M$dGRiX%6LaW&ej>-i*$w6w&-JW{9A2yycaLFCy~*WB~E!1 zFI_f=`1S%i&NhI~skzyep~?jnFOiKA&$~Ev^o{!2I@bXYr4HBt-Dl5oeaQ3arY<$n zE)*z|1#ROTrH7znXOXq4;=_mW^!Em`-n&U0pS+w&U#?s{J>OrO_xvF%~j9D`Bc z1xYb6b*7eRagneSEPPr00+;4MuaspxQMqj<%89>YR@cGN?7y=vEW(IhNH@sV33h={ zBrLQvRx><8^=lhbrkAZVU5Og=dv0k_YP;#Y@BQZjxwfJpH7$)?;CV3DNB*O>=X(A) zUH|8LrRYx|zXUxX)wt6|UP@Hey0Zx_4Hjpr#N5o@Bm@#LcvGnS4>Vh{C%fKxe~0*z zvE=E`v+k`$fJ8N)cPhW9(MqUcJlQu)Qtxc@rayoBbe2Y*sgILvf0hTD&R=7I)Re3_ zAWzs;V_4|>Yx%U;Z&$5#NRxLK3LINL-k9FBddDui#SCo)uzc;AS_r2?+`)|`E>KBf zeIw;hoYr84_l#x5pM5=o=YP>il&ihA$^IE&J^FSG z7g{wrfW+rV59PmA=A2m=t@3n^ZZfg0Csb5!{<&^(E3oUtcaB_y_#PSq=+tc;W~jLf z+Un7ikBh@~&}gEE{m}lLwt0u!JV@trY2Di6d?vg<)|P3cJxO@d6=?f+tVMwE#9`uK zopoyrSq7?`p(1vEzTdtWkr?OXyYZ(B+$zt|-21wVitYO*4sRoT1bf;7pJ9Kcz%V)U zjOP5duuzMsq**Qd$P#M|Jb*(A+nQ@sm}-y@vu{*=ciDS5t)AyM;#HBJF6 z$C_CHdJhc=5stmj2cT_|&-@Ml-9@b5CCE=6qNRS?b}l3|w0o%35xG9A4S3gULM=8- zfrsHf5#iz8mC60{zq-;g@@x7=?>p-}dh}K9(DIcf%gup)r>fPeM+!;OySu_yuH0J~ zC>Q`k-bMxa1u(nf0`}ETyH!d7Qart+L{y}QL2{w77W=7l^Vb`mzMA{ey7;TfcpnZM z7wxYK6h}=SjMiqYA002|83HR*?fV*_E|z85v&M1NRlvRRQ1Ur`Zs!Q2w|h%l{&@3O ziR-?87%S&nyq0fP6>ovih;_BIn@xWg&VTz)S5upNQ-@gzl5jUUYevLYr}SW;eaCIF zAT<2A?&wfoTTrABE-9S?I}%A~pn{M7m57D`KV$--1;@V!)9bE5emMFqSO?L@h4K2p z3t_zM0+}o$?U8*z+807BcWR5!cGCHYVGIqh8p2XYJ}z9?u}Mi=_~mg%R6%)aKqVmU zr_7a!gc4`eU8Arm2?j!@ji^XB3_pK1yEQy zo`l0lA8J2^Vw-kRpj<5eD!lJfyKMue9)fRZaK3;4-hohCljQZAPCZ#}fAw8NYnfdG zpW=guS)K!eKI3!ml%?}gYrWlqiQcV+07C6p)#k0 zBYspC$NYZ!`SS0quy5~OAakgq0Vil>j)tkO<)0P4#4R+sy=rS<%72DgbLbzOpOX698;;*o{ z7j}m%v+{D2JYZIZt`aoXk3K+SAX*4=wo7xNqeQHH9q8O-ZZ8pzdzdQ$x@1DzU!Tb z{>$$j%#*e8{=1A?J(a8l6kf3)kr;^BcIahlpx1#`;T^yu#S-j1T8RX05mdwhp>cL- z`b4P-2;XG=1g}DwY0Ko&m(qhPQ_YGtHwc`N|Y%g zD-)I=0}CzOceQ6cyfG2M&!Y3ehqk(#ic!Y3%jvqx$L5|QNFjfe4s?xB?YsX?0sHsr z&A}J^3nlO0@4%6eQ71S4Bv{O5H5(9UenbKt#OVnz#>}g+o@A3_5GP01--1hX=fiLH zJ2s8g;3|lC@g7874MT)jg7j<_z(NJNGCX0v6-gDrE}gG@h|a!C<-;o@s;3&WpLMk< z0<+1mD6)vP8ZZ|yDN@PKwpa1Y#3=Uo0Y;@704f<)-0tF* zp@dx1kE0Y$DFgoP{Z+RUr%oAsp9>c>0kWbo$NBSFclUi90P&WilbvWk8U^zqy%hQw zA2To6`0c)u-q*)(eruv@iMAgj1V2k3BV@5jZ#s+$C6qpEFd6N~@esHmV(2Y8>SnGr z=KNb`)%&|1J)Z8&38y`G>&7bGm({uVBtJxbU}9%>_)geB`>LrDjT6fLbS}vrLvBVU zlv)o9It>>}x7uEoXLT`QM!UUS92OUupc-|S`0Li4lwhpeO+D-elJ+b86@+N0sk8Lg zXyZ4Wa%o54FZcEW4y7^bYF7U8p4rSoX6YZUhh=*e@)jTb`03RiVwQ1$MHoJhJWXEe zGPlr3O8-XXW4)6&TD9rekdr($1CJvPlv=4)zy$vyrQ9mq3%BdG--YytoKyw@qo$6J z_KDy-{Y8Iw0+2KT_95`h#O5w5O382k15lX6{e!u=zVPbfwd+ZthR(cZl_d|~v7`B$ zXrB=i{)q>6Hq z20vhGTZ1Rcoi0ejvAZta_!8Mn$!DJV(VGEaZ$KM`p?`U+1*^X1PqjQ#(K8Cqv|j5U z?HDeK8|eO^i$v5@M2BQw!$I8X-%KS*Kh=y7d$f@X-4CV!q@`QA&a z$<@|J#>WQ!Xs@n3*rwUS==H3sgsS$=-CyA|;5Xs%xGb`J{-%M^uHn*$z)0MQ*ppEf zTBryo8Qxf2a%lg}Y)WmK_Kn^zdNkC>cq^5?uP3YN=)hjkCEB8g0(G8Dr2?Jqf&PsQ zSygNTR4(EX_2TM@PjF_wGdXFOPTi0dP=6mCcB9(wV??feib!TubUfnWbDEcWMcR^R z$>?V$V*B?g)mm*3Y48)r>6&$7iskts&Y3e1g%GoWoQmyPyxqVH0q$#(-+0Bw!|61p zh77uXqTND=eIC%Ho-ivR=ff6MGQ6FY{%}XTm=01aWHtyoFFaw2IAv&5@raG!^I*j{ zB4L2*49#t}dODYH8Ta|j3rgrxhHY)tM5Su?XK7j~p=P$D*^$h9tl@}WyHmlh;g-Odz>JN26YhrU z@Tv~FnyHu4988r$=PVd&Z%lvl!lyF_ZO_v`M*UO?4HFry=-B%HwTR^ujDqXAin`2% zu}5ZlD|vWJK2yJ&F7Q<5R3|IXEOp(-DCL=tT-PS<&``F2Y81)Tm6?*NT7(}xpY^Zj zKlw?gp>Y~f`7mlkN9*(B1~wVXGHEm1^WYbgEVC{q^Ot|}oDFm-+|6U@^CrawiLj0@ zVwvkwIv+FLG&lNeeWgv#)|A{agWw>Um5r7(OODnxiF1fgoE3>U^p#jFRDZ2k^h8p3 z%!#n?)0O=5hRbTmHKsRwk1G?|VojMLg$~Z6Fr#zdJ;2rniStm$ufS=jrm#JlRntx} z7AeW833`#ZbI>`w9sYNoO|HfA_A$7!Voq#l{ygh6729DXBYM(Js~uKuS~CbR<%7_Q6MSkrGTv}L+XS|2@JBT7wMGRx zdEuV*4XtY=TWKnkz;P6cg&)Q@BGX}*8W4ALp{4PT)&6b%zAx1?NV_@LwenvZ#T^_} zb}eVvY}jY`3HhNjNUw$~({A~x1F`GX5zerVo=U@7fBm0}{T<#3vQegjdf-Esz=t-k zIWJOSJmQqEYCL{gCIn5&QgWhXrouPfZEjIPt9TdPBWCw8{Xa}Tvy_cA>8}l}W(V44TSy3(RdtN9rHJstyKsJl`=L|3m_h49GP#c>s%_`Tj|Zg=BMJa~ z+r+SRBxhzI9dF3VnTN3mYVF3fx9!xwJ~h|4WY+GBZW6hgM3kl~vTuzMaOll?59DgA zn5K6e1)uM~wi$E*4y}1WEJ%4Se6-XnMEqRb;r+$|Lg^&OZyvruc1 z#i$QiOvIxWc(ahR#Ji=AU21GnNP`DYzl5h&}&_?sJ<|(n4TO4lteE`lQk($F+ zyu5DkLVnMHNUca~)5PyBXVkMCSVhsph|7Q)^HR9_FuW7!u6e8?Hctl&JQj!IZ(D~- zx-fFc<$MA7U&}6v|g4)cUKRu3pHm zTHhFUvE5Ey`*bQ3yol2fg zIS9aNb<$O04dCz(GZ*CZ%=1zkLhT7-;ey#~V)p%N^at2`$c2G{FPie&1%hZW!WbDB z38$f_jX{!mz7g!QK3QPaD~}-l>Je`;-JWn{FypRMR8r!XlpJ&q2drB5qxV;aaDj(3 z^7V5z9+e>rz)e?ByQ6{~fzuOM{V0L&!`jtkYF^wf1$!WN7rU{PPMQ|zOjK08z3Be? zhg&qi#n{Pmw1j6w*?xa0@sk`fG)BNIHyzWT<=f=J&FeAWE!MN^x%4YvC%tuc+H^PD zyVbx!5A&+Kr)O%WiD0kbQN7-+nh^#dsl|X3cGRYE6F_R&9yu_@dV@vQ?cPu@+9%)(Vu(yNi`c7EwBebv@gTJ z|KFMI{>Bn80&>*WZiOBvs+wWz1A>N+S4IXGMnOD5O-rj|5&K;F$k+f&D?bM;q0q^l zYoKWSU*4Ho0bKE~jemdhF8{w=K~dqo3^Gsa6nyF*mPW>+U%}-g&e&Z`7hsL7D}4>D znSV1jMNg($qJf}v8hNaaNBD?|sJjhZDdjd!zrNlDL{47^TDpDpldx4USdBM#+tJd7 zAa@wT2Ze!zbX_Pj1a>3;+B;L2_dR8%9%pUr&B-`F_kkc%hVrFqT#V z!QvPryI%b(hQ4%F7C@!XhY8hc&2*rd*x2$w7B-FI(KN8Lv&+~FJR*MdvOj>eXcaT@ z`}gV}TWZuF;0LV}b6O^T<37GI*V9B@2P{%IcQ4EN83E_8ex6CG+Oo9ApHJe>BX(ty zB;3 z%b+ai1G4G-xpP)A!1t6><}^G%lN{I&N}XPY8Y?g+dq=EHypzu{DzqFbw#6T1H97Md zpHh3t#5-=OfRK$uIr1;AJLfq4~Kbl=-@16umGkxDoy zv_nPKVYb6Zl?sqvS1%uC3>2N!wF#GJ&{)WkCtA$9 z<-CY-J)IvH7Z;eBkF+N*qyYNz1}AaTA`oQP9Cp9uyTvtb6OA^%UxP}`<}>+TsqNZ( zV0;5vOc~JX5?rgW4%=`J`LS>=#0vtL0o5%kVjoBbN4D+RWDsG0C*1$D2X}DlkmBtG WnfZK!t{=DvQdZP>kbm#-i~j(xg8Uu; literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_inset_element/nested_on_top_true.png b/tests/baseline_images/test_inset_element/nested_on_top_true.png new file mode 100644 index 0000000000000000000000000000000000000000..2a43b650ef970e3b3b3a69f4a72da368a1c1db1c GIT binary patch literal 12217 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 D*^rht literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_inset_element/overlapping_insets.png b/tests/baseline_images/test_inset_element/overlapping_insets.png new file mode 100644 index 0000000000000000000000000000000000000000..2392137d1a6584b5e821edee92fbad5ca1910729 GIT binary patch literal 13394 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 U&L?XX0meYe3L5gIa+ab02isy7;s5{u literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_inset_element/quadrants_composed.png b/tests/baseline_images/test_inset_element/quadrants_composed.png new file mode 100644 index 0000000000000000000000000000000000000000..b15d8a559f699b0dc2b88bba3d7dd6966df1a926 GIT binary patch literal 22782 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 literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_inset_element/quadrants_separate.png b/tests/baseline_images/test_inset_element/quadrants_separate.png new file mode 100644 index 0000000000000000000000000000000000000000..3b3f93fb5ee6f5104ef4eb5c91c2f1fc3e4ac67d GIT binary patch literal 22715 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 literal 0 HcmV?d00001 diff --git a/tests/test_inset_element.py b/tests/test_inset_element.py new file mode 100644 index 0000000000..a0df9dcb8b --- /dev/null +++ b/tests/test_inset_element.py @@ -0,0 +1,376 @@ +import numpy as np +import pytest +from PIL import Image, ImageDraw + +from plotnine import ( + element_line, + element_rect, + element_text, + facet_wrap, + labs, + theme, +) +from plotnine._utils.yippie import geom as g +from plotnine._utils.yippie import plot +from plotnine.composition import inset_element, plot_annotation + + +def _smiley() -> np.ndarray: + """ + Smooth (anti-aliased) smiley on a sky-blue background + + Rendered at 4x supersample with PIL's vector primitives and + downsampled with LANCZOS for smooth edges. 270w x 300h. + """ + SUPER = 4 + W, H = 270, 300 + sw, sh = W * SUPER, H * SUPER + + img = Image.new("RGB", (sw, sh), (135, 206, 235)) # sky + draw = ImageDraw.Draw(img) + + # Face — yellow ellipse with a generous inset from the canvas edge + pad = sh // 16 + draw.ellipse([pad, pad, sw - pad, sh - pad], fill=(255, 220, 80)) + + # Eyes — tall ovals for character + eye_r = sw // 14 + eye_y = sh * 0.4 + for cx in (sw * 0.34, sw * 0.66): + draw.ellipse( + [cx - eye_r, eye_y - eye_r * 1.3, cx + eye_r, eye_y + eye_r * 1.3], + fill=(30, 30, 30), + ) + + # Rosy cheeks + cheek_r = sw // 13 + cheek_y = sh * 0.62 + for cx in (sw * 0.16, sw * 0.84): + draw.ellipse( + [cx - cheek_r, cheek_y - cheek_r, cx + cheek_r, cheek_y + cheek_r], + fill=(255, 140, 140), + ) + + # Smile — lower half of an ellipse (U-shape opening upward) + smile_box = [sw * 0.30, sh * 0.48, sw * 0.70, sh * 0.82] + draw.arc(smile_box, start=30, end=150, fill=(30, 30, 30), width=sw // 22) + return np.asarray(img.resize((W, H), Image.LANCZOS)) # pyright: ignore[reportAttributeAccessIssue] + + +SMILEY_FACE = _smiley() + + +class TestInsetAlignTo: + """ + Verify align_to picks the right host region for the inset's bbox + """ + + def setup_method(self): + # Fresh objects per test — `inset_element + ggplot` mutates the + # host's `_insets` list, so sharing instances across tests would + # let earlier tests pollute later ones. + self.host = ( + plot.wheat + g.cols + labs(title="HOST") + theme(plot_margin=0.02) + ) + self.inset = plot.mediumvioletred + g.points + theme(plot_margin=0.02) + self.area = (0.5, 0.5, 1, 1) + + def test_align_to_panel(self): + p = self.host + inset_element( + self.inset + labs(title="INSET (panel)"), + *self.area, + align_to="panel", + ) + assert p == "align_to_panel" + + def test_align_to_plot(self): + p = self.host + inset_element( + self.inset + labs(title="INSET (plot)"), + *self.area, + align_to="plot", + ) + assert p == "align_to_plot" + + def test_align_to_full(self): + p = self.host + inset_element( + self.inset + labs(title="INSET (full)"), + *self.area, + align_to="full", + ) + assert p == "align_to_full" + + +class TestNestedOnTop: + """ + on_top toggled on an inset whose host is itself nested in a + composition that's inset into an outer host + """ + + def setup_method(self): + self.inner = plot.lightblue + theme( + panel_background=element_rect(alpha=0.5) + ) + self.deep = ( + plot.orange + + labs(footer="Source: Orange") + + theme( + plot_footer=element_text(size=8, color="brown", ha="right"), + plot_footer_line=element_line(color="orange"), + plot_footer_background=element_rect(fill="orange", alpha=0.3), + ) + ) + + def _build(self, on_top: bool): + nested = self.inner + inset_element( + self.deep, 0.1, 0.1, 0.9, 0.9, on_top=on_top + ) + compose = nested | plot.gray + return plot.white + inset_element(compose, 0.1, 0.1, 0.9, 0.9) + + def test_nested_on_top_true(self): + assert self._build(on_top=True) == "nested_on_top_true" + + def test_nested_on_top_false(self): + assert self._build(on_top=False) == "nested_on_top_false" + + +class TestQuadrantInsets: + """ + Fill a host with four plots in a 2x2 grid — either by attaching + four insets, one per quadrant, or by composing the four plots + and attaching them as a single inset that spans the host + """ + + def setup_method(self): + self.host = plot.white + self.p1 = plot.gray + g.cols + self.p2 = plot.lightblue + g.points + self.p3 = plot.wheat + g.areas + self.p4 = plot.mediumvioletred + g.texts + + def test_quadrants_separate(self): + p = ( + self.host + + inset_element(self.p1, 0, 0.5, 0.5, 1) + + inset_element(self.p2, 0.5, 0.5, 1, 1) + + inset_element(self.p3, 0, 0, 0.5, 0.5) + + inset_element(self.p4, 0.5, 0, 1, 0.5) + ) + assert p == "quadrants_separate" + + def test_quadrants_composed(self): + cmp = ( + self.p1 + + self.p2 + + self.p3 + + self.p4 + + plot_annotation( + theme=theme(plot_background=element_rect(color="black")) + ) + ) + p = self.host + inset_element(cmp, 0, 0, 1, 1) + assert p == "quadrants_composed" + + +class TestPropagateTheme: + """ + `&` and `*` propagate to a host plot and its insets + """ + + def setup_method(self): + self.host = plot.white + g.cols + self.inset = plot.gray + g.points + self.shared = theme(panel_background=element_rect(fill="pink")) + + def test_host_inset_and(self): + # & themes both the host and the inset. + p = ( + self.host + inset_element(self.inset, 0.5, 0.5, 1, 1) + ) & self.shared + assert p == "host_inset_and" + + def test_host_inset_mul(self): + # * themes only the host + p = ( + self.host + inset_element(self.inset, 0.5, 0.5, 1, 1) + ) * self.shared + assert p == "host_inset_mul" + + def test_host_compose_inset_and(self): + # & on a host whose inset is a Compose themes every child of + # the compose — exercises Compose.__and__ recursion. + compose = (plot.lightblue + g.points) | (plot.thistle + g.areas) + p = ( + self.host + inset_element(compose, 0.2, 0.2, 0.8, 0.8) + ) & self.shared + assert p == "host_compose_inset_and" + + def test_host_compose_inset_mul(self): + # * on a host whose inset is a Compose themes only the host + compose = (plot.lightblue + g.points) | (plot.thistle + g.areas) + p = ( + self.host + inset_element(compose, 0.2, 0.2, 0.8, 0.8) + ) * self.shared + assert p == "host_compose_inset_mul" + + def test_host_nested_inset_and(self): + # & on a host whose inset is itself a ggplot with insets — + # the broadcast must reach the innermost ggplot. Exercises + # `Insets.__and__`'s recursive arm for ggplot-with-insets. + deep = plot.lightblue + g.points + middle = plot.white + g.areas + inset_element(deep, 0.5, 0.5, 1, 1) + p = ( + self.host + inset_element(middle, 0.2, 0.2, 0.8, 0.8) + ) & self.shared + assert p == "host_nested_inset_and" + + def test_host_nested_inset_mul(self): + # * on a host whose inset is itself a ggplot with insets, + # themes only the host + deep = plot.lightblue + g.points + middle = plot.white + g.areas + inset_element(deep, 0.5, 0.5, 1, 1) + p = ( + self.host + inset_element(middle, 0.2, 0.2, 0.8, 0.8) + ) * self.shared + assert p == "host_nested_inset_mul" + + def test_and_non_theme(self): + # & with a non-theme PlotAddable — host and inset both pick + # up the geom. + p = (self.host + inset_element(self.inset, 0.5, 0.5, 1, 1)) & g.texts + assert p == "and_non_theme" + + def test_and_bare_ggplot_raises(self): + # On a plot with no insets, `&` is undefined. + with pytest.raises(TypeError): + _ = self.host & self.shared + + def test_mul_bare_ggplot_raises(self): + with pytest.raises(TypeError): + _ = self.host * self.shared + + +class TestImageInset: + """ + Image (ndarray / PIL) renders inside the user's bbox with + aspect-preservation, anchor placement, themed background, and + the standalone-render path + """ + + def setup_method(self): + self.host = plot.white + self.image = SMILEY_FACE # ndarray, 270w x 300h + self.area = (0.5, 0.5, 1, 1) # top-right quadrant + + def test_aspect_fit_top_right(self): + # The 9:10 (slightly tall) image in a wider bbox letterboxes + # left/right; `anchor="top-right"` shifts the image flush to + # the bbox's right edge. One test exercises aspect-fit and + # anchor placement together. + p = self.host + inset_element( + self.image, *self.area, anchor="top-right" + ) + assert p == "image_aspect_fit_top_right" + + def test_aspect_fit_bottom(self): + # A wide image (3:1) in the same bbox (~1.4 aspect) + # letterboxes top/bottom; `anchor="bottom"` shifts the image + # flush to the bbox's bottom edge. Exercises the + # `img_aspect > box_aspect` branch of `_fit_aspect` that the + # top-right test (image taller than bbox) does not. + H, W = 30, 90 + wide = np.zeros((H, W, 3), dtype=np.uint8) + wide[:, : W // 2] = (220, 80, 200) # left half: magenta + wide[:, W // 2 :] = (80, 200, 220) # right half: cyan + wide[:2, :] = wide[-2:, :] = (30, 30, 30) # top/bottom border + wide[:, :2] = wide[:, -2:] = (30, 30, 30) # left/right border + bg = theme( + plot_background=element_rect(fill="whitesmoke", color="black") + ) + p = self.host + (inset_element(wide, *self.area, anchor="bottom") + bg) + assert p == "image_aspect_fit_bottom" + + def test_themed_background_wraps_envelope(self): + # Themed fill + border surround the full user bbox, with the + # fill visible in the letterbox padding bands and the border + # tracing the user-specified envelope (not the fitted image). + bordered = inset_element(self.image, *self.area) + theme( + plot_background=element_rect( + fill="lavender", color="purple", size=2 + ) + ) + assert self.host + bordered == "image_themed_bg_wraps" + + def test_ndarray_and_pil_render_identically(self): + # Same image content as ndarray and PIL.Image must produce + # identical baselines — pins the input contract through + # `_image_size` and `np.asarray(self._image)` in + # `_InsetImage`. + pil = Image.fromarray(self.image) + p_arr = self.host + inset_element(self.image, *self.area) + p_pil = self.host + inset_element(pil, *self.area) + assert p_arr == "image_basic" + assert p_pil == "image_basic" + + def test_standalone(self): + # `inset_element(arr, ...)` renders via the implicit blank + # ggplot host — the raster equivalent of the standalone + # ggplot-inset path. + assert ( + inset_element(self.image, 0.25, 0.25, 0.75, 0.75) + == "image_standalone" + ) + + def test_invalid_inputs_raise(self): + # Construction-time validation: bad obj, bad anchor name, + # bad anchor tuple all raise before any draw. + with pytest.raises(TypeError, match="ggplot, Compose, PIL image"): + inset_element("not an image", 0, 0, 1, 1) # pyright: ignore[reportArgumentType] + with pytest.raises(ValueError, match="Unknown anchor"): + inset_element(self.image, 0, 0, 1, 1, anchor="middle") # pyright: ignore[reportArgumentType] + with pytest.raises(ValueError, match=r"\[0, 1\]"): + inset_element(self.image, 0, 0, 1, 1, anchor=(1.5, 0.5)) + + +def test_compose_inset(): + host = plot.white + p1 = plot.lightblue + g.points + p2 = plot.gray + g.areas + inset = (p1 | p2) + plot_annotation( + theme=theme(plot_background=element_rect(color="black")) + ) + p = host + inset_element(inset, 0.1, 0.1, 0.9, 0.9) + assert p == "compose_inset" + + +def test_inset_attached_to_compose(): + # The inset is attached to the last plot in the composition + p1 = plot.lightblue + p2 = plot.lightgray + p3 = plot.tomato + cmp = (p1 / p2) + inset_element(p3, 0.5, 0.5, 1, 1) + assert cmp == "inset_attached_to_compose" + + +def test_overlapping_insets(): + p1 = plot.gray + g.cols + p2 = plot.lightblue + g.points + host = plot.white + p = ( + host + + inset_element(p1, 0.1, 0.1, 0.7, 0.7) + + inset_element(p2, 0.3, 0.3, 0.9, 0.9) + ) + assert p == "overlapping_insets" + + +def test_inset_on_facet_host(): + host = plot.white + g.points + facet_wrap("cat") + p = ( + host + + inset_element(plot.slateblue, 0, 0.75, 0.25, 1) + + inset_element(plot.violet, 0.75, 0.75, 1, 1) + + inset_element(plot.sandybrown, 0.75, 0, 1, 0.25) + + inset_element(plot.tomato, 0, 0, 0.25, 0.25) + ) + assert p == "inset_on_facet_host" From 5ec9cfbe5b2edc36b41ef2bb8b8d43f0b30d35c1 Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Thu, 14 May 2026 18:58:26 +0300 Subject: [PATCH 25/25] Add inset_element to API reference --- doc/_quartodoc.yml | 1 + doc/changelog.qmd | 3 +++ 2 files changed, 4 insertions(+) diff --git a/doc/_quartodoc.yml b/doc/_quartodoc.yml index 6414031a5d..3a147f73ce 100644 --- a/doc/_quartodoc.yml +++ b/doc/_quartodoc.yml @@ -548,6 +548,7 @@ quartodoc: - plot_annotation - plot_spacer - plot_layout + - inset_element - title: Options desc: | diff --git a/doc/changelog.qmd b/doc/changelog.qmd index feb2569b9c..a61cb2fd4c 100644 --- a/doc/changelog.qmd +++ b/doc/changelog.qmd @@ -38,6 +38,9 @@ title: Changelog theme(plot_footer_line=element_line(color="black")) ``` +- Added [](:class:`~plotnine.composition.inset_element`) with which you can insert plot + compositions or images into another plot. + ### API Changes - Removed `geom.to_layer()`, `stat.to_layer()`, `annotate.to_layer()`,