Skip to content

Commit dce8e71

Browse files
committed
Make _side_spaces instances know if they have a legend
1 parent 5e04fd1 commit dce8e71

File tree

2 files changed

+28
-40
lines changed

2 files changed

+28
-40
lines changed

plotnine/_mpl/layout_manager/_layout_items.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -723,7 +723,7 @@ def set_position(
723723
if legends.right:
724724
y = rel_position(
725725
legends.right.justification,
726-
spaces.r._legend_height,
726+
spaces.r.legend_height,
727727
params.bottom,
728728
params.top,
729729
)
@@ -733,7 +733,7 @@ def set_position(
733733
if legends.left:
734734
y = rel_position(
735735
legends.left.justification,
736-
spaces.l._legend_height,
736+
spaces.l.legend_height,
737737
params.bottom,
738738
params.top,
739739
)
@@ -743,7 +743,7 @@ def set_position(
743743
if legends.top:
744744
x = rel_position(
745745
legends.top.justification,
746-
spaces.t._legend_width,
746+
spaces.t.legend_width,
747747
params.left,
748748
params.right,
749749
)
@@ -753,7 +753,7 @@ def set_position(
753753
if legends.bottom:
754754
x = rel_position(
755755
legends.bottom.justification,
756-
spaces.b._legend_width,
756+
spaces.b.legend_width,
757757
params.left,
758758
params.right,
759759
)

plotnine/_mpl/layout_manager/_spaces.py

Lines changed: 24 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
from plotnine import ggplot
2828
from plotnine._mpl.gridspec import p9GridSpec
29+
from plotnine.iapi import outside_legend
2930
from plotnine.typing import Side
3031

3132
# Note
@@ -79,7 +80,7 @@ class _side_spaces(ABC):
7980
"""
8081

8182
def __post_init__(self):
82-
self.side = cast("Side", self.__class__.__name__[:-7])
83+
self.side: Side = cast("Side", self.__class__.__name__[:-7])
8384
"""
8485
Side of the panel(s) that this class applies to
8586
"""
@@ -136,17 +137,21 @@ def _legend_size(self) -> tuple[float, float]:
136137
values e.g. 0.2, instead of just left, right, top, bottom &
137138
center.
138139
"""
139-
return (0, 0)
140+
if not self.has_legend:
141+
return (0, 0)
142+
143+
ol: outside_legend = getattr(self.items.legends, self.side)
144+
return self.items.calc.size(ol.box)
140145

141146
@cached_property
142-
def _legend_width(self) -> float:
147+
def legend_width(self) -> float:
143148
"""
144149
Return width of legend in figure coordinates
145150
"""
146151
return self._legend_size[0]
147152

148153
@cached_property
149-
def _legend_height(self) -> float:
154+
def legend_height(self) -> float:
150155
"""
151156
Return height of legend in figure coordinates
152157
"""
@@ -220,6 +225,17 @@ def has_tag(self) -> bool:
220225
"plot_tag_position"
221226
)
222227

228+
@property
229+
def has_legend(self) -> bool:
230+
"""
231+
Return True if the space/margin to this side of the panel has a legend
232+
233+
If it does, then it will be included in the layout
234+
"""
235+
if not self.items.legends:
236+
return False
237+
return hasattr(self.items.legends, self.side)
238+
223239

224240
@dataclass
225241
class left_spaces(_side_spaces):
@@ -257,7 +273,7 @@ def _calculate(self):
257273
self.plot_tag_margin_right = m.r
258274

259275
if items.legends and items.legends.left:
260-
self.legend = self._legend_width
276+
self.legend = self.legend_width
261277
self.legend_box_spacing = theme.getp("legend_box_spacing")
262278

263279
if items.axis_title_y:
@@ -283,13 +299,6 @@ def _calculate(self):
283299
if adjustment > 0:
284300
self.plot_margin += adjustment
285301

286-
@cached_property
287-
def _legend_size(self) -> tuple[float, float]:
288-
if not (self.items.legends and self.items.legends.left):
289-
return (0, 0)
290-
291-
return self.items.calc.size(self.items.legends.left.box)
292-
293302
@property
294303
def offset(self) -> float:
295304
"""
@@ -370,7 +379,7 @@ def _calculate(self):
370379
self.plot_tag_margin_left = m.l
371380

372381
if items.legends and items.legends.right:
373-
self.legend = self._legend_width
382+
self.legend = self.legend_width
374383
self.legend_box_spacing = theme.getp("legend_box_spacing")
375384

376385
self.strip_text_y_width_right = items.strip_text_y_width("right")
@@ -383,13 +392,6 @@ def _calculate(self):
383392
if adjustment > 0:
384393
self.plot_margin += adjustment
385394

386-
@cached_property
387-
def _legend_size(self) -> tuple[float, float]:
388-
if not (self.items.legends and self.items.legends.right):
389-
return (0, 0)
390-
391-
return self.items.calc.size(self.items.legends.right.box)
392-
393395
@property
394396
def offset(self):
395397
"""
@@ -490,7 +492,7 @@ def _calculate(self):
490492
self.plot_subtitle_margin_bottom = m.b * F
491493

492494
if items.legends and items.legends.top:
493-
self.legend = self._legend_height
495+
self.legend = self.legend_height
494496
self.legend_box_spacing = theme.getp("legend_box_spacing") * F
495497

496498
self.strip_text_x_height_top = items.strip_text_x_height("top")
@@ -503,13 +505,6 @@ def _calculate(self):
503505
if adjustment > 0:
504506
self.plot_margin += adjustment
505507

506-
@cached_property
507-
def _legend_size(self) -> tuple[float, float]:
508-
if not (self.items.legends and self.items.legends.top):
509-
return (0, 0)
510-
511-
return self.items.calc.size(self.items.legends.top.box)
512-
513508
@property
514509
def offset(self) -> float:
515510
"""
@@ -610,7 +605,7 @@ def _calculate(self):
610605
self.plot_caption_margin_top = m.t * F
611606

612607
if items.legends and items.legends.bottom:
613-
self.legend = self._legend_height
608+
self.legend = self.legend_height
614609
self.legend_box_spacing = theme.getp("legend_box_spacing") * F
615610

616611
if items.axis_title_x:
@@ -635,13 +630,6 @@ def _calculate(self):
635630
if adjustment > 0:
636631
self.plot_margin += adjustment
637632

638-
@cached_property
639-
def _legend_size(self) -> tuple[float, float]:
640-
if not (self.items.legends and self.items.legends.bottom):
641-
return (0, 0)
642-
643-
return self.items.calc.size(self.items.legends.bottom.box)
644-
645633
@property
646634
def offset(self) -> float:
647635
"""

0 commit comments

Comments
 (0)