From 438966416044483d7b28f8482641c3829015dda1 Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Fri, 15 May 2026 19:05:56 +0300 Subject: [PATCH 1/3] Separate data-source and rendering-owner binding in guides `guide` and `guides` each expose `_bind_source(plot)` and `_bind_owner(owner)` instead of a single `setup` that greedily binds layers/mapping/scales (per source plot) and theme/figure (per renderer) at once. Lift `_assemble_guides` and the figure-attach + `targets.legends` write out of the `guides` class into module-level free functions that take theme/figure/targets as explicit parameters. Add a `LegendOwner` Protocol so a future composition-level renderer can satisfy the same binding contract a `ggplot` does today. Pure refactor; no public-API change; no behaviour change. --- plotnine/guides/guide.py | 45 +++++-- plotnine/guides/guides.py | 252 ++++++++++++++++++++++++++------------ 2 files changed, 211 insertions(+), 86 deletions(-) diff --git a/plotnine/guides/guide.py b/plotnine/guides/guide.py index ac4aa7d46..e2cc2d8e6 100644 --- a/plotnine/guides/guide.py +++ b/plotnine/guides/guide.py @@ -18,7 +18,8 @@ from matplotlib.offsetbox import PackerBase from typing_extensions import Self - from plotnine import aes, guides + from plotnine import aes, ggplot, guides + from plotnine.guides.guides import LegendOwner from plotnine.iapi import guide_text from plotnine.layer import Layers, layer from plotnine.scales.scale import scale @@ -111,19 +112,49 @@ def legend_aesthetics(self, layer: layer): matched = list(matched - set(l.geom.aes_params)) return matched - def setup(self, guides: guides): + def _bind_source(self, plot: ggplot): """ - Setup guide for drawing process + Bind to the source plot + + Captures the data-source state: layers and mapping. These + determine which geoms contribute glyphs to the guide. + + Parameters + ---------- + plot : + The plot that supplies layers and mapping for this guide. + """ + self.plot_layers = plot.layers + self.plot_mapping = plot.mapping + + def _bind_owner(self, owner: LegendOwner): + """ + Bind to the rendering owner + + Captures the rendering context: the owner's theme and figure. + The parent container's `guides_elements` is assigned separately + by the container's own owner-binding loop. + + Parameters + ---------- + owner : + Whoever renders this guide — its theme and figure drive + layout and attachment. """ # guide theme has priority and its targets are tracked # independently. - self.figure = guides.plot.figure - self.theme = guides.plot.theme + self.theme + self.figure = owner.figure + self.theme = owner.theme + self.theme self.theme._setup(self) - self.plot_layers = guides.plot.layers - self.plot_mapping = guides.plot.mapping self.elements = self._elements_cls(self.theme, self) + + def setup(self, guides: guides): + """ + Setup guide for drawing process + """ + self._bind_source(guides.plot) self.guides_elements = guides.elements + self._bind_owner(guides.plot) @property def _resolved_position_justification( diff --git a/plotnine/guides/guides.py b/plotnine/guides/guides.py index eda98e3ed..fb818172b 100644 --- a/plotnine/guides/guides.py +++ b/plotnine/guides/guides.py @@ -22,14 +22,17 @@ from .guide import guide if TYPE_CHECKING: - from typing import Literal, Optional, Sequence, TypeAlias + from typing import Literal, Optional, Protocol, Sequence, TypeAlias + from matplotlib.figure import Figure from matplotlib.offsetbox import OffsetBox, PackerBase from plotnine import ggplot, guide_colorbar, guide_legend, theme from plotnine.iapi import labels_view from plotnine.scales.scale import scale from plotnine.scales.scales import Scales + from plotnine.themes.targets import ThemeTargets + from plotnine.themes.theme import theme as Theme from plotnine.typing import ( Justification, LegendPosition, @@ -44,6 +47,26 @@ ) LegendOnly: TypeAlias = guide_legend | Literal["legend"] + class LegendOwner(Protocol): + """ + Anything that can render and host legends + + A `LegendOwner` is the rendering context for a set of guides: + it provides the theme that styles them and the figure they + are attached to. Both `ggplot` and `Compose` satisfy this + contract. + + The properties are declared read-only so Protocol matching + stays covariant on the attribute types (e.g. `p9Figure` + satisfies `Figure`). + """ + + @property + def theme(self) -> Theme: ... + + @property + def figure(self) -> Figure: ... + # Terminology # ----------- @@ -136,12 +159,20 @@ def _build(self) -> Sequence[guide]: """ return self._create_geoms(self._merge(self._train())) - def _setup(self, plot: ggplot): + def _bind_source(self, plot: ggplot): """ - Setup all guides that will be active + Bind to the source plot + + Resolves which guide applies to which aesthetic by inspecting + the plot's scales, then captures each resolved guide's + data-source state (layers, mapping). + + Parameters + ---------- + plot : + The plot whose scales decide which guides to draw. """ self.plot = plot - self.elements = GuidesElements(self.plot.theme) guide_lookup = { f.name: g @@ -173,9 +204,36 @@ def _setup(self, plot: ggplot): elif not isinstance(g, guide): raise PlotnineError(f"Unknown guide: {g}") - g.setup(self) + g._bind_source(plot) self._lookup[(scale.__class__.__name__, ae)] = (scale, g) + def _bind_owner(self, owner: LegendOwner): + """ + Bind to the rendering owner + + Captures the rendering context (theme, figure) and propagates + the owner-binding to every resolved guide. + + Parameters + ---------- + owner : + Whoever renders these guides — its theme and figure + drive layout and attachment. + """ + self.elements = GuidesElements(owner.theme) + self._owner_theme = owner.theme + self._owner_figure = owner.figure + for _, g in self._lookup.values(): + g.guides_elements = self.elements + g._bind_owner(owner) + + def _setup(self, plot: ggplot): + """ + Setup all guides that will be active + """ + self._bind_source(plot) + self._bind_owner(plot) + def _train(self) -> Sequence[guide]: """ Compute all the required guides @@ -277,76 +335,6 @@ def _apply_guide_themes(self, gdefs: list[guide]): for g in gdefs: g.theme.apply() - def _assemble_guides( - self, - gdefs: list[guide], - boxes: list[PackerBase], - ) -> legend_artists: - """ - Assemble guides into Anchored Offset boxes depending on location - """ - from matplotlib.font_manager import FontProperties - from matplotlib.offsetbox import HPacker, VPacker - - from .._mpl.offsetbox import FlexibleAnchoredOffsetbox - - elements = self.elements - - # Combine all the guides into a single box - # The direction matters only when there is more than legend - lookup: dict[Orientation, type[PackerBase]] = { - "horizontal": HPacker, - "vertical": VPacker, - } - - def _anchored_offset_box(boxes: list[PackerBase]): - """ - Put a group of guides into a single box for drawing - """ - packer = lookup[elements.box] - - box = packer( - children=boxes, # type: ignore - align=elements.box_just, - pad=elements.box_margin, - sep=elements.spacing, - ) - - return FlexibleAnchoredOffsetbox( - xy_loc=(0.5, 0.5), - child=box, - pad=1, - frameon=False, - prop=FontProperties(size=1, stretch=0), - bbox_to_anchor=(0, 0), - bbox_transform=self.plot.figure.transFigure, - borderpad=0.0, - ) - - # Group together guides for each position - groups: dict[ - tuple[Side, float] - | tuple[tuple[float, float], tuple[float, float]], - list[PackerBase], - ] = defaultdict(list) - - for g, b in zip(gdefs, boxes): - groups[g._resolved_position_justification].append(b) - - legends = legend_artists() - - # Create an anchoredoffsetbox for each group/position - for (position, just), group in groups.items(): - aob = _anchored_offset_box(group) - if isinstance(position, str) and isinstance(just, (float, int)): - setattr(legends, position, outside_legend(aob, just)) - else: - position = cast("tuple[float, float]", position) - just = cast("tuple[float, float]", just) - legends.inside.append(inside_legend(aob, just, position)) - - return legends - def draw(self) -> Optional[OffsetBox]: """ Draw guides onto the figure @@ -377,11 +365,117 @@ def draw(self) -> Optional[OffsetBox]: guide_boxes = [g.draw() for g in gdefs] self._apply_guide_themes(gdefs) - legends = self._assemble_guides(gdefs, guide_boxes) - for aob in legends.boxes: - self.plot.figure.add_artist(aob) + legends = assemble_legend_artists( + gdefs, guide_boxes, self.elements, self._owner_figure + ) + attach_legend_artists( + legends, self._owner_figure, self._owner_theme.targets + ) + + +def assemble_legend_artists( + gdefs: list[guide], + boxes: list[PackerBase], + elements: GuidesElements, + figure: Figure, +) -> legend_artists: + """ + Assemble guides into AnchoredOffsetboxes depending on location + + Parameters + ---------- + gdefs : + Trained guides whose `_resolved_position_justification` + decides which side group each lands in. + boxes : + The per-guide drawn boxes, one per `gdefs` entry. + elements : + Theme-resolved layout elements (direction, box justification, + margins, spacing). + figure : + The figure the offsetboxes will be anchored to. + """ + from matplotlib.font_manager import FontProperties + from matplotlib.offsetbox import HPacker, VPacker + + from .._mpl.offsetbox import FlexibleAnchoredOffsetbox - self.plot.theme.targets.legends = legends + # Combine all the guides into a single box + # The direction matters only when there is more than legend + lookup: dict[Orientation, type[PackerBase]] = { + "horizontal": HPacker, + "vertical": VPacker, + } + + def _anchored_offset_box(boxes: list[PackerBase]): + """ + Put a group of guides into a single box for drawing + """ + packer = lookup[elements.box] + + box = packer( + children=boxes, # type: ignore + align=elements.box_just, + pad=elements.box_margin, + sep=elements.spacing, + ) + + return FlexibleAnchoredOffsetbox( + xy_loc=(0.5, 0.5), + child=box, + pad=1, + frameon=False, + prop=FontProperties(size=1, stretch=0), + bbox_to_anchor=(0, 0), + bbox_transform=figure.transFigure, + borderpad=0.0, + ) + + # Group together guides for each position + groups: dict[ + tuple[Side, float] | tuple[tuple[float, float], tuple[float, float]], + list[PackerBase], + ] = defaultdict(list) + + for g, b in zip(gdefs, boxes): + groups[g._resolved_position_justification].append(b) + + legends = legend_artists() + + # Create an anchoredoffsetbox for each group/position + for (position, just), group in groups.items(): + aob = _anchored_offset_box(group) + if isinstance(position, str) and isinstance(just, (float, int)): + setattr(legends, position, outside_legend(aob, just)) + else: + position = cast("tuple[float, float]", position) + just = cast("tuple[float, float]", just) + legends.inside.append(inside_legend(aob, just, position)) + + return legends + + +def attach_legend_artists( + legends: legend_artists, + figure: Figure, + theme_targets: ThemeTargets, +): + """ + Attach legend offsetboxes to the figure and register them + + Parameters + ---------- + legends : + The assembled legend artists to attach. + figure : + The matplotlib figure to add the offsetboxes to. + theme_targets : + Theme targets where the `legends` record is stored for the + layout engine to pick up. + """ + for aob in legends.boxes: + figure.add_artist(aob) + theme_targets.legends = legends VALID_JUSTIFICATION_WORDS = {"left", "right", "top", "bottom", "center"} From 19bde0e62aa737937ef05255534714374ddd1183 Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Wed, 20 May 2026 19:16:10 +0300 Subject: [PATCH 2/3] Collect guides across plots via `plot_layout(guides=...)` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds `guides="collect" | "keep" | None` to `plot_layout`, modelled on patchwork. `"collect"` hoists guides from descendant plots into a single shared legend at the composition level; `"keep"` blocks propagation through a subtree; `None` is transparent. Both `ggplot.guides` and `Compose.guides` are now `guides()` instances; `guides.draw()` dispatches on its `_owner` to either the per-plot path or the cross-plot collect path. `guide_legend.merge` unions `_layer_parameters` so a merged guide overlays glyphs from every contributing plot. `composition_*_space` reserves room for the collected legend, and `set_legends_position` works for both plot and composition owners via a new `owner` property on the side-spaces classes. `test_nested_collect` is marked `xfail` — nested guide owners render correctly but the top-level layout engine only reserves space for the root composition's legend, so the nested legend isn't positioned. Tracked separately. --- .../_composition_layout_items.py | 21 ++- .../layout_manager/_composition_side_space.py | 111 ++++++++++- .../_mpl/layout_manager/_plot_layout_items.py | 16 +- .../_mpl/layout_manager/_plot_side_space.py | 7 + plotnine/_mpl/layout_manager/_side_space.py | 5 +- plotnine/composition/_compose.py | 80 ++++++++ plotnine/composition/_plot_layout.py | 18 +- plotnine/ggplot.py | 1 + plotnine/guides/guide_legend.py | 12 ++ plotnine/guides/guides.py | 175 ++++++++++-------- .../auto_default_unchanged.png | Bin 0 -> 11559 bytes .../collect_bottom.png | Bin 0 -> 10537 bytes .../collect_canonical.png | Bin 0 -> 10774 bytes .../collect_colorbar.png | Bin 0 -> 10093 bytes .../collect_distinct_legends.png | Bin 0 -> 14145 bytes .../collect_glyph_union.png | Bin 0 -> 13132 bytes .../inside_legend_stays_with_plot.png | Bin 0 -> 12245 bytes .../keep_blocks_outer_collect.png | Bin 0 -> 16146 bytes .../nested_collect.png | Bin 0 -> 15270 bytes .../no_collect.png | Bin 0 -> 11559 bytes tests/test_plot_layout_guides_collect.py | 121 ++++++++++++ 21 files changed, 467 insertions(+), 100 deletions(-) create mode 100644 tests/baseline_images/test_plot_layout_guides_collect/auto_default_unchanged.png create mode 100644 tests/baseline_images/test_plot_layout_guides_collect/collect_bottom.png create mode 100644 tests/baseline_images/test_plot_layout_guides_collect/collect_canonical.png create mode 100644 tests/baseline_images/test_plot_layout_guides_collect/collect_colorbar.png create mode 100644 tests/baseline_images/test_plot_layout_guides_collect/collect_distinct_legends.png create mode 100644 tests/baseline_images/test_plot_layout_guides_collect/collect_glyph_union.png create mode 100644 tests/baseline_images/test_plot_layout_guides_collect/inside_legend_stays_with_plot.png create mode 100644 tests/baseline_images/test_plot_layout_guides_collect/keep_blocks_outer_collect.png create mode 100644 tests/baseline_images/test_plot_layout_guides_collect/nested_collect.png create mode 100644 tests/baseline_images/test_plot_layout_guides_collect/no_collect.png create mode 100644 tests/test_plot_layout_guides_collect.py diff --git a/plotnine/_mpl/layout_manager/_composition_layout_items.py b/plotnine/_mpl/layout_manager/_composition_layout_items.py index 5a498cf26..47d79e69a 100644 --- a/plotnine/_mpl/layout_manager/_composition_layout_items.py +++ b/plotnine/_mpl/layout_manager/_composition_layout_items.py @@ -13,6 +13,7 @@ from matplotlib.patches import Rectangle from plotnine.composition._compose import Compose + from plotnine.iapi import legend_artists from ._composition_side_space import CompositionSideSpaces @@ -22,7 +23,7 @@ class CompositionLayoutItems: plot_annotation artists """ - def __init__(self, cmp: Compose): + def __init__(self, cmp: Compose, *, is_root: bool = True): def get(name: str) -> Any: """ Return themeable target or None @@ -36,6 +37,7 @@ def get(name: str) -> Any: return t self.cmp = cmp + self.is_root = is_root self.geometry = ArtistGeometry(cmp.figure) self.plot_title: Text | None = get("plot_title") @@ -46,14 +48,25 @@ def get(name: str) -> Any: "plot_footer_background" ) self.plot_footer_line: Line2D | None = get("plot_footer_line") + self.legends: legend_artists | None = get("legends") def _is_blank(self, name: str) -> bool: return self.cmp.theme.T.is_blank(name) def _move_artists(self, spaces: CompositionSideSpaces): """ - Move the annotations to their final positions + Move the annotations and legends to their final positions """ - from ._plot_layout_items import _position_plot_labels + from ._plot_layout_items import ( + _position_plot_labels, + set_legends_position, + ) - _position_plot_labels(spaces.cmp.figure, self.cmp.theme, spaces, self) + # Only the root composition can have annotations (labels). + # So positioning them is a no-op. Skip the traversal entirely. + if self.is_root: + _position_plot_labels( + spaces.cmp.figure, self.cmp.theme, spaces, self + ) + if self.legends: + set_legends_position(self.legends, spaces) diff --git a/plotnine/_mpl/layout_manager/_composition_side_space.py b/plotnine/_mpl/layout_manager/_composition_side_space.py index 64f238b7b..77cfcb296 100644 --- a/plotnine/_mpl/layout_manager/_composition_side_space.py +++ b/plotnine/_mpl/layout_manager/_composition_side_space.py @@ -1,5 +1,6 @@ from __future__ import annotations +from functools import cached_property from typing import TYPE_CHECKING from plotnine._mpl.layout_manager._layout_tree import LayoutTree @@ -10,11 +11,16 @@ if TYPE_CHECKING: from plotnine.composition._compose import Compose + from plotnine.iapi import outside_legend class _composition_side_space(_side_space): """ Base class for the side space around a composition + + The `plot_margin_*` figure-edge buffer is reserved only for the root + composition. Nested compositions sit inside that buffer and would + double-count it. """ def __init__(self, items: CompositionLayoutItems): @@ -22,13 +28,49 @@ def __init__(self, items: CompositionLayoutItems): self.gridspec = items.cmp._gridspec self._calculate() + @cached_property + def _legend_size(self) -> tuple[float, float]: + """ + Return size of the side legend in figure coordinates + """ + if not self.has_legend: + return (0, 0) + + ol: outside_legend = getattr(self.items.legends, self.side) + return self.items.geometry.size(ol.box) + + @cached_property + def legend_width(self) -> float: + return self._legend_size[0] + + @cached_property + def legend_height(self) -> float: + return self._legend_size[1] + + @property + def has_legend(self) -> bool: + """ + Return True if this side has a legend to lay out + """ + if not self.items.legends: + return False + return getattr(self.items.legends, self.side, None) is not None + class composition_left_space(_composition_side_space): plot_margin: float = 0 + legend: float = 0 + legend_box_spacing: float = 0 def _calculate(self): - theme = self.items.cmp.theme - self.plot_margin = theme.getp("plot_margin_left") + items = self.items + theme = items.cmp.theme + if items.is_root: + self.plot_margin = theme.getp("plot_margin_left") + + if items.legends and items.legends.left: + self.legend = self.legend_width + self.legend_box_spacing = theme.getp("legend_box_spacing") @property def offset(self) -> float: @@ -81,10 +123,18 @@ class composition_right_space(_composition_side_space): """ plot_margin: float = 0 + legend: float = 0 + legend_box_spacing: float = 0 def _calculate(self): - theme = self.items.cmp.theme - self.plot_margin = theme.getp("plot_margin_right") + items = self.items + theme = items.cmp.theme + if items.is_root: + self.plot_margin = theme.getp("plot_margin_right") + + if items.legends and items.legends.right: + self.legend = self.legend_width + self.legend_box_spacing = theme.getp("legend_box_spacing") @property def offset(self): @@ -143,6 +193,8 @@ class composition_top_space(_composition_side_space): plot_subtitle_margin_top: float = 0 plot_subtitle: float = 0 plot_subtitle_margin_bottom: float = 0 + legend: float = 0 + legend_box_spacing: float = 0 def _calculate(self): items = self.items @@ -151,7 +203,8 @@ def _calculate(self): W, H = theme.getp("figure_size") F = W / H - self.plot_margin = theme.getp("plot_margin_top") * F + if items.is_root: + self.plot_margin = theme.getp("plot_margin_top") * F if items.plot_title: m = theme.get_margin("plot_title").fig @@ -165,6 +218,10 @@ def _calculate(self): self.plot_subtitle = geometry.height(items.plot_subtitle) self.plot_subtitle_margin_bottom = m.b + if items.legends and items.legends.top: + self.legend = self.legend_height + self.legend_box_spacing = theme.getp("legend_box_spacing") * F + @property def offset(self) -> float: """ @@ -225,6 +282,8 @@ class composition_bottom_space(_composition_side_space): plot_caption_margin_bottom: float = 0 plot_caption: float = 0 plot_caption_margin_top: float = 0 + legend: float = 0 + legend_box_spacing: float = 0 def _calculate(self): items = self.items @@ -233,13 +292,18 @@ def _calculate(self): W, H = theme.getp("figure_size") F = W / H - self.plot_margin = theme.getp("plot_margin_bottom") * F + if items.is_root: + self.plot_margin = theme.getp("plot_margin_bottom") * F if items.plot_footer: m = theme.get_margin("plot_footer").fig self.plot_footer_margin_bottom = m.b self.plot_footer = geometry.height(items.plot_footer) self.plot_footer_margin_top = m.t + if items.legends and items.legends.bottom: + self.legend = self.legend_height + self.legend_box_spacing = theme.getp("legend_box_spacing") * F + if items.plot_caption: m = theme.get_margin("plot_caption").fig self.plot_caption_margin_bottom = m.b @@ -307,14 +371,17 @@ class CompositionSideSpaces: """ Compute the spaces required to layout the composition - This is meant for the top-most composition + Built for the top-most composition and additionally for any + nested composition that collects guides (`layout.guides == + "collect"`) — those need their own legend positioned within + the area their parent allocates. """ - def __init__(self, cmp: Compose): + def __init__(self, cmp: Compose, *, is_root: bool = True): self.cmp = cmp self.gridspec = cmp._gridspec self.sub_gridspec = cmp._sub_gridspec - self.items = CompositionLayoutItems(cmp) + self.items = CompositionLayoutItems(cmp, is_root=is_root) self.l = composition_left_space(self.items) """All subspaces to the left of the panels""" @@ -328,9 +395,25 @@ def __init__(self, cmp: Compose): self.b = composition_bottom_space(self.items) """All subspaces below the bottom of the panels""" - self._create_plot_sidespaces() + # The root creates PlotSideSpaces for every leaf in the + # tree, and side-spaces for every collecting nested cmp. + # Nested instances skip both to avoid double-creation. + self._nested_owners: list[Compose] = [] + if is_root: + self._create_plot_sidespaces() + for sub in cmp._walk_guide_owners(): + if sub is not cmp: + sub._sidespaces = CompositionSideSpaces(sub, is_root=False) + self._nested_owners.append(sub) self.tree = LayoutTree.create(cmp) + @property + def owner(self) -> Compose: + """ + The composition these side-spaces are calculated against + """ + return self.cmp + def arrange(self): """ Resize composition and place artists in final positions @@ -338,8 +421,16 @@ def arrange(self): # We first resize the compositions gridspec so that the tree # algorithms can work with the final position and total area. self.resize_gridspec() + # Collecting nested cmps shrink their own outer 1×1 to make + # room for their legend BEFORE alignment runs, so the tree's + # `align_panels` sees the actual panel area and lines panels + # up across nested boundaries. + for sub in self._nested_owners: + sub._sidespaces.resize_gridspec() self.tree.arrange_layout() self.items._move_artists(self) + for sub in self._nested_owners: + sub._sidespaces.items._move_artists(sub._sidespaces) self._arrange_plots() def _arrange_plots(self): diff --git a/plotnine/_mpl/layout_manager/_plot_layout_items.py b/plotnine/_mpl/layout_manager/_plot_layout_items.py index fa7c4527c..8f143a13e 100644 --- a/plotnine/_mpl/layout_manager/_plot_layout_items.py +++ b/plotnine/_mpl/layout_manager/_plot_layout_items.py @@ -574,13 +574,21 @@ def _position_plot_labels( return justify -def set_legends_position(legends: legend_artists, spaces: PlotSideSpaces): +def set_legends_position( + legends: legend_artists, + spaces: PlotSideSpaces | CompositionSideSpaces, +): """ - Place legend on the figure and justify is a required + Place legends on the figure, justifying each as required + + Works for both plot-level and composition-level legends. Both + side-space hierarchies expose an `owner` property — a `ggplot` + or `Compose` — which provides the `_sub_gridspec` to anchor + against and the `figure` to transform onto. """ - panels_gs = spaces.plot._sub_gridspec + panels_gs = spaces.owner._sub_gridspec params = panels_gs.get_subplot_params() - transFigure = spaces.plot.figure.transFigure + transFigure = spaces.owner.figure.transFigure def set_position( aob: FlexibleAnchoredOffsetbox, diff --git a/plotnine/_mpl/layout_manager/_plot_side_space.py b/plotnine/_mpl/layout_manager/_plot_side_space.py index 2fb9964b1..15bd85564 100644 --- a/plotnine/_mpl/layout_manager/_plot_side_space.py +++ b/plotnine/_mpl/layout_manager/_plot_side_space.py @@ -766,6 +766,13 @@ def __init__(self, plot: ggplot): self.W, self.H = plot.theme.getp("figure_size") + @property + def owner(self) -> ggplot: + """ + The plot these side-spaces are calculated against + """ + return self.plot + def arrange(self): """ Resize plot and place artists in final positions around the panels diff --git a/plotnine/_mpl/layout_manager/_side_space.py b/plotnine/_mpl/layout_manager/_side_space.py index 88a06c4bd..faf508ce4 100644 --- a/plotnine/_mpl/layout_manager/_side_space.py +++ b/plotnine/_mpl/layout_manager/_side_space.py @@ -69,7 +69,8 @@ class _side_space(ABC): A *_space class does the book keeping for all the artists that may fall on that side of the panels. The same name may appear in multiple - side classes (e.g. legend). + side classes (e.g. legend). The expected naming convention for the + subclasses is `*(left|right|top|bottom)_space`. The amount of space for each artist is computed in figure coordinates. """ @@ -89,7 +90,7 @@ def side(self) -> Side: """ Side of the panel(s) that this class applies to """ - return cast("Side", self.__class__.__name__.split("_")[0]) + return cast("Side", self.__class__.__name__.split("_")[-2]) @cached_property def parts(self) -> list[str]: diff --git a/plotnine/composition/_compose.py b/plotnine/composition/_compose.py index b0531b962..957498ceb 100644 --- a/plotnine/composition/_compose.py +++ b/plotnine/composition/_compose.py @@ -17,6 +17,7 @@ from ..composition._plot_annotation import plot_annotation from ..composition._plot_layout import plot_layout from ..composition._types import ComposeAddable +from ..guides.guides import guides from ..options import get_option if TYPE_CHECKING: @@ -151,6 +152,10 @@ def __init__(self, items: list[ggplot | Compose]): The annotations around the composition """ + # Composition-level guides populated if "collect"ing + self.guides = guides() + self.guides._owner = self + def __repr__(self): """ repr @@ -397,6 +402,59 @@ def iter_plots_all(self): for cmp in self.iter_sub_compositions(): yield from cmp.iter_plots_all() + def _resolve_guide_owners(self, owner: Compose | None = None): + """ + Decide which `Compose` (if any) owns each leaf's guides + + Walks the composition tree and overrides `leaf.guides._owner` + to the nearest `"collect"` ancestor (with `"keep"` + interrupting propagation). Leaves not under a collector keep + their default `_owner = leaf` from `ggplot.__init__`. + + Parameters + ---------- + owner : + The `Compose` inherited as guide owner from a higher + ancestor, or `None` if no `"collect"` ancestor is active. + """ + from plotnine import ggplot + + own = self.layout.guides + if own == "keep": + new_owner = None + elif own == "collect": + new_owner = self + else: # None — propagate inherited owner unchanged + new_owner = owner + + for item in self: + if isinstance(item, ggplot): + # If the guides are inside a plot, they are not "collected" + # / assigned to any composition. + # And, always assign the ggplot as the owner to guard against + # prior (and now stale) ownership when the same plot is + # reused in different compositions + if new_owner is not None and not _renders_legend_inside( + item.theme + ): + item.guides._owner = new_owner + else: + item.guides._owner = item + else: + item._resolve_guide_owners(owner=new_owner) + + def _walk_guide_owners(self): + """ + Yield every composition in this tree that collects guides + + A composition is a guide owner when its + `layout.guides == "collect"`. Includes `self` if it qualifies. + """ + if self.layout.guides == "collect": + yield self + for sub in self.iter_sub_compositions(): + yield from sub._walk_guide_owners() + @property def last_plot(self) -> ggplot: """ @@ -555,6 +613,10 @@ def _draw_items(cmp): cmp._draw_plots() for sub_cmp in cmp.iter_sub_compositions(): sub_cmp._setup() + # Initialise the sub-cmp's theme targets so a + # downstream `cmp.guides.draw()` (or annotation pass) + # can write into `sub_cmp.theme.targets`. + sub_cmp.theme._setup(sub_cmp) _draw_items(sub_cmp) # Drawing (order matters) @@ -562,7 +624,13 @@ def _draw_items(cmp): figure = self._setup() self.theme._setup(self) self._draw_composition_background() + self._resolve_guide_owners() _draw_items(self) + # Render guides at every collecting Compose — each binds + # itself as the owner just before drawing. + for cmp in self._walk_guide_owners(): + cmp.guides._bind_owner(cmp) + cmp.guides.draw() self._draw_annotation() self.theme.apply() @@ -656,3 +724,15 @@ def save( plot = (self + theme(dpi=dpi)) if dpi else self figure = plot.draw() figure.savefig(filename, format=format) + + +def _renders_legend_inside(t: theme) -> bool: + """ + Whether the theme places the legend inside the panel area + + True for the string `"inside"` and for a tuple `(x, y)` value + of `legend_position`, which is also interpreted as an inside + position. + """ + pos = t.getp("legend_position") + return pos == "inside" or isinstance(pos, tuple) diff --git a/plotnine/composition/_plot_layout.py b/plotnine/composition/_plot_layout.py index dbb862ffb..446c77856 100644 --- a/plotnine/composition/_plot_layout.py +++ b/plotnine/composition/_plot_layout.py @@ -2,13 +2,15 @@ from dataclasses import dataclass, field from itertools import cycle -from typing import TYPE_CHECKING, Sequence +from typing import TYPE_CHECKING, Literal, Sequence from ..composition._types import ComposeAddable if TYPE_CHECKING: from ._compose import Compose + GuidesMode = Literal["collect", "keep"] + @dataclass(kw_only=True) class plot_layout(ComposeAddable): @@ -43,6 +45,18 @@ class plot_layout(ComposeAddable): Relative heights of each column """ + guides: GuidesMode | None = None + """ + How to handle guides in this composition. + + - `"collect"`: dedupe and render guides from descendants once at + this level. + - `"keep"`: block any ancestor's collect from reaching this + subtree. + - `None` (default): neither collect nor block — propagate any + ancestor's setting through unchanged. + """ + _cmp: Compose = field(init=False, repr=False) """ Composition that this layout is attached to @@ -124,6 +138,8 @@ def update(self, other: plot_layout): self.nrow = other.nrow if other.byrow is not None: self.byrow = other.byrow + if other.guides is not None: + self.guides = other.guides def repeat(seq: Sequence[float], n: int) -> list[float]: diff --git a/plotnine/ggplot.py b/plotnine/ggplot.py index 9d45d71c8..7eb70a103 100755 --- a/plotnine/ggplot.py +++ b/plotnine/ggplot.py @@ -152,6 +152,7 @@ def __init__( self.labels = labels_view() self.layers = Layers() self.guides = guides() + self.guides._owner = self self.scales = Scales() self.theme = theme_get() self.coordinates: coord = coord_cartesian() diff --git a/plotnine/guides/guide_legend.py b/plotnine/guides/guide_legend.py index 1dfb51ade..02311717c 100644 --- a/plotnine/guides/guide_legend.py +++ b/plotnine/guides/guide_legend.py @@ -140,6 +140,18 @@ def merge(self, other): self.override_aes.update(other.override_aes) for ae in duplicated: del self.override_aes[ae] + # Cross-plot merge unions the per-plot layer parameters so the + # surviving guide overlays glyphs from every contributing plot. + # For an intra-plot merge this is a no-op because + # `_layer_parameters` is populated later, by `create_geoms`. + # Deduplicate by identity to guard against the same guide + # entering a cross-plot merge twice (which would silently + # double-draw glyphs). + seen: set[int] = {id(p) for p in self._layer_parameters} + for p in other._layer_parameters: + if id(p) not in seen: + self._layer_parameters.append(p) + seen.add(id(p)) return self def create_geoms(self): diff --git a/plotnine/guides/guides.py b/plotnine/guides/guides.py index fb818172b..85fb043f1 100644 --- a/plotnine/guides/guides.py +++ b/plotnine/guides/guides.py @@ -28,10 +28,10 @@ from matplotlib.offsetbox import OffsetBox, PackerBase from plotnine import ggplot, guide_colorbar, guide_legend, theme + from plotnine.composition import Compose from plotnine.iapi import labels_view from plotnine.scales.scale import scale from plotnine.scales.scales import Scales - from plotnine.themes.targets import ThemeTargets from plotnine.themes.theme import theme as Theme from plotnine.typing import ( Justification, @@ -120,6 +120,7 @@ def __post_init__(self): self.plot_scales: Scales self.plot_labels: labels_view self.elements: GuidesElements + self._owner: LegendOwner | None = None self._lookup: dict[ tuple[str, ScaledAestheticsName], tuple[scale, guide] ] = {} @@ -157,7 +158,7 @@ def _build(self) -> Sequence[guide]: The individual guides for which the geoms that draw them have have been created. """ - return self._create_geoms(self._merge(self._train())) + return self._create_geoms(_merge_guides(self._train())) def _bind_source(self, plot: ggplot): """ @@ -220,9 +221,8 @@ def _bind_owner(self, owner: LegendOwner): Whoever renders these guides — its theme and figure drive layout and attachment. """ + self._owner = owner self.elements = GuidesElements(owner.theme) - self._owner_theme = owner.theme - self._owner_figure = owner.figure for _, g in self._lookup.values(): g.guides_elements = self.elements g._bind_owner(owner) @@ -230,9 +230,16 @@ def _bind_owner(self, owner: LegendOwner): def _setup(self, plot: ggplot): """ Setup all guides that will be active + + Always binds the source plot. Owner-binding is deferred only + when a `Compose` collector has claimed the leaf """ + from plotnine.composition import Compose + self._bind_source(plot) - self._bind_owner(plot) + if not isinstance(self._owner, Compose): + self._owner = plot + self._bind_owner(plot) def _train(self) -> Sequence[guide]: """ @@ -283,42 +290,6 @@ def _train(self) -> Sequence[guide]: return gdefs - def _merge(self, gdefs: Sequence[guide]) -> Sequence[guide]: - """ - Merge overlapped guides - - For example: - - ```python - from plotnine import * - p = ( - ggplot(mtcars, aes(y="wt", x="mpg", colour="factor(cyl)")) - + stat_smooth(aes(fill="factor(cyl)"), method="lm") - + geom_point() - ) - ``` - - would create two guides with the same hash - """ - if not gdefs: - return [] - - # group guide definitions by hash, and - # reduce each group to a single guide - # using the guide.merge method - definitions = pd.DataFrame( - {"gdef": gdefs, "hash": [g.hash for g in gdefs]} - ) - grouped = definitions.groupby("hash", sort=False) - gdefs = [] - for name, group in grouped: - # merge - gdef = group["gdef"].iloc[0] - for g in group["gdef"].iloc[1:]: - gdef = gdef.merge(g) - gdefs.append(gdef) - return gdefs - def _create_geoms( self, gdefs: Sequence[guide], @@ -328,50 +299,94 @@ def _create_geoms( """ return [_g for g in gdefs if (_g := g.create_geoms())] - def _apply_guide_themes(self, gdefs: list[guide]): - """ - Apply the theme for each guide - """ - for g in gdefs: - g.theme.apply() - def draw(self) -> Optional[OffsetBox]: """ Draw guides onto the figure + For a `ggplot` owner, renders the trained guides set up via + `_setup`. For a `Compose` owner whose + `layout.guides == "collect"`, gathers trained guides from + descendant leaves whose `_owner` points at this composition, + merges them by hash, and renders the result. + + If this is a leaf's guides whose owner is a `Compose`, the + call is a no-op — that composition's own `.guides.draw()` + will collect and render these guides. + Returns ------- :matplotlib.offsetbox.Offsetbox | None A box that contains all the guides for the plot. If there are no guides, **None** is returned. """ - if self.elements.position == "none": + from plotnine.composition import Compose + + if self._owner is None: return - if not (gdefs := self._build()): + figure = self._owner.figure + targets = self._owner.theme.targets + + if isinstance(self._owner, Compose): + # A collected leaf's guides reach this method via + # `ggplot.draw`; the Compose's own `.guides.draw()` + # handles the rendering, so we skip here to avoid + # double-collection. + if self._owner.guides is not self: + return + # Only "collect" compositions produce guides at this + # level. For "keep" or `None`, the composition holds no + # legend artists of its own. + if self._owner.layout.guides != "collect": + return + gdefs = self._collect_from_leaves() + else: + if self.elements.position == "none": + return + gdefs = list(self._build()) + + if not gdefs: return - # Order of guides - # 0 do not sort, any other sorts - # place the guides according to the guide.order + # Order of guides: 0 keeps original order, any other sorts default = max(g.order for g in gdefs) + 1 orders = [default if g.order == 0 else g.order for g in gdefs] idx = cast("Sequence[int]", np.argsort(orders)) gdefs = [gdefs[i] for i in idx] - # Draw each guide into a box - # Because we can have more than one guide, we keep record of - # the drawn artists using lists guide_boxes = [g.draw() for g in gdefs] + for g in gdefs: + g.theme.apply() - self._apply_guide_themes(gdefs) legends = assemble_legend_artists( - gdefs, guide_boxes, self.elements, self._owner_figure - ) - attach_legend_artists( - legends, self._owner_figure, self._owner_theme.targets + gdefs, guide_boxes, self.elements, figure ) + # Attach legend offsetboxes to the figure and register them + for aob in legends.boxes: + figure.add_artist(aob) + targets.legends = legends + + def _collect_from_leaves(self) -> list[guide]: + """ + The guides this composition will render + + Each entry is a unique-by-hash legend contributed by a + descendant plot in this composition's collection scope, + with its rendering context resolved against the + composition's theme and figure. Empty when no descendant + plot contributes. + """ + cmp = cast("Compose", self._owner) + gdefs: list[guide] = [] + for leaf in cmp.iter_plots_all(): + if leaf.guides._owner is cmp: + leaf.guides._bind_owner(cmp) + built = leaf.guides._build() + if built: + gdefs.extend(built) + return _merge_guides(gdefs) if gdefs else [] + def assemble_legend_artists( gdefs: list[guide], @@ -455,27 +470,29 @@ def _anchored_offset_box(boxes: list[PackerBase]): return legends -def attach_legend_artists( - legends: legend_artists, - figure: Figure, - theme_targets: ThemeTargets, -): +def _merge_guides(gdefs: Sequence[guide]) -> list[guide]: """ - Attach legend offsetboxes to the figure and register them + Group guides by hash and fold each group - Parameters - ---------- - legends : - The assembled legend artists to attach. - figure : - The matplotlib figure to add the offsetboxes to. - theme_targets : - Theme targets where the `legends` record is stored for the - layout engine to pick up. + Used both within a single plot (intra-plot dedupe) and across + plots in a composition (cross-plot dedupe at a guide owner). + The function does not care about that distinction — the caller's + choice of input list does. """ - for aob in legends.boxes: - figure.add_artist(aob) - theme_targets.legends = legends + if not gdefs: + return [] + definitions = pd.DataFrame( + {"gdef": list(gdefs), "hash": [g.hash for g in gdefs]} + ) + grouped = definitions.groupby("hash", sort=False) + out: list[guide] = [] + for _, group in grouped: + gs = list(group["gdef"]) + survivor = gs[0] + for other in gs[1:]: + survivor = survivor.merge(other) + out.append(survivor) + return out VALID_JUSTIFICATION_WORDS = {"left", "right", "top", "bottom", "center"} diff --git a/tests/baseline_images/test_plot_layout_guides_collect/auto_default_unchanged.png b/tests/baseline_images/test_plot_layout_guides_collect/auto_default_unchanged.png new file mode 100644 index 0000000000000000000000000000000000000000..b21995b165164d01941cea00a346becf7fbd15d8 GIT binary patch literal 11559 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 literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_plot_layout_guides_collect/collect_bottom.png b/tests/baseline_images/test_plot_layout_guides_collect/collect_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..40033270c100437c65af6e69fbc386eb6f66ae15 GIT binary patch literal 10537 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 Q0O_OnTurW2=H=`E15f(0qyPW_ literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_plot_layout_guides_collect/collect_canonical.png b/tests/baseline_images/test_plot_layout_guides_collect/collect_canonical.png new file mode 100644 index 0000000000000000000000000000000000000000..436054990c391d4fe428c8023bcd1b282c8e442c GIT binary patch literal 10774 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 MuO?S2V;1s104LmFuK)l5 literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_plot_layout_guides_collect/collect_colorbar.png b/tests/baseline_images/test_plot_layout_guides_collect/collect_colorbar.png new file mode 100644 index 0000000000000000000000000000000000000000..3a8f05dc961f7bd80c79ef3e535aaf75b0911efb GIT binary patch literal 10093 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 j$Sl)p29y3w3zUk9{ ztE|oW_^nSBu2=*iv(soko-x`d2fCdnfCA$Id2*U1IQ6WuKk`~$MSHsnFv{mMB+TwFqNtzqTzbrPnfNMS00fhLGeKrB-g*Z;Y z-G=O_;78Rtk-o^Wting%#_%UzH(jQ$WpvLty!4#iqqlrhm1H_4=3%&5i$W7L&GGbA zr51o+%5T}|Dl6`@fQ^CuSPE;=159b`JQG`uZ8xKDSY^<1BGBC>O>ibqCIF zcU`^`8qOi+nN7OIh>L3*9Ug2=7vi4s9=$F}22xick&khGBZNkO!|qe(7L5yHE^559 zl9j-~99^<1Y-P3n|* z4uBSFBVH30cf<-%IYZzH+!I1@@pn=r?mc(rV6?gA$l+!m?#m$HE+SnZr8)h&AtNYzCQU%^%u-|6f5{0l{+-Tke z_nK|lJ2=aHv&abrJDPoZ@(4B~4QPOfZdp>&p%j()$}DwZey9-6IggE&HbC{ul+K0J z+dL!8;C-034NS$Z>#(l5sgM5b9y`J6^UE{vvFyx?$3ahkw;#A? zqgsw`t3kwpY-HD40sl5`^cZ6)vH`IISHg4rmID}g1q+|*ymoh56k*uGaFYTMCQT&; z$L{rsqxlG?E6Il+Gg8^wnDdPjV%8}J6m`vve4)Q&yO6eP=uZSbe5zo#d zY?gotg?R2PZUNe3Ti3b0L^NBeWl<>S(Zv0=3hpboPsR1RevZzEdTNl}Re9&xm%wn9 zL7&}TP1I{&_TLy`qZ}8iPWz@P?c)j^fPl&60?m{rVof~y+5HG%&v}K|%zN_jCr%dc zk@lyCk%i;RKt?uJYFeBs1ePw7p?HMXkbv;Zz6=fz9{s*la{~l8{tEt1B6~!6lt+lqqZMk zk!dBff%4**4k_o%t(`kHf6;$1eq&6471X0sX{7R&XX7AyGM5!_7C=$A neseAUcoFPBsNvP&<1lEz+iL5AW8f_|5J*K)L!tD6)zkk4VmHAt literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_plot_layout_guides_collect/collect_glyph_union.png b/tests/baseline_images/test_plot_layout_guides_collect/collect_glyph_union.png new file mode 100644 index 0000000000000000000000000000000000000000..255b673670a63f56b6e443492c3c036893698146 GIT binary patch literal 13132 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 UcVLO52!Q{jB;_Ou#C5&?1A1ONtpET3 literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_plot_layout_guides_collect/inside_legend_stays_with_plot.png b/tests/baseline_images/test_plot_layout_guides_collect/inside_legend_stays_with_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..cb1e4a1760305ddc5ff5d5f8917dd0b8e69deea2 GIT binary patch literal 12245 zcmeHtc|4SF`}RE{Ayl@KCEv1#3dz0`vS#128(Fd&gJ~lQ6;igbFJqaIeT}k~C2Mw} zVaC|UU@-5k=lSi=?|I+f`~Lg-e2kBKt~uwv&+A-{30T}NiSk@KfO`&b*+nD6A-Ds>-GG4cYI-O z0V5~aGkjkIH|E>pD1@>1VP z{MFB<0lAwOlVoJCWPhGP$#gF|Ho(IX2rfu`VgFTVaOgWQNA;KLUoX`FhcjpYq0zL6 z3lguRgi5W7)szr1)RY2O#qWo4M_AiTRyUP6F1?8P5j|4OVvJ($yto0e_+XK8Fk>u2 za`%6G#%6{f-*1T z(7Yg!ZHwDZ`C&99;W&6Ui9t}rgC4)$vTqw2F&%0O^mKQ>X`lb-ji|W_@XVH+V`k?l znT_Wdj9zp)a{P9YQ}^!2(8%M>W?fo2pv8DV1J^I9YP zj?w&5yZphvq5pZrYwua_sltt0&c>LI%OiU$1(LW}DdQ$>7TL4v0c#~4RUX2h{N3eA zzfɧ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 H{geL%FDQQ+ literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_plot_layout_guides_collect/keep_blocks_outer_collect.png b/tests/baseline_images/test_plot_layout_guides_collect/keep_blocks_outer_collect.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0c85860d582f988f4b3e29f4af90dca74dc78f GIT binary patch literal 16146 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≤K?7F$J%;#w1;mLP*(RO!M76Q<8 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

dJJ)YGqAX$GQ za56HYh2b%7@QoMq`gvV%{4dW8F_-Jt7=o+W{phtte?QA=kLjXsT2z4V*4|?KXpw>7 z@Ah`|!TNB%PRXpKM9MXyX<{+Mr+yw<&t*=3Z?(koXmiqHjmJG=XR5NGxN>-$;BUUA z^Y!f!mTW7HLrFHCTG1OzT)6SKk?()`^2KH-^CQ^FJEK$ioXpU!h=ufc_X9=IBvbA z+lSh`byr-9y3A!xA_im^&nXyqBSTewq`Tu0Lig%+1YlaA6#tAy`}vVqb=!lmEk;-lq?;G*K71vR2f5T% z6iP^)s4Uyq^|U}SN_s<4Q|^B!mVA#4UNvQ44$D#LQ&)GC} zqEW1ly-W1amuR{C^I;T~w^Hu4gfKWPS0MFf49TxO+E6rNA1@?X4nvvSk|L@H5;mJ_ z^bP>MSD|g;z04!&9uB>1HZMi`}UH22F zN-vt`&wZ$w5Mn=4?x&h0;-z>V&|PS-SZR3f3IX%%2sY~|UoEc%a@?U`>s<68MBb{m z+Llrc4!+(Dq7G>d4b8*uoyG#S=0J;`h_n@#el}r#2mu~$g~inKdS2(u_|cM*VAHk^ z&~b8}!NS67e8C{OIg^(jOtL=z<)MyW|s(W+t%)OPcS0AbM(6VRXDqGcKBITdm z=Xq>-XP`HN{VsH16U8Goz9gLWIES72nba_rPx&FyXRS+lv~5pC57PcrN{Pi-qgu3j zODpX`u&ac|6SV2C@;rtLj#e8UH1@Ex!P!~u;9c6{FEHd?ud!U{K0)d8 zehliNk9yYm*o}D0VdEu6C3xr9;^}KI4VdmL-u%XOv!0aYw;5MMg@6Y}A|zdH_Y4ko zG3{DgSR3zsoDJ$^F#U(=R@lU7+s_u>sOUQx(*Hp5n3;2D(u&oeaZVG?wvcG zt4_yj{%N~FR~^z7!`Huaj!~@_aW8C05E`6m_QTfhYlDVVK2MAQLP?dy5;xUI1jJ-FhVz`OobFsEn>v;u^NG^$Md>>VxKioU*7I3 zoR*}x$SZRQ=U+X#TZ?Es->cmiO^c&V=c@EVS@b6J8q6Ba{I%i8P~e3s_;9^LPzr3x$)uCT{#PSRb*liq%yn%i3& z6-L8d?6TT-x#;q53QvO@^O$!eFDE)dn~ulq>it2HW99bKy}iBt;U+Zz32xo=%sR&Jaso{kkFEjLq6V5Wnu0r5j6L}!S&o6t2m3(NWmq$@q zS$py)0c?ZmTX2h)YoIaZ_F|0r1V0n}{_KC{) zdpjFjC%aCu4PzBGKpzI+dkUF8aIN=NuCP$9VArnO`Qzo_z~nOAq!ikPjWtn;Z`f%F zA%}4SLWDAJ;Guld5j=6MPdAI7t}4YoEl3g-OpsK4C1gsNNxCuakUd#0sirX`jF~t& zovjz8pLGYuzL{0q8Y_M}{jPIE3Le^zV>4a#m6vyOW60bwHbu~GLgU4Y;KLD3j{=9e zSmgOO9ZkT|1?IB%en|wwj%KYpWTXaz2bOd4e_S5Fh;hee%Lhz5NEAy%M{SKCZKDj_ z&|{-P6cV{i{wMb>Yn$8Km7JUeXC1-fUDMK%nJ$Z25%A1tZ@(d)!?k`&e6&AQMdHyl z*NtX!2#Sn|7;6b8rJ|*^X1u2a2mJ=d{{cl79QEVt?DYC++XJ$)438`SdIS8qPI7il zv9pPSpgWWKm=d%1GtzZ23$>YZ>JL86y*js;BB);i)j-O`4E)yKT zrn`NgM{qM?k?|m_$MNLJE4Pgi_12J^mFC^C0lpG{TO6ex9Hc8(6wjvl!3C7#qLd0; zs=H6HMn>$*Xj@e9t=3j0rKz1w3vdZ(exl*d%FXqI%F_H9!g<1X0X^jM14)^-G?_Tm z6n>8Bzf4!o5up5oS4%UyuE-1HFCb_SM*G+;?@8&9SYjzr4{R!^(IzaW13`3?ka^)RpDCMQjr||R8Xo7ryDhVDAzOE%`NCC2R=8sMtaoqOWC~CfR(*r{wyxO zOuY8f8-<%|k~4%m9~d9y^x%MoiBiUZ3%!^pCNs+fz^+;UXiVS*i$h6IN#JP~4Wpxb z!5cU79h@noTax?c2S|VN!;&*hZf@tNh~$km3mjno6}-fCUEjTJR)ydKG2_S;dJJ6d z%6taDcbY|SSFZK&5SXA+y^nlfqsO@g17<7MyW_=#$1ZRIMB{IR%yNYQrWEB^Z29C5 z&Oj=ye67w(Z+LP*L*uF2yMF@P!oya$o&mdRW#^e`VOc7Ne36#^+(lQY$)do~niJ^{ zphmshDE`A(%6(!u^8laQi>9=jBSGQ!#AUr{d&IS(Y%`L(aE9|Cs~HDqA|Q4;Js2Mf z{95Me9^#6=W2wdb6f$1!x%W2s{rk1@ehJOjuRq6f8XQITTe4VP(*WXH{Dab0ofh zPz{nC2Q>0&L(rPraIVmZW!3K!QVxO3`|0Kzp{9;gC2=1|+AN)KSJiJ+&}nB+6Do9V;f~3)h+h&~Km}(ZE5Ok16iy zkE{b2BsOQMFw5i6E$_(rtSfJ7Psq4dY z>TljeRoPGHx}jt9oE9VK__8fQsTmAI2yRrQsszTVHN;^wUDlG{X2htoQ=tYW0A6>T zSgI|*x9!=){xZh(>XIU1RYOzLxz--sReT42cEnI(-n|lEFIkP!mUD9Qp=89q`FB!H zkDx|s_aGv`lh8fL16|*=(ic83ta_~R^4C3`ORo~643`4K>skJR`}$q>wqKl*EPk&ePt-b>SCQd>TYpIbP#JOcS}dc%?O7{1=un(!&*F*h|P6 zT0qV(64c8|4qHeoM>9Jy*Y*YguYr5Jk{S)p!aMckVrnGAXrK(daAIb$_PIf0Rmcj=C-oWBDsd~e2u|Joq} z-Zn431({b2m!SlP=444TMdBa*N*gCwHHeU!+`Qpj?^Bfctp>ydr@$;QA1^NDb7VIP z3R8us+5in3oBiLIdxF`k7SrHN&>W&QkdqzcD5=XREp^sM9;7A*_`{KIK7ybo44%!7 z^Mr*(;dt&Us^-ka%F4+NeH5Wxc=F&s_I6B*x-2~vLR<^;`%64YVqVWd(+_x}hzp$2 zE3=5!`*T`JUlNm=w>J{$&JcTE1m2V5?_RaxA&r>C#7tZQk`?d82{J11RZozOj?Nq$ zZ7sGR_ebwu-}_ITCj#!~+ZA9LY>L5);#qQQ=9e1)?^}!m;J4M*Uu-)ZYYu9(KH2Se zZiHOF8EW`SA1XhPKxU-URz~*a!C*Z9V9gvaxJ##wv%N z&Exd+bX9Q?L3;hM5u`n)k6*B|uz)(hb-ajMt|Ew;U?@4OxrU^TQS`?d`}^Q$<9PaB z$VQ8z2wJ0dh!z~)T_}fC*|A`JGvu~F;2sPr&)`8AJhhLvvnt;-bCZye)cmoGW_2+T z1MxuA!-f24J4!-Iq&dTIUZ%^g4!{N zdAkf=NBBu@@U|K(OVIy#w8*YNGCTW9K{EUrS0-_~L!@&p0^-flu36?Wr5Sz{Hm(0*$vu27q* zDp&WNW*-c+Tr;+V;R`mA{Cb0fn&$jC5^Rdy9r5zRn?@uZaepcVK&dnj$_4xl4D)A? z6%BrW`4u=7kY7r&B>KqMp;lwqUL^i*u3ye4p;~KDAf*p!f`%xEuN;p2K|v1DAJsT7 zi@q|(4=WvYdk2Hds<-^Q${uQGTo+lD8d%SF9ni}l%^>Qo8%z?+E`<0%{q$rxzrS}A z=a0%00A5@EzgAXH0QnDy>fn~lKn-1+4!E9|Z^5re#EjvaI9}~A3D*u0k3bwi>`pBc zf-#OQ5~PINE@GVQeI*>J$lm=MTQ#|lm61ZV#0Wx(d*f}Z zi&H1Q^X$;GYr0@wzeUW9f!P}lzo#3=&a?M)oV0^rXYJsYrwh*c%AFtY zXecWFyv|F_K@X`YDgSI*EY#_hw><$9+t;ssc|OM;hXXQ22mvlL^qAYH4{HU#e(|k1 zl^B_76^v!{!Kfb<>6WS8c}(^#C8d#0AQLw4i_c6moTK`_Mn2x;&o4oKmz5`no5Dkr zy)9lwMzisJtMXgZ)k;Ysqw1A5hgyhTPAC(N~KyAWPNBEoXx73G%@1-GnzXLmwCy4RUuPVMTKD9wmRNs0%Zqix)(-e zC1Wqn^K^go5YvyYk>L8XnlhgE`o|~GY6doW!#*1iK_#DFoS8-@R-!BDU1*nidlT6UJsK4uGs#{@2H%_3^ zPR~rEk)!g^@AA;nW^$j)g;5QB8;9N8_rQmSJ`fjI-kR3Y)X+#LBv0(QV4}HAe=XGU z!Di4R9$eQ#-NvYGq0N}@#H4b$m}&A%>I=<-DO=^`)j04UdK`(Lz6TkhpW)Y~ADE&1 z+g<+8fcrP>{&R#5A8nPbU|oTEYs5`P05H2(-Hhi*40`Fc7TZ|d)&~4Bo?YM4=$@sb zsQRZ7d!qHb()KR*+k5I)R(`C8Cv8nv7NkQ8s1w=~1d7xOw5h&DIm(rl6@Wzv;e|cf zd$=*SWrC?}8$aJ^Tp5sL1(qIb2NKRe*N3P^il%G9d5gd@Zn1s;cs(bf*wZMOWR%~2 z>Z(UsIviCa>YAH2RmsFBNX8)S{0`|6pp};Po8Q-y)kSt0Ec6y$m*d9$WA@dkypMOT zY#GaY@d1xEdgdm)=dhV(GU;om|KT4O%DZ=6f4it8e$Z+3SItvSP~4cr@PM8gC>Z;^ z0Ty**H$X;rRQ>#@q(C~@MhDezy){)r_0OP=?bu5WX6AwW0Rlh=DLy!DW_I=(XrEGV z4h-&@WoUKjAJsZPI?i`l^o~ONn~7Q$ zw(LvP+WV7bUOrjje_1W!I6odHX;8B-IrY;#985d1hR6}VAPp2U($edaDPWUdX4o{c zQWFfPgQaM5^XlndWqF(?6!^&nt8GRf*w5A}@>$q{GG!yul{WoFQ1V!&0>|HW{t5KYk!f^vMg`FL`XeIibVv^v7c*Vq>R4)VSVT+$1DdiFSv_=ZI*9 z{=vf&vb)bd?&3AsJKX~zNrwOoM9LsXK{osUUI=SeM5Ks`HQuH#-UAa8R7VP~l?n$% rY%p#;*+ZKCD^dPu!~*cbl`EWqmi8Ey7{eK`<^T$^Dldzr-vs^-xXLhq literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_plot_layout_guides_collect/no_collect.png b/tests/baseline_images/test_plot_layout_guides_collect/no_collect.png new file mode 100644 index 0000000000000000000000000000000000000000..b21995b165164d01941cea00a346becf7fbd15d8 GIT binary patch literal 11559 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 literal 0 HcmV?d00001 diff --git a/tests/test_plot_layout_guides_collect.py b/tests/test_plot_layout_guides_collect.py new file mode 100644 index 000000000..6033cb84e --- /dev/null +++ b/tests/test_plot_layout_guides_collect.py @@ -0,0 +1,121 @@ +""" +Tests for `plot_layout(guides=...)` and cross-plot guide collection +""" + +import pandas as pd + +from plotnine import ( + aes, + geom_line, + geom_point, + geom_tile, + theme, +) +from plotnine._utils.yippie import geom as g +from plotnine._utils.yippie import plot +from plotnine.composition import plot_layout + + +def test_no_collect(): + # No plot_layout(guides=...) — each leaf draws its own legend + p1 = plot.red + g.points + p2 = plot.green + g.points + p = p1 | p2 + assert p == "no_collect" + + +def test_collect_canonical(): + p1 = plot.red + g.points + p2 = plot.green + g.points + p = (p1 | p2) + plot_layout(guides="collect") + assert p == "collect_canonical" + + +def test_collect_bottom(): + p1 = plot.red + g.points + p2 = plot.green + g.points + p = (p1 | p2) + plot_layout(guides="collect") & theme( + legend_position="bottom" + ) + assert p == "collect_bottom" + + +def test_collect_distinct_legends(): + # Two plots with different color limits → two separate legends + df1 = pd.DataFrame({"x": [0, 1], "y": [0, 1], "c": ["a", "b"]}) + df2 = pd.DataFrame({"x": [0, 1], "y": [0, 1], "c": ["x", "y"]}) + p1 = plot.red + geom_point(aes("x", "y", color="c"), df1) + p2 = plot.green + geom_point(aes("x", "y", color="c"), df2) + p = (p1 | p2) + plot_layout(guides="collect") + assert p == "collect_distinct_legends" + + +def test_collect_glyph_union(): + # Two plots with the same color scale but different geoms; + # collected keys should overlay both glyph shapes. + df = pd.DataFrame( + { + "cat": ["a", "b", "c", "d"], + "cat2": ["r", "r", "s", "s"], + "value": [1, 2, 3, 4], + } + ) + p1 = plot.red + geom_point(aes("cat", "value", color="cat2"), df, size=4) + p2 = plot.green + geom_line( + aes("cat", "value", color="cat2", group="cat2"), df + ) + p = (p1 | p2) + plot_layout(guides="collect") + assert p == "collect_glyph_union" + + +def test_keep_blocks_outer_collect(): + # Inner says "keep", outer says "collect" — only p3 is collected + p1 = plot.red + g.points + p2 = plot.green + g.points + p3 = plot.blue + g.points + inner = (p1 | p2) + plot_layout(guides="keep") + p = (inner / p3) + plot_layout(guides="collect") + assert p == "keep_blocks_outer_collect" + + +def test_nested_collect(): + # Both inner and outer say "collect" — inner collects p1/p2 to + # itself, outer collects p3 separately. + p1 = plot.red + g.points + p2 = plot.green + g.points + p3 = plot.blue + g.points + inner = (p1 | p2) + plot_layout(guides="collect") + p = (inner / p3) + plot_layout(guides="collect") + assert p == "nested_collect" + + +def test_inside_legend_stays_with_plot(): + # A leaf positioned to render its legend inside the panel area + # should NOT participate in collection — its inside legend + # remains beside its own plot. + p1 = ( + plot.red + + g.points + + theme( + legend_position="inside", + legend_position_inside=(0.85, 0.85), + ) + ) + p2 = plot.green + g.points + p = (p1 | p2) + plot_layout(guides="collect") + assert p == "inside_legend_stays_with_plot" + + +def test_collect_colorbar(): + # Two plots with the same continuous color scale → one colorbar + df = pd.DataFrame( + { + "cat": ["a", "b", "c", "d"], + "cat2": ["r", "r", "s", "s"], + "value": [1, 2, 3, 4], + } + ) + p1 = plot.red + geom_tile(aes("cat", "cat2", fill="value"), df) + p2 = plot.green + geom_tile(aes("cat", "cat2", fill="value"), df) + p = (p1 | p2) + plot_layout(guides="collect") + assert p == "collect_colorbar" From 9dc3f2243638e29ecc0f3eb2bcf36f699aff28bf Mon Sep 17 00:00:00 2001 From: Hassan Kibirige Date: Thu, 21 May 2026 21:30:45 +0300 Subject: [PATCH 3/3] Add `guide_area()` to host collected guides inside a cell MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `guide_area()` (a `plot_spacer` subclass) marks a cell in a composition that should hold the legend produced by `plot_layout(guides="collect")`. It must be a direct child of the collecting composition — nested guide_areas belong to their own sub-grid and are not reached by an outer collector. When no guide_area is eligible, collected guides fall back to side placement. --- doc/_quartodoc.yml | 1 + .../_mpl/layout_manager/_plot_layout_items.py | 8 +- plotnine/composition/__init__.py | 2 + plotnine/composition/_compose.py | 27 ++++ plotnine/composition/_guide_area.py | 32 +++++ plotnine/guides/guides.py | 130 ++++++++++++------ .../collect_into_guide_area.png | Bin 0 -> 12676 bytes .../collect_into_guide_area_and_merge.png | Bin 0 -> 10161 bytes .../guide_area_without_collect.png | Bin 0 -> 11613 bytes ...r_guide_area_not_used_by_outer_collect.png | Bin 0 -> 14602 bytes .../multiple_guide_areas_extras_are_blank.png | Bin 0 -> 10163 bytes .../nested_collect_guide_area.png | Bin 0 -> 14648 bytes tests/test_plot_layout_guides_collect.py | 65 ++++++++- 13 files changed, 223 insertions(+), 42 deletions(-) create mode 100644 plotnine/composition/_guide_area.py create mode 100644 tests/baseline_images/test_plot_layout_guides_collect/collect_into_guide_area.png create mode 100644 tests/baseline_images/test_plot_layout_guides_collect/collect_into_guide_area_and_merge.png create mode 100644 tests/baseline_images/test_plot_layout_guides_collect/guide_area_without_collect.png create mode 100644 tests/baseline_images/test_plot_layout_guides_collect/inner_guide_area_not_used_by_outer_collect.png create mode 100644 tests/baseline_images/test_plot_layout_guides_collect/multiple_guide_areas_extras_are_blank.png create mode 100644 tests/baseline_images/test_plot_layout_guides_collect/nested_collect_guide_area.png diff --git a/doc/_quartodoc.yml b/doc/_quartodoc.yml index 3a147f73c..9da27fd4b 100644 --- a/doc/_quartodoc.yml +++ b/doc/_quartodoc.yml @@ -549,6 +549,7 @@ quartodoc: - plot_spacer - plot_layout - inset_element + - guide_area - title: Options desc: | diff --git a/plotnine/_mpl/layout_manager/_plot_layout_items.py b/plotnine/_mpl/layout_manager/_plot_layout_items.py index 8f143a13e..86fab62e8 100644 --- a/plotnine/_mpl/layout_manager/_plot_layout_items.py +++ b/plotnine/_mpl/layout_manager/_plot_layout_items.py @@ -6,6 +6,7 @@ from matplotlib.text import Text from plotnine._mpl.patches import StripTextPatch +from plotnine.composition._compose import Compose from plotnine.exceptions import PlotnineError from ..utils import ( @@ -653,8 +654,13 @@ def set_position( y = spaces.b.y1("legend") set_position(legends.bottom.box, (x, y), (0, 0)) - # Inside legends are placed using the panels coordinate system + # Inside legends are placed using the panels coordinate system. + # For a `Compose` owner with a `guide_area` host, the guides are + # rendered in the guide_areas panel, so we need that gridspec if legends.inside: + if isinstance(spaces.owner, Compose) and spaces.owner._guide_area: + panels_gs = spaces.owner._guide_area._sub_gridspec + transPanels = panels_gs.to_transform() for l in legends.inside: set_position(l.box, l.position, l.justification, transPanels) diff --git a/plotnine/composition/__init__.py b/plotnine/composition/__init__.py index 2fe524239..ef5f16636 100644 --- a/plotnine/composition/__init__.py +++ b/plotnine/composition/__init__.py @@ -1,5 +1,6 @@ from ._beside import Beside from ._compose import Compose +from ._guide_area import guide_area from ._inset_element import inset_element from ._plot_annotation import plot_annotation from ._plot_layout import plot_layout @@ -12,6 +13,7 @@ "Stack", "Beside", "Wrap", + "guide_area", "inset_element", "plot_annotation", "plot_layout", diff --git a/plotnine/composition/_compose.py b/plotnine/composition/_compose.py index 957498ceb..b1719cbb5 100644 --- a/plotnine/composition/_compose.py +++ b/plotnine/composition/_compose.py @@ -2,6 +2,7 @@ import abc from copy import copy, deepcopy +from functools import cached_property from io import BytesIO from typing import TYPE_CHECKING, cast, overload @@ -32,6 +33,7 @@ from plotnine._mpl.layout_manager._composition_side_space import ( CompositionSideSpaces, ) + from plotnine.composition._guide_area import guide_area from plotnine.ggplot import PlotAddable, ggplot from plotnine.typing import FigureFormat, MimeBundle @@ -455,6 +457,31 @@ def _walk_guide_owners(self): for sub in self.iter_sub_compositions(): yield from sub._walk_guide_owners() + @cached_property + def _guide_area(self) -> guide_area | None: + """ + The cell that hosts this composition's collected legend + + Only a `guide_area` placed directly at this composition's + level is eligible; one nested inside a sub-composition + belongs to that sub-grid, so an outer collector cannot + reach it. + + Returns + ------- + out : + The first matching `guide_area` among the composition's + direct items, or `None` when no eligible cell exists — + in which case collected guides fall back to side + placement. + """ + from ._guide_area import guide_area + + for item in self.iter_plots(): + if isinstance(item, guide_area): + return item + return None + @property def last_plot(self) -> ggplot: """ diff --git a/plotnine/composition/_guide_area.py b/plotnine/composition/_guide_area.py new file mode 100644 index 000000000..514b54a62 --- /dev/null +++ b/plotnine/composition/_guide_area.py @@ -0,0 +1,32 @@ +from __future__ import annotations + +from ._plot_spacer import plot_spacer + + +class guide_area(plot_spacer): + """ + A grid cell that hosts collected guides + + Used in a composition that collects guides with + `plot_layout(guides="collect")` to route the merged legend into a + cell of the grid instead of placing it on the side of the + composition. + + Renders empty (like [](`~plotnine.composition.plot_spacer`)) when + no collection is in effect, no guides exist to collect, or another + `guide_area` was selected first. + + Parameters + ---------- + fill : + Background color. The default is a transparent area. + alpha : + Opacity of the background fill, between 0 (transparent) and 1 + (opaque). The default leaves the area transparent. + + See Also + -------- + plotnine.composition.plot_spacer : Blank cell with the same styling. + plotnine.composition.plot_layout : Set `guides="collect"` to enable + collection. + """ diff --git a/plotnine/guides/guides.py b/plotnine/guides/guides.py index 85fb043f1..d01d6bd7d 100644 --- a/plotnine/guides/guides.py +++ b/plotnine/guides/guides.py @@ -28,6 +28,7 @@ from matplotlib.offsetbox import OffsetBox, PackerBase from plotnine import ggplot, guide_colorbar, guide_legend, theme + from plotnine._mpl.offsetbox import FlexibleAnchoredOffsetbox from plotnine.composition import Compose from plotnine.iapi import labels_view from plotnine.scales.scale import scale @@ -358,9 +359,21 @@ def draw(self) -> Optional[OffsetBox]: for g in gdefs: g.theme.apply() - legends = assemble_legend_artists( - gdefs, guide_boxes, self.elements, figure - ) + # Rendering in a guide_area is simpler because we render all guides + # together and at the center + use_guide_area = ( + self._owner._guide_area + if isinstance(self._owner, Compose) + else None + ) is not None + if use_guide_area: + legends = assemble_guide_area_legend( + guide_boxes, self.elements, figure + ) + else: + legends = assemble_legend_artists( + gdefs, guide_boxes, self.elements, figure + ) # Attach legend offsetboxes to the figure and register them for aob in legends.boxes: @@ -410,42 +423,6 @@ def assemble_legend_artists( figure : The figure the offsetboxes will be anchored to. """ - from matplotlib.font_manager import FontProperties - from matplotlib.offsetbox import HPacker, VPacker - - from .._mpl.offsetbox import FlexibleAnchoredOffsetbox - - # Combine all the guides into a single box - # The direction matters only when there is more than legend - lookup: dict[Orientation, type[PackerBase]] = { - "horizontal": HPacker, - "vertical": VPacker, - } - - def _anchored_offset_box(boxes: list[PackerBase]): - """ - Put a group of guides into a single box for drawing - """ - packer = lookup[elements.box] - - box = packer( - children=boxes, # type: ignore - align=elements.box_just, - pad=elements.box_margin, - sep=elements.spacing, - ) - - return FlexibleAnchoredOffsetbox( - xy_loc=(0.5, 0.5), - child=box, - pad=1, - frameon=False, - prop=FontProperties(size=1, stretch=0), - bbox_to_anchor=(0, 0), - bbox_transform=figure.transFigure, - borderpad=0.0, - ) - # Group together guides for each position groups: dict[ tuple[Side, float] | tuple[tuple[float, float], tuple[float, float]], @@ -459,7 +436,7 @@ def _anchored_offset_box(boxes: list[PackerBase]): # Create an anchoredoffsetbox for each group/position for (position, just), group in groups.items(): - aob = _anchored_offset_box(group) + aob = _anchored_offset_box(group, elements, figure) if isinstance(position, str) and isinstance(just, (float, int)): setattr(legends, position, outside_legend(aob, just)) else: @@ -470,6 +447,79 @@ def _anchored_offset_box(boxes: list[PackerBase]): return legends +def assemble_guide_area_legend( + boxes: list[PackerBase], + elements: GuidesElements, + figure: Figure, +) -> legend_artists: + """ + Pack collected guides into one centered legend for a `guide_area` + + All trained guides are combined into a single AnchoredOffsetbox + centered in panel coordinates, irrespective of their individual + `legend_position` settings. Used when the rendering owner is a + `Compose` whose `_guide_area` selects a host cell. + + Parameters + ---------- + boxes : + The per-guide drawn boxes that will be packed together. + elements : + Theme-resolved layout elements (direction, box justification, + margins, spacing). + figure : + The figure the offsetbox will be anchored to. + + Returns + ------- + out : + A `legend_artists` whose only entry is a single inside + legend at `(0.5, 0.5)`. + """ + aob = _anchored_offset_box(boxes, elements, figure) + legends = legend_artists() + legends.inside.append(inside_legend(aob, (0.5, 0.5), (0.5, 0.5))) + return legends + + +def _anchored_offset_box( + boxes: list[PackerBase], + elements: GuidesElements, + figure: Figure, +) -> FlexibleAnchoredOffsetbox: + """ + Pack a list of guide boxes into a single AnchoredOffsetbox + """ + from matplotlib.font_manager import FontProperties + from matplotlib.offsetbox import HPacker, VPacker + + from .._mpl.offsetbox import FlexibleAnchoredOffsetbox + + lookup: dict[Orientation, type[PackerBase]] = { + "horizontal": HPacker, + "vertical": VPacker, + } + packer = lookup[elements.box] + + box = packer( + children=boxes, # type: ignore + align=elements.box_just, + pad=elements.box_margin, + sep=elements.spacing, + ) + + return FlexibleAnchoredOffsetbox( + xy_loc=(0.5, 0.5), + child=box, + pad=1, + frameon=False, + prop=FontProperties(size=1, stretch=0), + bbox_to_anchor=(0, 0), + bbox_transform=figure.transFigure, + borderpad=0.0, + ) + + def _merge_guides(gdefs: Sequence[guide]) -> list[guide]: """ Group guides by hash and fold each group diff --git a/tests/baseline_images/test_plot_layout_guides_collect/collect_into_guide_area.png b/tests/baseline_images/test_plot_layout_guides_collect/collect_into_guide_area.png new file mode 100644 index 0000000000000000000000000000000000000000..10f872c18112ab9dcba94d2b29cbe8158b911ec6 GIT binary patch literal 12676 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 Qz-GWbRqZ=v$~I5_2WI*GQUCw| literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_plot_layout_guides_collect/guide_area_without_collect.png b/tests/baseline_images/test_plot_layout_guides_collect/guide_area_without_collect.png new file mode 100644 index 0000000000000000000000000000000000000000..30a2d5247f17f9850d1439334cb29f1cb87f5842 GIT binary patch literal 11613 zcmeHtcTm&qwr=Q1wE#;06j6!+8`24ifYN)f`q2_<=q(@$D1xXorG?%@013SbA_7tb zl1LyF>Ai-~0{7>)_da`{bM8HN?#%h`9%dM3e)Hzd`+HgIS8j(3&d+wxbYa=sl%<7T~>qi-DnVwKFqr#(CcdyJP7QJ{mI}3-)Uw*Hd z-)+mCeKn6QT0~#Hr#s*A*B>coze-*B`r+uq=qcVpC=T{v6u+>8Xx@XF2k(`URqu0Jf*46foD zCydH4VT`YO=3Eu?{1TMSnYxC zM_E{p+~TXOl-ui*W&&H{9M))?uv<+tsoV1$;LKXH`}glNv9K6nc(5ZVTWQJ?0TS2{ z2x>Y@^-c2_w(D#iM#2&*+|qbzJkUq(E#}5z#@jxhK**bAUVT>rFl0$%pwy=*c|k(`7bBG{Yo>ch2%z$%F~QZiwMNT z_NSrv{FSx|njmt5KSshOqo76BxL&rNiH*%7Vnhv%J_Y&4eZ1E<+()nA*c%0oDL$9G zxjnrQ(ibJgd-v%UOH%v|w4yxOxrf*AE@D1Fe#*>#zJ70DX?O#IO~t}?J0m1_`_uh7 z48$HzN>EHBNr8_I7j!Z4pSHqyrB+^>H#9BJ@%-?3;i#K|5}*XvZ4s$OL}~w!+!|z- z{7Kv!+gtt7m8<45woW8eKaCdPmf4(z!MC?p7pQ5dM=Bh(<&VuW5u5j$Zz7r)EZGC% zkzt4C&x2WNqQ9h0jE<~xHXQV)t!+LvuXoMgTP5Tc3Wglcl4lndR`hx_<&s_HRr+Frv>flx0i76?CLDD0`z9h6^$5&P?C31b4 zSXs-o&Af^xhMp1+y@?R-Br3>^r^WMer-b+IPm02s^C~WhO;vU3i6_nMU9P+Ne}DqM zzkuhBX&6gOkZYM=V8gjhIa4)t*g^zdrhC-DYZSjYKgmaYN;?Pr5*L9T;rc#>rTWGM zaXO7v(whI-IytPp$!@aGy}YE>mbNOW;r5yDzx<~E3~`r1|HLQ-p71E`)T`>QW%pdi z=DQt12&bWy1P)6nld*e-mY^wPs>SHOGz_$ZKG00~|)EE|~n=asPaQ0G89DlM) zhvB4)N>>tL&?{;Cd5T15J~X)ePXlT*_oa2WnpScT()$B)ywuzcAAd7}>Vv0-iM zkQjC9!PghAmxS)jm)PXTT-RZj9>v!oZ|8XEAwDwoNM0!Z-s4-nP-AZub}@B-`Jt4@ zu$6I%zU9d(kCUR}@@lT0YEe^;k$%cb(y?r&JJ*z9#CT|X(h5%0Yxr8+^5{;Pt*%*x z^2QCT#dXKebhjl-OC#P^T_x7hq&Z{$L_Gntb zuH-Pzx8AF>Eke>N*^Q?wKkglT5;UP?@sIfxIm{%-G>YmlkOhqfx`Losd?d!<73^Z+ z3*Gap3?X>Gt{_=sPdLQ(fPg{?xLufn@#z!}rxpekByxz#j?S@GJQ!^En(?7vO_8H@ zKh1*AgF_OA&tCv2eo=s+5m;wX&3m4`}4RU_hvJ_+&)BTx( zxM3`&zYP4EBzlY0H}KBX74SB4WT!ts{+JJoUgi!+L3pi7Ox%ywcoiI4TLTn7qhc#z zU1=Jn_B9o|o6#NSS+Mz9Q$&Rn%ekOYr^1i(YS{%g4YOG*7(9{tzR{Xfh9mD>Ez zMgA>jblzUqA(ZF}uKldlrDBVI(3_0iM^KDf9kq4u(rt=|W-jN3b|1|$dKS6XS1n67 zA)z+9ZdBo>v{^14QKDDwj+~H>9eQ_1G$og!x$h|a;Al-TsVQ?D_l+L{wxXFlF~zTs zt}R{r92wPoODlUi5`%Hwy4^goAlzrB+`Te^=LogRyM_Q_K1 ztAkRH2f_$rOGrcsVr%Pg^&z9i-{G>@@gS+XYECB#nbZ7W)8jM*Q&FQt!578|o8eYeVr6g05y;NTW0|Mrs6U%GPxO9^b8XBEggvRB((8v(o$`cU8Q^S09g3^7ZM%^S z;ioLm9R74znm(bdx!Kue@gulmd9O!zOs^MQn%+A_{YWiDZu{JsqBs9&zC4L(ttulh zF;;gB)RBw8Dc#!daAYsy7S+BfsG;nMDhgmO{z$IPU`}!4kznRxFlh6YETA1g>uP^V zlK=j^z5WdlK?*tgLU^Q*Xg6sA)TEayR*pvJg^pZ|i5B={>PlWg0rdNaTUK|nUg%r? z7E7Mz_JvvN=rMHuLZHt9;-=*z;M(z=Aky+^ys&0+k;i09!*mqyDy4C~L9@|stqN@z zFQB+;J3?B)n+_Lf$F=&k9q3tZI6L7?qNAfrmGS!3 zjgO9w7Qb^R!RB%}AtD~QJLh-r-tF;4PBaIXx)U3qBSr7vaQN%t$o z>fYMVhR3~*nby7sX`J@C!#q47CtV~}x6erc_fB6tkUdfMF4kH~z;_VX17Ib52L}ty zY8$PmEsozmWRH(qIsEzOA_0b;OQlvdQ&hU+omLuwK%>p;`-~MmOW=G9<&se5@`vna z?aqLmI+EYyS?z?&(1V~58(18V|V=Y-TmsWGZ{i^xs?7EoBtS8h*avavlPjX)mOVXHwYU>O)-Wj;PRrEVH%W2T zcg(G}*uEpG6WWz1T_|$*h7m8$b+89*TGFWkzUy}rLpSNj>aECA^+-JtrSjM3529K% z8fwDNf285yGun5vEwe!ZRzk7$C&wV)!(B~TjwvbX1oBUB#Hu}dHx|MINuHXr>&sMZ z{6aYElT%|7_Q?Vuj`@zLG?&ANQ05j7^Fe{&{&=ZX2hwr6x#$LxA3LyZbyb0A}wt2i(gAlf_Z)w|mjk z44VYd-4{Y5OaVW*jVOCKqBpz4suFU*6<5sP?5wNjdeWKgl@lDJ?gOp69Q2=->)% z+_m&|9n~k-=GROKQu7-eylqEaUuG8Bi#vvGMxTVeC)e&!e-ax#Y>lpFfcr{HyI2iR2RE9lT3`utq$H3>{y>+<4~nK zC^=DuD^?ej(zAH*0I-K*Rr2rMiWFZrKXB@oa9KDoO%>fbq>drdR3EibHGg=URYM-n z71P(}fdt=^e(*x~Q&0%tqw$M5L|$}<9Ct;MXnmJQx+g5cvMp*?Y%x%*aP17>B57Po z%L@Lru0JxTpQ`9vvkkBB770ni&OD7o-o9@zn$_->CN5caz3A!+vxpz4DhQG3HfFNH z#+~C)sDnxQTDSD-y2PAbxTy@6`Oh80L=4jAbMsn75Q5<6T6%dV%6Yk|81MpyE|3j@ zoVNcQsR&UuKeA7`OHUPW6J)Mp6EEfAemcek*$O>^E}AQG)9=SrbVPR80IRaqPxgZ+ zL&?^`jlL@;DDzKhalFzkvwm71r0(|#-Y5f$AMb`1qchi4+&b63yNvEcmq^D$D8 z>_e;*4!1@&0M2>P-!2QmRha&eRmSbCmq}**q;e+WP|I@gyc6=UZjWe{-qRERN$Z|z z5ZX>V;6%N!-CnYEVc|jhfQNWD3%|u}n1(B{&REFyQZe%0iBHcsa>MWU1>jyRNZ;dR z3pQ7TTs)8X9l%f6pDFJ2i1TcHzteE-np&{Zkrqv6h=EX}f9v0|fRoL}Y~L%=l)fp) z>0~SR3G~b2r!ND$v!8TJg2RBc`OKtP9C(on0YbAVkJi^WtbFBNYlNt)tGYZSuOH%v z@`Wem+HL|4VZ#=V*LdoN-iU+#^2q~#FeQ;d4MJa{W@ciku6=jz9DqffN#ZN`k&*ZA zyi*nuR%0s$bo87!lZOY4l-(KK5FAukSr z*h*G%(CfM4C}Cx7Pgz5K-L1_miHE>5P=G3Enb^|Y?1rl@W|OooSxx7QOcFO8a-)eg zXFZW#YvjV249llNm*O>(5)yLZ*&|#b?4_SOBo{!O*s$Y(cJ?Xi8TB{Uk3r$J^jYZh z7c>imK|1g1B7k?;IOH(X>E|Z9fR69`dA>xvDSzT2Int9P?%NBlEwX72+I!mlUN|M> zB;6ItjQD=;N>aH&ov*hWmGEtbqM+X7pfdA2zG3_Jp*KVJ^ZBSZ&3|`V^cGg$=V_271VY69G~cM z6d$Enz0ilG5l4(6qQ#T`wSv0ZW2dPX@_6CVAI=kDey~eFrXTn?8}}PDDMFN z2Yb`mLMIj1za27T{MHD2lFpg{{S`B++vPNJ3YFEgKWD#;t4aG6-32?iIKp)t{#T|> zd5X&9cv=R32@H<-t8Sf9P7)H5s`GZDD1@~%R73OEbJdE~fHz%x&aT5PKoip0QY6y2 zP$&Wm3+s$=cT@kS1&Ck)Wg4U^2S=l;2ofhGKW&dWWXLkv*gH&_J9LPbSW;E&pJH5TRw-UzY0 ze9`Si{b1Od*nY$1jtX4~lm^(x?S!mSqaX2tp?OTx(@r64r7vD+ z%3huF0unlu9a9zET$YK1FhN=?=S7b9Orc)J#U`qPV9KNExq&j&i+CVuZo=AkdQ1Rh zGZ`2NY>yX*GK;(ejnt|{dn5WR_&7I>O%{v2>{`3}C$q=uVZFZ}xtJ_=?^%UX2?q&1 z1mubkz)4%%v=ylENf&|4=>0+SS6hYs?Dx6I($6#}5kUQ1Tco1a_|P$}7ZfCi=gg{^ z>imaCll3y9&7eoZwqwFZWW~`9C;$eOLy}Z_=d)+tOkT+boKCF4nr@$m8I{}46k|7x zh9=1_6vN5Uv5{r}<7v#nT#D^TzUIX~B*YemFE=hWxG0bgO8CMxUQBmzbXV$BK6tEX z>i9Pw#R6Nr%0!~vluQsGAI+u2Rn=OK9j~wlN0^{(P*JSBC60Zmdnd!XkUkQv&QsEU zlhtNrJ7+PY>gd=zx>Gq1-Ln`vQy~!5dw565qy7j(bmS-Hdix(%f>|GOj8t_pENpQI zRejq{fRfu$B7q67_RIG4rRGU=}x%rt@v#CxFi&wzSqhN zJAK=4Z9Bqc1u$;2$hXK`*t|ksTUiIw_hamY#Sw02!LT0gpq+a6v6q(@bTI2#)u&JO znQbm`ep#MNn{S7F%+yJx&6qvZLNPcXrejH=i%9&Z(i#t9b2_#%BQCsp)!BG6jwgep z_7aya2>aQ)d>|`yY_%G9_Wwq%Tzqi6mo2;zWq*~E-A(UGO{c5>WLx=~&bPF_WMnq#ZPyLypCx6yVM==j}aQ&hfr5f)5UE-q>EJURuCLs|v%YX4_r)_B4JXP>ZF1BT&S|`CF6+u)pn?9)t*lSy|5aV-H6^`C>Uui%$2qwoOHi z^T;-d*P5<@VM3fT3dAe>;-xhLVe?*n)=H+IPVZQnS_MXajo+OlFr9g8VRhNJUJYul zEylmN#6`6!?9Q$Xl(z=Odwa8pnH4m?oQ7dG{!LQKwfMvud z2P=w7&yp$Qw}(>Y6-TdpXfHv@ZVddeJy}L#jPL2i+yK*M?6W$$bwuQEt1h#GnxJfY z`ifm|jGaH;4yth*OBfKoVV333C6NeW>`9_#(g~IrFho6j{FP0h^!8j&kz3a!thdT; zo*H~SNM2c~+xgx)!N<0=??R#n*<1`iY}twe=s)apofi}1KE>1=Ung^9@5R9_wxcSQ zkhj?}^v+HcVkVY!nJC{kjEZOtp2?R^Y!Wh`nUKfS-0)iawHhs4Q?h|Gb$?c^gz;o7 zGs;R#kaW{b7>W;WZ~%ow0^I?iOPN^hlAsh9Z(4lzbnO#ce^Tbs_0X{RM4S61q-LKv zN8MVc6W4a}3%{F4ox1U+k3>&V;NFGceCs6xAMPc)n(E8gVKDWS=D0vOV!Xu~-E>r5 z9`{OrxG=K{S*o8Ob3$1z-B!OWJJi<#`2`ZJ2<`Q2J__3qo7cS+RN`RoX8fu+$Fy+Y z$<6#8KR5&wj%UbPDR0o||MKuJgU1xx1n3kXmg>%qpW*oro#+3a82=wz{QvKU0e~f; zlL0DH7Bz{0xyD=L=G`lsffIUL#&Amhs_F4pYYD|u>Xt?{w7uLP-hPD!B=~F3XmELN zjMSI+xZ$=O0ld(QK9@V5X`OiF>NMvEm2?XDVA;0u3S5Mn#3rVz9?tW#H8Q-M z2+FGK6gKvb5>7F+?&lc~e)sfzOGP&x)v z1;|+z=A@ZHd)X>)1>)5<$uh=q^h!??+Jf#KVc`+J9267=+GndBpbBzdHM91b4E?Ju zxc);0k8xYs_LduZBWkySXlFm3_!;&F8ydGh{F%alop~n!4UUGbth^Lb7pEa#K!Eo7 zqKD0Wl0DCfiWSH_1;=5kS+=X5ahSuh%VC zERLcLY-LDJ)HfqdC8I3fKWX$ce)52NL3;Nv_=1Ny3+Ae?+o->23mIeP7%1A!PDh$WYUImYybWB&#BLZDp(2}?(OS~fuV7+E19vBkXX+5zpA06cx&5b6E`=*S$%r*EfUlc??y&jbFb#FNz7-CpW_8zcq zFrvAxrMF~|KQiAhPlW5#4NN&P!0>z4J$-$~fGXJi1(OtOYC3|#4#$Q`q+jTyjK79K z7R$NTQ7GS6D;$t3HXoNFG1wJk^T_@^@(6BdAQ{?TbVkg$Byqhdo;e2z+_#lu!L zNz&sqc+=9uWw+Xe2m7gTtY7fb*(}T*Cunbf29!{o;O;i~TQ(8l>mBOxCBChQRC&kP zR9tD{@o`AL!=H6?oKNSXs@^7R&Q>g+_7 zp!&())Z1Y(CAQYYmUWQCn{z658Rm?Wv#r` zWvi+4a7mqv!_mZZ;F3A1p}68=5~L1YgS(D0je|jdPA}9F;HDdRV3KE*3~To2eIBoG z+19yzB#<=+!!54KdRISLHZm^JyMG6AYLzhGPx?I+RqIIN=?e^dQ-HW_%qeCvxNv%6 zr|kn^qf z>S7BPc-y&L0C_*38Ei$C1Esj zK?^WBE$_MNXG8&aFBiA$+=b)cQ~2YxVpIBZCZTGg5V#ex+ehiwze55zj}(kxBzVIj z4<;Bgn8~o4LeIKOjE6K}Si5$1uvymf4vtRZ_EXBWeW#TV)gJ!b2@8tnEsQO@K}Sow zh_z|V@x$o#yu{G+TBV|G&YsfyGxUdEs9;zx6aU%?L1)x_ zlt(5gYi$11tZd4u@045GH63VO!D)XcWO*FEUV-%nA)kL`8QRfRLL20Nq-C{Ya(}^C z$1VMU*6KO$^&W|GCqjQG&~f^jn+s*kDh)`#7HElIPczlO3Wzbf_{nbmk#!t&07k zWDT;`&NESU7$@$nHADshRTA5i+ zo|1zx2b#PNc}^l;syT9ZCCgA9tpX_=EDkqjyZ72-aM0yAIiJC1?bM&l9}st;i6?~I=$zb~5tn_> zBentixt@$|${jB7kg;*;a&PTK6`6=xrJEAPMPw0={PE%LG{0v7gSD&35cy9vP;7C2 z_YM=F$hDhQKCwaJmKTDlhV?I~7kA|((>TvhR_Y_-`0Ov(+^kZ50L-yv)h;olH6Y}0_F@QMG-g4_b zeAx!3-EdeZW2DhqUaH7=rEJ9mY*G1u@@od;c>s@02CpQO=>rU2M_c^7Uo>DCy1V@% zg_Fn6(T!i$=b@wmC4w+9YN9ws8u>AjOTaW&)Rb+k;cC<56bB!#Wx5wy;PG-RhnC_k z7TNpLTNWps@FcLh8&yjzXjZL0Fz|3|0cossZB+-ft?3pA!?PVM`mHW;}kqKD)boCDL2c|S_ zf`3Xjus-ncpb*K)b=^d^CJyZi`cQk!qgk%q8-gIDjR{stw{**3(9L1u)vyeF) zQ*4L{B2?coL8Aru!Op7*lKr%PV3}Yr ztaNF0@WKY>_mpNe0DGa;yF$K!6|ead-CK4>2!ymIJexLI$rH^p{!iaj&lYXS6%*}1!STM#*yWbdlHv0DSej7iKg!SlDmDol2@|BvlPKG}Kz69y~ f-(x78L8>fuizhH7g=2wO?z_}cM~TwNX5j(;kCWXYpa)xZe~u-R`zy0oZOE%1s^h6 zy0|zv3v+SV{__q_dnXI7Z~Cr1V3aEkPoFzO5b=$Rzc^5Q;%x{LbW?aDrR9;hK0)jg zv47sSeMrXtnt%A-D;3s{rLg=x9o7zRr>E~2?tV zBzqz>h@;f*RPnp3;(WH|6?5>yq?_@fuW`}htfRyRrerEqN{AK1!Xc;+t0)dr2kbjuez#thphmsU%wv=DV7P+)@4bE zc4x22AFS8_IU)JV8Mo z9FA@fgwLpBikLj#QF5ggH|U)7>U@3Wgp>auWQ0?{K0bq_Da(OM6k%ZXyeOHz2-Zm= z9Y}m@s7_VGPtiYK=0ebP zM~j-+iw@$Nrhos@{|*CPFRIh6&$sL8Z)DgKQ^wywp20kxyd~4spn{+SH~pU<&-=?69Gsq#y4LYt7H4Js@gHlOEz@cxNNUU2_Z=f@+o`O*@ zx%Zx9aVGJ@^;6G%S`qDYdfxVsB0@-#HO+ms&3u!!{wb^3O_JgFPNe&q&9@`MRCKQ+ zj1t5R*ONV@XR;KZZ|_6UlJXbA=o$S7n5VBO9%O1(O0<3`xsv1VUoch!OK@8s_-s^P zc;e$?kZAs+O{DfAgy_C0h(XoyXv8e9p0_p3-BYp&Amj=($-lwtIU{{c@!*9WgQ(Y# z0oPKJNplwg1s6N#-2iS$2;uXAnQI-sz>~z`+xWGvZa(HqVXf&Z`_`6uMAbd6+1s|G zb0tb9x(&B5xLi z-D&fOS0v-UN6rlWF5NlEW+6jhj+lA1T+_3cwImS(zP@Msf_U;R$uW!=UCf#gw@a!RXg3B;Ks4<{rKZ=WmLFAwe$Oy zOD($Fid0exFV%Zl?G_pe>{0O;`@-I*_@t|gd09$oX&qpfssv?SR?R1&CW>{kS`LxZ z+Zsf-h6=~Na}-=b+`#RlDK%$(@JNlO(tc#eb#*AsL}s5_V)8?z1}2EK+ zyk38{b@V2k?Zqgt<7N3{gQ}={x~O<$hs2qsl?s%26+v`lv?hdk*?h^>YFOEphF8s6 zPcLH9o1a-$fHBrWau#gfxUui>e$iWGWi@%w<`NDBn zkBdJJ^n#R&d=uCCK}i{%@K9aI>PHy`1+Oaa!@7K8&?Cxm)sDyPG@oD&PV9Q=eGm3W zkP~^Ig!!$b578j{t2)fKnv?yEKERMm{yj;shYy|_D<>gqJ7c>sE1>NdWD&G~{&`%! zWLfUD#vMaMijI~IbrQXH7feI{5@W{vVvBacUQe;fiPynvXR9zwiZ|yb3J-!DVmKdV zbfSEYT4Ex@w{D;t8)NU^n{%}VV{-CdJ~`alwNP0d?hf?=Cw7u#I3)EO&y6PJ!UxU| zHejPEt=Lzu$3MrFUrg~CaUXGp{AxI*QD2gYiSW^K4)u6RhTQ(rhreGz5mFTMGm4ya zPZ7d6|Ljw%@6QMp*R6j1k9k0ItFxw)!T5v;6EE7HB@fxNs4o09k3ybHx%;M(U((u^ zPP~ehD9v8Ivcy+10TZfy7!(hm3D6iE(7MOSxEUJyt`8jwUh4Q~Xp35reP1-Iz)g5q zYzB+5m%@C4fX@7I0otbtVonnLuzCZebX1Wk0{a@Bts=1J#l^){Kc4pH;NkOh+t6Ff z5&HIgGB;lk%7reF!?NrdVk2TJYN(-NuHaUP%FqaO&hEC66{*@=rqeDH@7}Gg>&37w zPcguko>C$7x#60(4r3aMIL(d}#VIp$u*?&s-&Q)HCOEA%4w3!9le7CO1CgLp)_-84 z!#d4A_F_8a^<26WEP>}h*%muk-qXX4 z6$Xl|qoM|Gjd*>Iq_6}CsSJBL{) zoz;{ZEFEoaZ6uGy^eehH=xdX)_KmijdDlQDot~W*o=_L!zF|=y` zVp5R4Ar)ls9@SKMhnWw?BZ1Xzw&+r;er&d99!Wo1@7I{THlgol(LR(nT4xg{o-DW> zKSQ|1i<6TT(VX>1LMgE4>3qf0-muCVHmH~-SPx+Y+L@Ae!Q-}#+Xdn=9WkBoLV!3% zeUqfRMc}9EF?yB5h9)L#TE(f=MX&QTPAtE_We+u_XM~`KGxIaMkdO<7u1B86Xo*Kj z2myiN_Be8BX|>@nS!AQ?1P6Rlhk0nI(HCPQZt*Yzz|`sf8+UL)Y|`Lfg`i@({~yO3 z!c?%31z%O-+u83*kNF*a`)v%efBF;}%C|Etc>liNmRZT^$X;@xAS-%ui#tmKTl_WT zlH(c#wG$W%{eFW+3SrnMj9P8YT+)_rXh`|7vMViiPTgs&4xMv72}5V$K-00e@#Zc) zrmxz3dBpAEser|HW3j<{op z3;~3w#ZQfEjU4$1L%GcT;zqCj))XKhv}ya((!<%jezc~_YY#z;hjm}UpTZMmjgQfm z>k?Hn;WVpFGtIHXpzzR5Xn)N-XlpS%exmzXtFCH1Ny**caKCBH0L1AZ zoHp>f)RS=rfZkuRzfg6Ak}*M$geaziebjjxG0>Bu0|J#7Q$C{g@EvSsqW{Qqx6EbV zI!Q?dotrF%{?jjCz51%e*CvP8toPyYY`L}L!-=ksG3t327?Eb2>_1x;5uA-lwR(OS94NIQ;z@W{h^wf2|p`tL^L4@n}ZXZtHP zLigU9F3Uxv2xsM7BI*0+ID7MXIr8!2$1cJ`zgNCGyn&0kDH~4tXxdnGYaDMmgeQo^ znOZWr_*cJopPhx38j8T|CiF@=<5p|yy)WjuGG3PFX@451pW)+KFjWz5x@S;`TdD6AA2jSvNSH;? zBaIAc+}Db09tti=%LO4TZBfxfTC(I+-;Wps03LW9alR~K_3>kG(x=MG%KLj81zv|! z_O4b{IIX{GKc~r{t5g{%US2I*e{|8#+J){*X>2ezVhnXmSw(9rNgn4 zb7RRL-xz+|GTuAi#*L1<1(1E|fj#$F*i8oS%a+;OZ%BBZR;}zWnKX=4?SB#M&y!$* zFedjcp%Flq3^Kg-)KJ_p0a!NKy`oD{9Hr`Jkd+Z@iFd-L?bLxWkN z)o0&7b0hUjvnx3CGB;nEy4t+IuBf8ai4C)N-_+htmv!A*>PNxl*V$lYW>_C|zM9mo z_?Z^D`)ccRoT#EDTs#LuIaJs+FfJjud(UT2~M+ZrIS^ce>BL&_aneUDG8EecxYC z!H(=ma*xLxG6-kJ-B<4O%U0phQ8VVXjs|UPj6~hf+^0={cQL{AUDz~_@79a&PPgvE}g-yrqMk)HY`F9S~wH;cSC>qo}nd;RjR(@i+L}byZbFS0<24cFHc$t#dX6GTtxkt5+uWz?Rm03ru`XSDQE5@+W`4tW%(6zL& zGME$DaJ)bh!=bNjGg1f}tFVn3xh(1MYpbC-#)}i?JiCZ|>Tr#!KF|1k(T475yU7ga z0S}L+k&)2?DTGk69w{tH0!hvx)oPlt%FfNL4u`{Q=417{{3NnfQLzc~Fmo<4migw3&^YEXRkEcT+nDSu9l<=r`h5cX(Sqc(2ur$CBjXAsB9-3{XIBZr{V)3d$(jv~JFsmt9)!egh2 zN#|pE1jY~hII`^fY49fd(tn2zIjgDm&_W)F_V%Zx1WUauXjD#aZtmLpOmnb>L^8Lj zT(S=r&SlR(IrS3DG08=r4PSnUd=g(EO)k2F04mPv_2K1d|2JL@$Gg8bx#NW+ndt`O zxrUc8NmD4(jEDtz2K)M6p2Yo`d}?(xiA0bhADdNkJZT~yBw2VBF&(uN)4}d&oZgct zY#Kyo+NHWiS)#Ysb9en@iqqM61|gBH)Tj3)Pne=Y4AQ-~?=A zVGTkAE7BZk6i#kRxH%P0_A2*5J9Io!cn;;z6H1_C{yQ96hzod&-Dc$!Tyu4}pgT`1 zjG6BisJnk!LTk;T5KneF?i;3MTN1>uLg{Mu6o;C_Cw(n+-a2$}+ z(=U9n$BPSkpZfdzT-0d<$&slYEB>u3dAy_MvuiEjH86x zw^bR;{^&uUPhzpC6w^s~-|77BUn-QxI}ZJdi$bWNpunbEoVrSosx;H)aIp8>)0^k! z74Wrsx&@~4&Aa257gPL(-(I<4;7rojj%6x`?|ZQ-#fwgj67&OX?v2u~EcEPT?ZoXv z-7w*p?KP-@jL!4|HtO5{V`nRD!_P@C`m8*Lo`y>L1)$<*Q#Y6&BD z!#`(Py4PE6Y1qAR{VNi(_Q~~ad?fJPo<35rGq|@Y&{qv(3RS@6_12glWjR}7dSj?dMSy)K@u2DPi!UX24HMJoWUR^2%}*&jUFU!7lE z%z1x<1t}L!?Rf(MYIYX}$lDXTvf$z42jb#JEYA}AMvRT?>cp9tW^0NX)1aYrU*cWt zaYL{1wgHfq!eM~pM#;NvjOPV2zy-a>+S*t)38l!_g@z0US3hPlDXdI>tz}}k&^l}m z$DJd!i;R+HgQ$XW`)u9Evkz3uMnIRjXcg!@1r|PQ^aJ@#G0)RXBkS{z@gr7+!;uxk z2u?hgKfkWXcYs+v;(Pr|O-f2CBrI%*DN;23A{Kj#aCvH)kWaMK7tNC>ZqjDv5$7P+ zlFXb%gVlm5goG z0Gn|K`H%V&KhFo^A{0M$(;Z%UU)6*RQn4U=a|ar7p`F z6ztl{SFT*K9>`R{;-_AecxQ-i+)s@uXKqKB7u;nqTI*h9jYgV@H=JWJyDSjLk&}N2 zKBfAh_5=k8BxB$07$ycVrzn<zpq{E#i`|?OUNpE_M(lhqcM+!>4!-rK#yaoYQR?GPlpV5kgEuGSX~y*j57P!bKd4fZhoBfj<%mt4`= z&NQyJljsjc0O=Rshsrl6vGKiBp&3T1`#|ih63ywuaZfHttOpgQZCm zzzXzW{&BT4U%&Dhx%g4) z?*P+r?R?!d>=|Zt(tDGylEHURolek!v9`SJvJ@H#(|q+Rv${w(hUwmvHC zv6cFmhiAf`TMN7cd0QmIh^DGo)_*25+TqlEye8lAclmfMdWM?(@yZ=$q*aoHVb`u* zJK3n+EIjc%KN)EpDmIbv^!5e_OL%J*rykoo;=1yKm4K3Xcq?~?s8*~iL<0mtV1Wb( z+b+BA?d@&#l9w&K_LHJKYl&js+LW9I?fn*1IIR5q+5pBoPH-0YzmY?kwZ-b~OffH< z<@#sjKLBf6bvvULrJ5qHSNy`i!hWjocc}$CAK!k>=J8TSB(KYo8i#R%0kdMXLpS7d zS~)vf?_0SdfU>uvIcz<6Z_1Kr2+DkM6t}s>Vo#E}Qq;F4TqR}Y=#-QcyXyH{&JTO{ zmIq6X8E)RpjE;`()C>GGJBzNgH|9Bg8yviNRGUPPfQ#*+>>B3HOTTo!7^mb?A0Gz^ zyvB6z-Va((3_i2LkhuUdC@LvwcE)ma7nWc)8;#96W9!%Ud&M#NY&wOB6Sl*7nk-2Y zenzSiXJtZyqg8YwZe3@Wr2d9=J`u*o#alN$zY0`z>=wY)lJhHy;?T?xq7(FrE<2o> zOrv_QkdTm$NqTV~kAqn%9&>|((ag+y!3`tJIJr;qt_yq3<^Jw6E5qJCRA{{a1w$G> z#?Nmb^lso<4=0%HFT`MN6G(BF5ixhGlisCei4;S)9MsO9f5FTF`;W#8ALad+ zv%8nlKjHMvR9z4--`gmQHdEqxDPH|E3^dk!L2X?Mh(Cf#S9?Tx*xfKTA zVx-|&c&@1MtfYoyj=P5)5>b5m^pQ@0eSdmjYXsfu`|$Eg>oa2x&ybju!l5B<&H2sEBKc&WAD~z?JwBXpH;(uo=?}TkoyqU%^hc#H z%vzb|SZ$P5ukdBYiN3FltbEz{4vl3vKsgWgAmM(l&J}j5jv!M=mmW*bnulqky;1RJ z-+x+soM(*yG%x{gawtEml(VOZZ+&xd1Q$|`8Qd~`LDJ{?qmiM=jdV0`Kck?VS>#~j z7rW|UnTqD_ z#L+`l`0S)JAnE5MVyL>L=YWvH-syDB2Y9837u0sb2ry!SS~jp$``n?!+GU8Jpm#1g$*LH>oq8Zdm)A zYBGRSj{`X$RV9YN*jK{+>PC* zW}hO*1i{yLEl2>U48yq?Ucj4VCGFb;Aqs=oSkSZDgr96s6rt3r1I*!~g9dMhbgS!p z-y9&%{K~rt6xx&-GLn1uw3fQlsDJxqwszCzAes=JllEP$h9?yR@fDWw)$0nKp#A2{ zKmpBwaP+;dUIqjz{J8!z!mc~fWTzfY1{s}~)h96S zI*Zv!=*4|;q*@+OK5IgfuAy>2s3X-;K|oIErow{^W^z*C0~d-*00A-Eqep6vj*d0- zHBHmSd%MdgR-3A9*A0HWp5PW8SrRJu%`d1CMYoL8^LT_=4;SXio%ZRNVQx%qtyQpn+pc7fjV zQh$ayd*6@ueiBB}oR0+W&Ftda8r42`{5tbdDTGN@#PDd8(Td zM#8$@-iGCCtGiG7=2V~e^#=3Kpsy_aqBm_hP(P>7x&TNA1Ha>Zdly_2_$165eCm9o zzr^Hy%OLC=OBg4EsuH*Dn?G}#cD3!Vpfv}xRa{35-Iw)rN$DjUOo6@QSnS##plk4X z?!4MfPx#2Jv{HXKS-U1N=O=r?$+zBdKAMfy++zlX`@fU%F_WtRCOQbuDsr-4LxAo) zc((u8E$)h>5hW4(Qln`U@+dxk_=;g(L|4x$ubUw;7oF=%lwY z%?!=_+8-0DOnGlI{bi>jCPB!AMVW@pUm>nt{d#8B5k0suk7N+-dzmqNCiks#oQZAXK_$Ec@iGlJE-!TL2=S|NL0V%4ydq8e;}z zu?_ojUyRo-WSnpfUg#AA_DtL5f%nRDZ@WB`xJ&okV(nKlHSf}twvQNy5FsGT>@629 zzh@cE(_+mCy|8UG*EUty8Ri()^5^LkaqIYsb8_l!Z}TJ?-h!IQe0Z`RFJ^8hTF!j`$)?uSJ1*|Emnto-X!)zyT?;il8&}VN_xqCHE0U|w z^d(OVh05gG+jdx5H#?OWpQ4>j#iEXZ14go4vpPU#V%sZlG5cELT*^I`!pXWF2E#&w&?8WU}%_JLu`i3w(GJ9HSXy*26_N%j!b`U=3 z0{}y4GVcDV6Y^WHsbPlgl+*||@qwRiGCV$QD7J8G=ayFesuiD#cY3kOU)AiTlXZU6 zg>!;NDhFCM#Id`9IN7(!mI*%i+1aTdNK9zmgkWVeZiuJI0`ksQP3!k$Id*blZ`=(A zL=brjs;TM4uA}sKjquysf|l>~pf1ZPR(h#SxV#mPwn zIH2AWJ~4q};roTUzit#S-cJ3%RBL&5La}iE_P#219Qhbx+`M&gx@sWY%Djk^?@my4 z_dfr_A+pFaC^h=gIbE@6zRaKTPZN0_FhfsU9#$u+_lrf2@>}6qu$Tsj-)~qn& zD=28ZOm`0PnD&=GnfvsHO>Zx|^FaQIhv6DKA*ADSNM$vujY3HpEy13T(*G!_3yb5o zt=XBHE`F5f;aDw}L*AgEAcSI)hxY)X?*227jznZ+j&7_VoU;=r3EVaezFs1=wwlBo z9etj$7|0a#^rR{P2>{XGM%dNly_v(@N6_`rnDZ; z52fa{M3t2d)fJM0fn9N<99v@hNh@BqNCS*2=4|YBa{SLrC0>}FdE&0&l!2^HHtub2 z*(aije;JKDR+Rfjz5~(SfSO0jo6J0*VnVr3fS0^4fI!`A;mc%5h}SW)_i#gu^DjBh zAsm`p)ak3^(t5zyxN@Pl6abk`RshIsi@|`eo12?Y!ob^3Tfa#SCbP9EoOe~w7`WrQ z*~4fF&VIvLsu=4)`C=}w|K3e%z@G59u4w6pQ@eKcd#fgkX2%(MX>=#V>8uXNTvR+@ zJ^EXr>d_}bFX5szm^G3_BvMmTU&agX6UT6PyGJZuUFn-KlYKJ8SD68Vq9a<$YrXt= zL^PoK(}}lI!H3g!*|YIlE72w*<;ao^&7SkP`(t`KYHiCjS1T_zf>vnyFAc1RSW>Q2 z6{XE(4QdOo_rb`*!0lc!_j6Le2yTayX7cj_P`Cd8ztR}%w6E0RTlxVGoSb~1$G+~q z=pmi#qIIV& z4B9Py%{7>8riJ>FB7|!8D936px!Xu_jWSfs0VKyPU?y{2<*!fc^}wuS7p_x(y5I71 z3=*n*5mgj&~oUdqpJCYZQ-LWnvN$tk}^ScaVI z;AH)|rk9uA0XCe*`G68TlqXYWGh!|)>w8y1!cSfiN_^N!BJ56cXE8g}WO1XfnT^3o zE08GDnIDv89Lv2W%DwNz_Lc*g4e^iXojHs|VS&VyKl{D?P91|mFD?82ePciZd(CQt z9fr)muYA=0K?5Ngn^l~8!@R0`@lcy?)-f>3m|{Av)E^5lHmT%dZ_Y{shMtd*J2)s- zE0W$mS0>mST{7Erq0hOGJEL3BkOe!PC4Q39gf``7`1)PAUzs&7B>D-6nr&?Yn2&B5 zG;0e9_UNCV8s}YYC6gaqb2xcf86(7a{E{;EnoGzn(Y9-spaiD}kl2B)jkDZh1RWtt zDULAa!-uqu33(t!H<4E5^*t{g>sb2wIG`u1O@KmiMi3WrVnB?Rui8w?%klSh#I(i4 z#v&1j#Bdy3CseLqM~fYMhV0^DXJ`1Wr0X~qf>jXWlvvWw{Gn-oPVbL#IEh2xUHBp= zO@ectY>w8nRRm~kqfnXEAaWdz|GLn@zpPWwDa@N`ZJgR=U}XRliHY(kVN2(-T&;Ji>nIUNAvQR3)Wf1TYuUBjS0l=)Aeqi!|$`rxx0&uPY+5>+WTl zNMzg^n4gbZ7`j3(exJcUfDCFeR$FUP0&s|jy_Y1>hMY#%`U9BX)mh|=p?-zomM~$BpAD^x&{w0T8{B!nWvyQyyrJM^u8LUqk z+FNGdtxyyUjC%~LSSneQYLBZa+8`1_1~gC#0zlwRm|9|LJcNWP?e)p1@H)-;#IWo9 z9G^;+(l57EpRw2RH?H21p%X4MCZ@FOgmWdbD$RUr<9c@6V{mgqCrw^Ud`^eL+(Z>Z zkP6;JD8>+t{Am%nc~fgGWHCLX$nUw&L{0Zlwu(Ifm~9`5T1jil+uyGhqLesB{g`?{<*{t095n z5?L7w*m}01@u|L zedA!Sh09#sBb*3FR?Ns9$s^+qHAJr+z>G)3r zUU1eUFcI+IU&fU) zNHJ1;^gHmcAqwqq;XmMRphnXT^P@2Qy@gOIbJ<07{o74`8nZTq@T|EC|V1& z@^T-~{DY0N9x%n!Y!#7&!&c*}`OcBP3fonoSUdBv3RgD$ige(TXsrnV0%B;X?>J<-Hqn>H4Lm$0fEROL z9yR}b`5K@XxBoWVvbO%mF8RL__~IWuNeNwi8&DIG!6hK;I)!yk<9O7aVcY>Od@Ss9 zgs7&w!DH}-u(JA(D~$kFK1mqO&*D*6Wi%oEmoYDa9|pk4&^UG>A;!8tJ>cV~UdzF3 z{BnB+lMM;@X|C5^t_3jWsU-et`wwH@O?o3KF|V+J>2C$-ddy{D%yXYQTL>9}<*Lc> zSYSu~Hs<+a;*o%+0%P81?of2;;w->dc^{ZW5_ldE;@_-ZJ4^B9H_lR;O0ybl;Qi0W zykEujRBtc%g}_u8?8S>diXtJ$y9#)O;sx3TY=9V^T(~O8Xn&dhZOls&kw@B&H6Yc} zPJl5_ul9gPR+h9+$G8RMFeCX-W8U)e;{Kqjh*suPbzscf8h1XtkOEc)vLdR*%)5w@ z&r1t$ag1hz$ks~#Q2?a-Zfw{@Z6mBdy~TBJ=^HTS#jut0`C)H?m()yw3#(4lh;{u} zV_pzxLI%L6(xnzfXiyqBy}Q5gu)w~)sshHmGWZ$g$?+n?*A)Ho6(-x?J2AJoCesQH zS3gTF`x7PuV_xIw*Ip8p{nbkK{T0`}Azl?d?e?m=p-CmQo{2knRs@PWUL zd8fzrU;Z-Yd2G4-hcU11Z)2Xy|D7>!7h+~nVrA{&0t!M^;rGBS1mtN4xFxiu_4j7k gfAfC)?mov8DRC10m86pfnhc~M`|L@f^oxN11v%=RRR910 literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_plot_layout_guides_collect/multiple_guide_areas_extras_are_blank.png b/tests/baseline_images/test_plot_layout_guides_collect/multiple_guide_areas_extras_are_blank.png new file mode 100644 index 0000000000000000000000000000000000000000..69ffad5fb8ef07696e9800d877c294c59b4d1bb7 GIT binary patch literal 10163 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 literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_plot_layout_guides_collect/nested_collect_guide_area.png b/tests/baseline_images/test_plot_layout_guides_collect/nested_collect_guide_area.png new file mode 100644 index 0000000000000000000000000000000000000000..5d6a1bbbf146c1f120c6747bcd6c31bf332ba057 GIT binary patch literal 14648 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