From 2f366fa7b261af66fa880dc6b4c84effda24bed5 Mon Sep 17 00:00:00 2001 From: Abitamim Bharmal Date: Thu, 15 Dec 2022 23:07:31 -0500 Subject: [PATCH 01/14] Make arrow annotation arrowhead adjustable --- lib/matplotlib/patches.py | 92 +++++++++++++++++++++++++++++++++++---- 1 file changed, 84 insertions(+), 8 deletions(-) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 63453d416b99..10558e7bdb27 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -2508,14 +2508,35 @@ def __call__(self, x0, y0, width, height, mutation_size): class LArrow: """A box in the shape of a left-pointing arrow.""" - def __init__(self, pad=0.3): + def __init__(self, pad=0.3, head_width=1.5, head_angle=90.0): """ Parameters ---------- pad : float, default: 0.3 The amount of padding around the original box. + head_width : float, default: 1.5 + The width of the arrow head versus the body. The minimum value + is 0.0 and the maximum value is 10.0. Any value smaller or + greater than this is contrained to the edge values. + head_angle : float, default: 90.0 + The inside angle of the tip of the arrow. The minimum value is + 10.0 and the maximum value is 179.0. Any value smaller or + greater than this is contrained to the edge values. """ self.pad = pad + if head_width > 10: + self.head_width = 10 + elif head_width < 0: + self.head_width = 0 + else: + self.head_width = head_width + + if head_angle >= 180: + self.head_angle = 179 + elif head_angle < 10: + self.head_angle = 10 + else: + self.head_angle = head_angle def __call__(self, x0, y0, width, height, mutation_size): # padding @@ -2530,10 +2551,26 @@ def __call__(self, x0, y0, width, height, mutation_size): dxx = dx / 2 x0 = x0 + pad / 1.4 # adjust by ~sqrt(2) + # The width adjustment is the value that must be added or + # subtracted from y_0 and y_1 for the ends of the head. + # The body width is 2dx. + # Subtracting 1 from the head_width gives what percentage of the + # body width is in the head, and there is .5x of that on each side. + # The .5 cancels out the 2dx for the body width. + width_adjustment = (self.head_width - 1) * dx + + # The angle adjustment is the value that must be subtracted/added + # from x_0 or x_1 for the position of the tip. + # each half of the arrow head is a right angle triangle. Therefore, + # each half of the arrow head has the equation tan(head_angle/2)= + # (dx+width_adjustment)/(dxx+angle_adjustment). + angle_adjustment = ((dx + width_adjustment) / math.tan((self. + head_angle/2) * (math.pi/180))) - dxx + return Path._create_closed( [(x0 + dxx, y0), (x1, y0), (x1, y1), (x0 + dxx, y1), - (x0 + dxx, y1 + dxx), (x0 - dx, y0 + dx), - (x0 + dxx, y0 - dxx), # arrow + (x0 + dxx, y1 + width_adjustment), (x0 - angle_adjustment, y0 + + dx), (x0 + dxx, y0 - width_adjustment), # arrow (x0 + dxx, y0)]) @_register_style(_style_list) @@ -2551,14 +2588,35 @@ class DArrow: """A box in the shape of a two-way arrow.""" # Modified from LArrow to add a right arrow to the bbox. - def __init__(self, pad=0.3): + def __init__(self, pad=0.3, head_width=1.5, head_angle=90.0): """ Parameters ---------- pad : float, default: 0.3 The amount of padding around the original box. + head_width : float, default: 1.5 + The width of the arrow head versus the body. The minimum value + is 0.0 and the maximum value is 10.0. Any value smaller or + greater than this is contrained to the edge values. + head_angle : float, default: 90.0 + The inside angle of the tip of the arrow. The minimum value is + 10.0 and the maximum value is 179.0. Any value smaller or + greater than this is contrained to the edge values. """ self.pad = pad + if head_width > 10: + self.head_width = 10 + elif head_width < 0: + self.head_width = 0 + else: + self.head_width = head_width + + if head_angle >= 180: + self.head_angle = 179 + elif head_angle < 10: + self.head_angle = 10 + else: + self.head_angle = head_angle def __call__(self, x0, y0, width, height, mutation_size): # padding @@ -2574,13 +2632,31 @@ def __call__(self, x0, y0, width, height, mutation_size): dxx = dx / 2 x0 = x0 + pad / 1.4 # adjust by ~sqrt(2) + # The width adjustment is the value that must be added or + # subtracted from y_0 and y_1 for the ends of the head. + # The body width is 2dx. + # Subtracting 1 from the head_width gives what percentage of the + # body width is in the head, and there is .5x of that on each side. + # The .5 cancels out the 2dx for the body width. + width_adjustment = (self.head_width - 1) * dx + + # The angle adjustment is the value that must be subtracted/added + # from x_0 or x_1 for the position of the tip. + # each half of the arrow head is a right angle triangle. Therefore, + # each half of the arrow head has the equation tan(head_angle/2)= + # (dx+width_adjustment)/(dxx+angle_adjustment). + angle_adjustment = ((dx + width_adjustment) / math.tan((self. + head_angle/2) * (math.pi/180))) - dxx + return Path._create_closed([ (x0 + dxx, y0), (x1, y0), # bot-segment - (x1, y0 - dxx), (x1 + dx + dxx, y0 + dx), - (x1, y1 + dxx), # right-arrow + (x1, y0 - width_adjustment), + (x1 + angle_adjustment + dxx, y0 + dx), + (x1, y1 + width_adjustment), # right-arrow (x1, y1), (x0 + dxx, y1), # top-segment - (x0 + dxx, y1 + dxx), (x0 - dx, y0 + dx), - (x0 + dxx, y0 - dxx), # left-arrow + (x0 + dxx, y1 + width_adjustment), + (x0 - angle_adjustment, y0 + dx), + (x0 + dxx, y0 - width_adjustment), # left-arrow (x0 + dxx, y0)]) @_register_style(_style_list) From e8d7eb7c37f8b862993ecadb806dd6bdb0a6c107 Mon Sep 17 00:00:00 2001 From: Abitamim Bharmal Date: Thu, 15 Dec 2022 23:07:42 -0500 Subject: [PATCH 02/14] Add test - not sure if correct --- .../roadsign_test_image.png | Bin 0 -> 10660 bytes lib/matplotlib/tests/test_arrow_patches.py | 21 ++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 lib/matplotlib/tests/baseline_images/test_arrow_patches/roadsign_test_image.png diff --git a/lib/matplotlib/tests/baseline_images/test_arrow_patches/roadsign_test_image.png b/lib/matplotlib/tests/baseline_images/test_arrow_patches/roadsign_test_image.png new file mode 100644 index 0000000000000000000000000000000000000000..d9cf3646b5857078f0df436313c15f3bd78a81fe GIT binary patch literal 10660 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 B6f^(; literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_arrow_patches.py b/lib/matplotlib/tests/test_arrow_patches.py index c2b6d4fa8086..ae9e2ca5f429 100644 --- a/lib/matplotlib/tests/test_arrow_patches.py +++ b/lib/matplotlib/tests/test_arrow_patches.py @@ -48,6 +48,27 @@ def test_boxarrow(): transform=fig.transFigure, bbox=dict(boxstyle=stylename, fc="w", ec="k")) +@image_comparison(['roadsign_test_image.png']) +def temp_test_boxarrow(): + + styles = mpatches.BoxStyle.get_styles() + + n = len(styles) + spacing = 1.2 + + figheight = (n * spacing + .5) + fig = plt.figure(figsize=(4 / 1.5, figheight / 1.5)) + + fontsize = 0.3 * 72 + + for i, stylename in enumerate(sorted(styles)): + if stylename in ("larrow", "rarrow", "darrow"): + fig.text(0.5, ((n - i) * spacing - 0.5)/figheight, stylename, + ha="center", + size=fontsize, + transform=fig.transFigure, + bbox=dict(boxstyle=stylename+",head_width=1", fc="w", ec="k")) + def __prepare_fancyarrow_dpi_cor_test(): """ From 15bd7dc41e289cebe0a715fba5321cedc1f93a9a Mon Sep 17 00:00:00 2001 From: Abitamim Bharmal Date: Thu, 15 Dec 2022 23:14:49 -0500 Subject: [PATCH 03/14] Update tutorial --- galleries/users_explain/text/annotations.py | 32 ++++++++++----------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/galleries/users_explain/text/annotations.py b/galleries/users_explain/text/annotations.py index 5cfb16c12715..8c158a3095ab 100644 --- a/galleries/users_explain/text/annotations.py +++ b/galleries/users_explain/text/annotations.py @@ -230,20 +230,20 @@ # The arguments are the name of the box style with its attributes as # keyword arguments. Currently, following box styles are implemented: # -# ========== ============== ========================== -# Class Name Attrs -# ========== ============== ========================== -# Circle ``circle`` pad=0.3 -# DArrow ``darrow`` pad=0.3 -# Ellipse ``ellipse`` pad=0.3 -# LArrow ``larrow`` pad=0.3 -# RArrow ``rarrow`` pad=0.3 -# Round ``round`` pad=0.3,rounding_size=None -# Round4 ``round4`` pad=0.3,rounding_size=None -# Roundtooth ``roundtooth`` pad=0.3,tooth_size=None -# Sawtooth ``sawtooth`` pad=0.3,tooth_size=None -# Square ``square`` pad=0.3 -# ========== ============== ========================== +# ========== ============== ========================== +# Class Name Attrs +# ========== ============== ========================== +# Circle ``circle`` pad=0.3 +# DArrow ``darrow`` pad=0.3,head_width=1.5,head_angle=90 +# Ellipse ``ellipse`` pad=0.3 +# LArrow ``larrow`` pad=0.3,head_width=1.5,head_angle=90 +# RArrow ``rarrow`` pad=0.3,head_width=1.5,head_angle=90 +# Round ``round`` pad=0.3,rounding_size=None +# Round4 ``round4`` pad=0.3,rounding_size=None +# Roundtooth ``roundtooth`` pad=0.3,tooth_size=None +# Sawtooth ``sawtooth`` pad=0.3,tooth_size=None +# Square ``square`` pad=0.3 +# ========== ============== ========================== # # .. figure:: /gallery/shapes_and_collections/images/sphx_glr_fancybox_demo_001.png # :target: /gallery/shapes_and_collections/fancybox_demo.html @@ -303,8 +303,8 @@ def custom_box_style(x0, y0, width, height, mutation_size): x0, y0 = x0 - pad, y0 - pad x1, y1 = x0 + width, y0 + height # return the new path - return Path([(x0, y0), (x1, y0), (x1, y1), (x0, y1), - (x0-pad, (y0+y1)/2), (x0, y0), (x0, y0)], + return Path([(x0, y0), (x1, y0), (x1, y1), (x0, y1), (x0, y1-pad), + (x0-pad, (y0+y1)/2), (x0, y0+pad), (x0, y0), (x0, y0)], closed=True) fig, ax = plt.subplots(figsize=(3, 3)) From 4f57495fe1a1039491ce7ffd17039ee31da0abfd Mon Sep 17 00:00:00 2001 From: Abitamim Bharmal Date: Thu, 15 Dec 2022 23:44:37 -0500 Subject: [PATCH 04/14] Fixed linting --- lib/matplotlib/tests/test_arrow_patches.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/tests/test_arrow_patches.py b/lib/matplotlib/tests/test_arrow_patches.py index ae9e2ca5f429..86209fc26c8e 100644 --- a/lib/matplotlib/tests/test_arrow_patches.py +++ b/lib/matplotlib/tests/test_arrow_patches.py @@ -48,6 +48,7 @@ def test_boxarrow(): transform=fig.transFigure, bbox=dict(boxstyle=stylename, fc="w", ec="k")) + @image_comparison(['roadsign_test_image.png']) def temp_test_boxarrow(): @@ -64,10 +65,11 @@ def temp_test_boxarrow(): for i, stylename in enumerate(sorted(styles)): if stylename in ("larrow", "rarrow", "darrow"): fig.text(0.5, ((n - i) * spacing - 0.5)/figheight, stylename, - ha="center", - size=fontsize, - transform=fig.transFigure, - bbox=dict(boxstyle=stylename+",head_width=1", fc="w", ec="k")) + ha="center", + size=fontsize, + transform=fig.transFigure, + bbox=dict(boxstyle=stylename+",head_width=1", fc="w", + ec="k")) def __prepare_fancyarrow_dpi_cor_test(): From 5c3fa60cfc4ae434aed4a5d6ed7754a445afeabf Mon Sep 17 00:00:00 2001 From: RogueRebel33 Date: Thu, 17 Apr 2025 21:05:21 +0100 Subject: [PATCH 05/14] Add reversed arrow-head support to larrow/rarrow --- lib/matplotlib/patches.py | 123 +++++++++++++++++++++++++------------- 1 file changed, 83 insertions(+), 40 deletions(-) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 10558e7bdb27..57f1a4fef66c 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -2515,63 +2515,103 @@ def __init__(self, pad=0.3, head_width=1.5, head_angle=90.0): pad : float, default: 0.3 The amount of padding around the original box. head_width : float, default: 1.5 - The width of the arrow head versus the body. The minimum value - is 0.0 and the maximum value is 10.0. Any value smaller or - greater than this is contrained to the edge values. + TODO head_angle : float, default: 90.0 - The inside angle of the tip of the arrow. The minimum value is - 10.0 and the maximum value is 179.0. Any value smaller or - greater than this is contrained to the edge values. + The angle subtended by the tip of the arrow, in degrees. TODO """ self.pad = pad - if head_width > 10: - self.head_width = 10 - elif head_width < 0: - self.head_width = 0 + + if head_width < 0: + raise ValueError("The relative head width must be a positive number.") else: self.head_width = head_width - if head_angle >= 180: - self.head_angle = 179 - elif head_angle < 10: - self.head_angle = 10 - else: - self.head_angle = head_angle + # Set arrow-head angle to within [0, 360 deg) + self.head_angle = np.mod(head_angle, 360.) def __call__(self, x0, y0, width, height, mutation_size): - # padding + + # scaled padding pad = mutation_size * self.pad - # width and height with padding added. + # add padding to width and height width, height = width + 2 * pad, height + 2 * pad - # boundary of the padded box + # boundary points of the padded box (arrow tail/body) x0, y0 = x0 - pad, y0 - pad, x1, y1 = x0 + width, y0 + height - + # width and half-width of arrow tail dx = (y1 - y0) / 2 dxx = dx / 2 + x0 = x0 + pad / 1.4 # adjust by ~sqrt(2) - # The width adjustment is the value that must be added or - # subtracted from y_0 and y_1 for the ends of the head. + # The width adjustment is the distance that must be subtracted from + # y0 and added to y1 to reach the non-tip vertices of the head. # The body width is 2dx. - # Subtracting 1 from the head_width gives what percentage of the - # body width is in the head, and there is .5x of that on each side. - # The .5 cancels out the 2dx for the body width. + # Subtracting 1 from the head width gives, in units of the body width, + # the total 'width' of arrow-head not within the body. width_adjustment = (self.head_width - 1) * dx - # The angle adjustment is the value that must be subtracted/added - # from x_0 or x_1 for the position of the tip. - # each half of the arrow head is a right angle triangle. Therefore, - # each half of the arrow head has the equation tan(head_angle/2)= - # (dx+width_adjustment)/(dxx+angle_adjustment). - angle_adjustment = ((dx + width_adjustment) / math.tan((self. - head_angle/2) * (math.pi/180))) - dxx - - return Path._create_closed( - [(x0 + dxx, y0), (x1, y0), (x1, y1), (x0 + dxx, y1), - (x0 + dxx, y1 + width_adjustment), (x0 - angle_adjustment, y0 - + dx), (x0 + dxx, y0 - width_adjustment), # arrow - (x0 + dxx, y0)]) + if self.head_angle <= 180: + # Non-reversed arrow head (<---) + + # The angle adjustment is the tip-to-body length of the arrow head. + # Each half of the arrow head is a right-angled triangle. Therefore, + # each half of the arrow head has, by trigonometry, tan(head_angle/2)= + # (dx+width_adjustment)/(dxx+angle_adjustment). + angle_adjustment = ((dx + width_adjustment) / math.tan((self. + head_angle/2) * (math.pi/180))) - dxx + + return Path._create_closed( + [(x0 + dxx, y0), (x1, y0), (x1, y1), (x0 + dxx, y1), + (x0 + dxx, y1 + width_adjustment), (x0 - angle_adjustment, y0 + + dx), (x0 + dxx, y0 - width_adjustment), # arrow + (x0 + dxx, y0)]) + else: + # Reversed arrow head (>---) + + # Account for padding to left of text; this is no longer contained + # within the arrow head. + x0 = x0 - (2 * pad) + + if self.head_width <= 1: + # Reversed arrow head entirely enclosed by arrow body + + # draw rectangle + return Path._create_closed([ + (x0 + dxx, y0), + (x1, y0), + (x1, y1), + (x0 + dxx, y1), + (x0 + dxx, y0) + ]) + + + # Distance from the arrow head's outermost vertices to the points + # where the reversed arrow head intercepts the arrow body + tan_half_angle = np.tan(self.head_angle / 2) + intercept_adjustment = width_adjustment / np.abs(tan_half_angle) + + if intercept_adjustment >= width: + # If the arrow body lies entirely within the arrow head + + # draw triangle + return Path._create_closed([ + (x0 + dxx, y0 - width_adjustment), + (x0 + dxx + intercept_adjustment, y0 + dx), + (x0 + dxx, y1 + width_adjustment), + (x0 + dxx, y0 - width_adjustment) + ]) + else: + # draw reversed arrow + return Path._create_closed([ + (x0 + dxx, y0 - width_adjustment), + (x0 + dxx + intercept_adjustment, y0), + (x1, y0), + (x1, y1), + (x0 + dxx + intercept_adjustment, y1), + (x0 + dxx, y1 + width_adjustment), + (x0 + dxx, y0 - width_adjustment) + ]) @_register_style(_style_list) class RArrow(LArrow): @@ -2597,12 +2637,15 @@ def __init__(self, pad=0.3, head_width=1.5, head_angle=90.0): head_width : float, default: 1.5 The width of the arrow head versus the body. The minimum value is 0.0 and the maximum value is 10.0. Any value smaller or - greater than this is contrained to the edge values. + greater than this is constrained to the edge values. head_angle : float, default: 90.0 The inside angle of the tip of the arrow. The minimum value is 10.0 and the maximum value is 179.0. Any value smaller or - greater than this is contrained to the edge values. + greater than this is constrained to the edge values. """ + + # TODO + self.pad = pad if head_width > 10: self.head_width = 10 From 8065549de7e57c79bd8fb1f35af42465fa93a234 Mon Sep 17 00:00:00 2001 From: RogueRebel33 Date: Sun, 20 Apr 2025 18:48:50 +0100 Subject: [PATCH 06/14] Fix reversed arrow-head support for single arrows, handle edge cases --- lib/matplotlib/patches.py | 156 ++++++++++++++++++++++---------------- 1 file changed, 92 insertions(+), 64 deletions(-) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 57f1a4fef66c..1d3a75c26c0b 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -23,6 +23,10 @@ from .path import Path from ._enums import JoinStyle, CapStyle +# TEMPORARY: REMOVE LATER +import logging +_log = logging.getLogger(__name__) + @_docstring.interpd @_api.define_aliases({ @@ -2530,7 +2534,6 @@ def __init__(self, pad=0.3, head_width=1.5, head_angle=90.0): self.head_angle = np.mod(head_angle, 360.) def __call__(self, x0, y0, width, height, mutation_size): - # scaled padding pad = mutation_size * self.pad # add padding to width and height @@ -2538,7 +2541,7 @@ def __call__(self, x0, y0, width, height, mutation_size): # boundary points of the padded box (arrow tail/body) x0, y0 = x0 - pad, y0 - pad, x1, y1 = x0 + width, y0 + height - # width and half-width of arrow tail + # half-width and quarter-width of arrow tail dx = (y1 - y0) / 2 dxx = dx / 2 @@ -2551,7 +2554,10 @@ def __call__(self, x0, y0, width, height, mutation_size): # the total 'width' of arrow-head not within the body. width_adjustment = (self.head_width - 1) * dx - if self.head_angle <= 180: + if self.head_angle == 0: + # This would cause a division by zero ('infinitely long' arrow head) + raise ValueError("Head angle of zero is not valid.") + elif self.head_angle <= 180: # Non-reversed arrow head (<---) # The angle adjustment is the tip-to-body length of the arrow head. @@ -2569,46 +2575,70 @@ def __call__(self, x0, y0, width, height, mutation_size): else: # Reversed arrow head (>---) - # Account for padding to left of text; this is no longer contained - # within the arrow head. - x0 = x0 - (2 * pad) + # No arrow head available for enclosed text to spill over into; add + # padding to left of text + x0 = x0 - (1.4 * pad) + + # tan(1/2 * angle subtended by arrow tip) + tan_half_angle = -np.tan(self.head_angle * (math.pi / 360)) if self.head_width <= 1: - # Reversed arrow head entirely enclosed by arrow body + # Length of arrow head + angle_adjustment = (self.head_width * dx) / tan_half_angle + + if angle_adjustment < width: + # Rectangle; head entirely enclosed by body + + return Path._create_closed([ + (x0 + dxx, y0), + (x1, y0), + (x1, y1), + (x0 + dxx, y1), + (x0 + dxx, y0) + ]) + else: + # Head pokes out of back of body + + # The half-width of the connection of the arrow tip to the + # back of the arrow body + opposite_width_adjustment = (angle_adjustment - width) \ + * tan_half_angle + + #_log.error() + + return Path._create_closed([ + (x0 + dxx, y0), + (x1, y0), + (x1, y0 + dx - opposite_width_adjustment), + (x0 + dxx + angle_adjustment, y0 + dx), + (x1, y0 + dx + opposite_width_adjustment), + (x1, y1), + (x0 + dxx, y1), + (x0 + dxx, y0) + ]) + + # Distance from end of arrow to points where slanted parts of head + # intercept arrow body + intercept_adjustment = width_adjustment / tan_half_angle + + if intercept_adjustment < width: + # Some of arrow body is outside of head - # draw rectangle return Path._create_closed([ - (x0 + dxx, y0), + (x0 + dxx, y0 - width_adjustment), + (x0 + dxx + intercept_adjustment, y0), (x1, y0), (x1, y1), - (x0 + dxx, y1), - (x0 + dxx, y0) - ]) - - - # Distance from the arrow head's outermost vertices to the points - # where the reversed arrow head intercepts the arrow body - tan_half_angle = np.tan(self.head_angle / 2) - intercept_adjustment = width_adjustment / np.abs(tan_half_angle) - - if intercept_adjustment >= width: - # If the arrow body lies entirely within the arrow head - - # draw triangle - return Path._create_closed([ - (x0 + dxx, y0 - width_adjustment), - (x0 + dxx + intercept_adjustment, y0 + dx), + (x0 + dxx + intercept_adjustment, y1), (x0 + dxx, y1 + width_adjustment), (x0 + dxx, y0 - width_adjustment) ]) else: - # draw reversed arrow + # Draw triangle + return Path._create_closed([ (x0 + dxx, y0 - width_adjustment), - (x0 + dxx + intercept_adjustment, y0), - (x1, y0), - (x1, y1), - (x0 + dxx + intercept_adjustment, y1), + (x0 + dxx + intercept_adjustment, y0 + dx), (x0 + dxx, y1 + width_adjustment), (x0 + dxx, y0 - width_adjustment) ]) @@ -2643,55 +2673,48 @@ def __init__(self, pad=0.3, head_width=1.5, head_angle=90.0): 10.0 and the maximum value is 179.0. Any value smaller or greater than this is constrained to the edge values. """ - - # TODO - self.pad = pad - if head_width > 10: - self.head_width = 10 - elif head_width < 0: - self.head_width = 0 + + if head_width < 0: + raise ValueError("The relative head width must be a positive number.") else: self.head_width = head_width - if head_angle >= 180: - self.head_angle = 179 - elif head_angle < 10: - self.head_angle = 10 - else: - self.head_angle = head_angle + # Set arrow-head angle to within [0, 360 deg) + self.head_angle = np.mod(head_angle, 360.) def __call__(self, x0, y0, width, height, mutation_size): - # padding + # scaled padding pad = mutation_size * self.pad - # width and height with padding added. - # The width is padded by the arrows, so we don't need to pad it. - height = height + 2 * pad - # boundary of the padded box - x0, y0 = x0 - pad, y0 - pad + # add padding to width and height + width, height = width + 2 * pad, height + 2 * pad + # boundary points of the padded box (arrow tail/body) + x0, y0 = x0 - pad, y0 - pad, x1, y1 = x0 + width, y0 + height - + # width and half-width of arrow tail dx = (y1 - y0) / 2 dxx = dx / 2 + x0 = x0 + pad / 1.4 # adjust by ~sqrt(2) - # The width adjustment is the value that must be added or - # subtracted from y_0 and y_1 for the ends of the head. + # The width adjustment is the distance that must be subtracted from + # y0 and added to y1 to reach the non-tip vertices of the head. # The body width is 2dx. - # Subtracting 1 from the head_width gives what percentage of the - # body width is in the head, and there is .5x of that on each side. - # The .5 cancels out the 2dx for the body width. + # Subtracting 1 from the head width gives, in units of the body width, + # the total 'width' of arrow-head not within the body. width_adjustment = (self.head_width - 1) * dx - # The angle adjustment is the value that must be subtracted/added - # from x_0 or x_1 for the position of the tip. - # each half of the arrow head is a right angle triangle. Therefore, - # each half of the arrow head has the equation tan(head_angle/2)= - # (dx+width_adjustment)/(dxx+angle_adjustment). - angle_adjustment = ((dx + width_adjustment) / math.tan((self. - head_angle/2) * (math.pi/180))) - dxx + if self.head_angle <= 180: + # Non-reversed arrow heads (<--->) + + # The angle adjustment is the tip-to-body length of the arrow head. + # Each half of the arrow head is a right-angled triangle. Therefore, + # each half of the arrow head has, by trigonometry, tan(head_angle/2)= + # (dx+width_adjustment)/(dxx+angle_adjustment). + angle_adjustment = ((dx + width_adjustment) / math.tan((self. + head_angle/2) * (math.pi/180))) - dxx - return Path._create_closed([ + return Path._create_closed([ (x0 + dxx, y0), (x1, y0), # bot-segment (x1, y0 - width_adjustment), (x1 + angle_adjustment + dxx, y0 + dx), @@ -2701,6 +2724,11 @@ def __call__(self, x0, y0, width, height, mutation_size): (x0 - angle_adjustment, y0 + dx), (x0 + dxx, y0 - width_adjustment), # left-arrow (x0 + dxx, y0)]) + else: + # Reversed arrow heads (>---<) + + # TODO + raise NotImplementedError @_register_style(_style_list) class Round: From 0471e927e7c017635623abc45e6f80dffb688df3 Mon Sep 17 00:00:00 2001 From: RogueRebel33 Date: Sun, 20 Apr 2025 21:45:37 +0100 Subject: [PATCH 07/14] Add support for reversed arrow-heads and edge cases in DArrow, update type hinting for LArrow/RArrow/DArrow --- lib/matplotlib/patches.py | 120 +++++++++++++++++++++++++++++-------- lib/matplotlib/patches.pyi | 12 +++- 2 files changed, 105 insertions(+), 27 deletions(-) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 1d3a75c26c0b..f30841c79664 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -23,10 +23,6 @@ from .path import Path from ._enums import JoinStyle, CapStyle -# TEMPORARY: REMOVE LATER -import logging -_log = logging.getLogger(__name__) - @_docstring.interpd @_api.define_aliases({ @@ -2604,8 +2600,6 @@ def __call__(self, x0, y0, width, height, mutation_size): opposite_width_adjustment = (angle_adjustment - width) \ * tan_half_angle - #_log.error() - return Path._create_closed([ (x0 + dxx, y0), (x1, y0), @@ -2665,13 +2659,9 @@ def __init__(self, pad=0.3, head_width=1.5, head_angle=90.0): pad : float, default: 0.3 The amount of padding around the original box. head_width : float, default: 1.5 - The width of the arrow head versus the body. The minimum value - is 0.0 and the maximum value is 10.0. Any value smaller or - greater than this is constrained to the edge values. + TODO head_angle : float, default: 90.0 - The inside angle of the tip of the arrow. The minimum value is - 10.0 and the maximum value is 179.0. Any value smaller or - greater than this is constrained to the edge values. + The angle subtended by the tip of the arrow, in degrees. TODO """ self.pad = pad @@ -2691,7 +2681,7 @@ def __call__(self, x0, y0, width, height, mutation_size): # boundary points of the padded box (arrow tail/body) x0, y0 = x0 - pad, y0 - pad, x1, y1 = x0 + width, y0 + height - # width and half-width of arrow tail + # half-width and quarter-width of arrow tail dx = (y1 - y0) / 2 dxx = dx / 2 @@ -2704,7 +2694,10 @@ def __call__(self, x0, y0, width, height, mutation_size): # the total 'width' of arrow-head not within the body. width_adjustment = (self.head_width - 1) * dx - if self.head_angle <= 180: + if self.head_angle == 0: + # This would cause a division by zero ('infinitely long' arrow head) + raise ValueError("Head angle of zero is not valid.") + elif self.head_angle <= 180: # Non-reversed arrow heads (<--->) # The angle adjustment is the tip-to-body length of the arrow head. @@ -2715,20 +2708,97 @@ def __call__(self, x0, y0, width, height, mutation_size): head_angle/2) * (math.pi/180))) - dxx return Path._create_closed([ - (x0 + dxx, y0), (x1, y0), # bot-segment - (x1, y0 - width_adjustment), - (x1 + angle_adjustment + dxx, y0 + dx), - (x1, y1 + width_adjustment), # right-arrow - (x1, y1), (x0 + dxx, y1), # top-segment - (x0 + dxx, y1 + width_adjustment), - (x0 - angle_adjustment, y0 + dx), - (x0 + dxx, y0 - width_adjustment), # left-arrow - (x0 + dxx, y0)]) + (x0 + dxx, y0), + (x1, y0), + (x1, y0 - width_adjustment), + (x1 + dxx + angle_adjustment, y0 + dx), + (x1, y1 + width_adjustment), + (x1, y1), + (x0 + dxx, y1), + (x0 + dxx, y1 + width_adjustment), + (x0 - angle_adjustment, y0 + dx), + (x0 + dxx, y0 - width_adjustment), + (x0 + dxx, y0) + ]) else: # Reversed arrow heads (>---<) - # TODO - raise NotImplementedError + # No arrow head available for enclosed text to spill over into; add + # padding to left of text + x0 = x0 - (1.4 * pad) + + # tan(1/2 * angle subtended by arrow tip) + tan_half_angle = -np.tan(self.head_angle * (math.pi / 360)) + + if self.head_width <= 1: + # Length of arrow head + angle_adjustment = (self.head_width * dx) / tan_half_angle + + if angle_adjustment < width: + # Rectangle; heads entirely enclosed by body + + return Path._create_closed([ + (x0 + dxx, y0), + (x1, y0), + (x1, y1), + (x0 + dxx, y1), + (x0 + dxx, y0) + ]) + else: + # Heads poke out of opposite ends of body + + # The half-width of the connection of the arrow tip to the + # back of the arrow body + opposite_width_adjustment = (angle_adjustment - width) \ + * tan_half_angle + + return Path._create_closed([ + (x0 + dxx, y0), + (x1, y0), + (x1, y0 + dx - opposite_width_adjustment), + (x0 + dxx + angle_adjustment, y0 + dx), + (x1, y0 + dx + opposite_width_adjustment), + (x1, y1), + (x0 + dxx, y1), + (x0 + dxx, y0 + dx + opposite_width_adjustment), + (x1 - angle_adjustment, y0 + dx), + (x0 + dxx, y0 + dx - opposite_width_adjustment), + (x0 + dxx, y0) + ]) + + # Distance from end of arrow to points where slanted parts of head + # intercept arrow body + intercept_adjustment = width_adjustment / tan_half_angle + + if (2 * intercept_adjustment) < width: + # Some of arrow body is outside of heads + + return Path._create_closed([ + (x0 + dxx, y0 - width_adjustment), + (x0 + dxx + intercept_adjustment, y0), + (x1 - intercept_adjustment, y0), + (x1, y0 - width_adjustment), + (x1, y1 + width_adjustment), + (x1 - intercept_adjustment, y1), + (x0 + dxx + intercept_adjustment, y1), + (x0 + dxx, y1 + width_adjustment), + (x0 + dxx, y0 - width_adjustment) + ]) + else: + # Draw overlapping arrow heads + + # y-offset inwards of central points + centre_offset = (width * tan_half_angle) / 2 + + return Path._create_closed([ + (x0 + dxx, y0 - width_adjustment), + ((x0 + x1 + dxx) / 2, y0 - width_adjustment + centre_offset), + (x1, y0 - width_adjustment), + (x1, y1 + width_adjustment), + ((x0 + x1 + dxx) / 2, y1 + width_adjustment - centre_offset), + (x0 + dxx, y1 + width_adjustment), + (x0 + dxx, y0 - width_adjustment) + ]) @_register_style(_style_list) class Round: diff --git a/lib/matplotlib/patches.pyi b/lib/matplotlib/patches.pyi index c95f20e35812..deff122a506e 100644 --- a/lib/matplotlib/patches.pyi +++ b/lib/matplotlib/patches.pyi @@ -378,7 +378,11 @@ class BoxStyle(_Style): class LArrow(BoxStyle): pad: float - def __init__(self, pad: float = ...) -> None: ... + head_width: float + head_angle: float + def __init__( + self, pad: float = ..., head_width: float = ..., head_angle: float = ... + ) -> None: ... def __call__( self, x0: float, @@ -400,7 +404,11 @@ class BoxStyle(_Style): class DArrow(BoxStyle): pad: float - def __init__(self, pad: float = ...) -> None: ... + head_width: float + head_angle: float + def __init__( + self, pad: float = ..., head_width: float = ..., head_angle: float = ... + ) -> None: ... def __call__( self, x0: float, From 212cbc93e425ffa398c09c8b8e0ae53f6d51918c Mon Sep 17 00:00:00 2001 From: RogueRebel33 Date: Tue, 22 Apr 2025 22:09:12 +0100 Subject: [PATCH 08/14] Update docstings, add what's new notes --- .../box_arrow_size_controls.rst | 48 +++++++++++++++++++ lib/matplotlib/patches.py | 12 +++-- 2 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 doc/users/next_whats_new/box_arrow_size_controls.rst diff --git a/doc/users/next_whats_new/box_arrow_size_controls.rst b/doc/users/next_whats_new/box_arrow_size_controls.rst new file mode 100644 index 000000000000..6285b00df7cf --- /dev/null +++ b/doc/users/next_whats_new/box_arrow_size_controls.rst @@ -0,0 +1,48 @@ +Arrow-style sub-classes of ``BoxStyle`` support arrow head resizing +------------------------------------------------------------------- + +The new *head_width* and *head_angle* parameters to +`.BoxStyle.LArrow`, `.BoxStyle.RArrow` and `.BoxStyle.DArrow` allow for adjustment +of the size and aspect ratio of the arrow heads used. + +By using negative angles (or corresponding reflex angles) for *head_angle*, arrows +with 'backwards' heads may be created. + +.. plot:: + :include-source: false + :alt: A plot containing two arrow-shaped text boxes. One arrow has a pentagonal 'road-sign' shape, and the other an inverted arrow head on each end. + + import numpy as np + import matplotlib.pyplot as plt + + # Data for plotting; here, an intensity distribution for Fraunhofer diffraction + # from 7 thin slits + x_data = np.linspace(-3 * np.pi, 3 * np.pi, num=1000) + I_data = (np.sin(x_data * 3.5) / np.sin(x_data / 2)) ** 2 + + # Generate plot + + fig, ax = plt.subplots() + plt.plot(x_data, I_data) + + plt.xlim(-3 * np.pi, 3 * np.pi) + plt.ylim(0, 50) + + # + # Annotate with boxed text in arrows + # + + # head_width=1 gives 'road-sign' shape + t1 = ax.text(-1, 35, "Primary maximum", + ha="right", va="center", rotation=30, size=12, + bbox=dict(boxstyle="rarrow,pad=0.3,head_width=1,head_angle=60", + fc="lightblue", ec="steelblue", lw=2)) + + # Negative head_angle gives reversed arrow heads + t2 = ax.text(np.pi, 30, "Lower intensity", + ha="center", va="center", rotation=0, size=12, + bbox=dict(boxstyle="darrow,pad=0.3,head_width=2,head_angle=-80", + fc="lightblue", ec="steelblue", lw=2)) + + + plt.show() diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index f30841c79664..5a5f15021949 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -2515,9 +2515,11 @@ def __init__(self, pad=0.3, head_width=1.5, head_angle=90.0): pad : float, default: 0.3 The amount of padding around the original box. head_width : float, default: 1.5 - TODO + The width of the arrow head, relative to that of the arrow body. + Only positive values are accepted. head_angle : float, default: 90.0 - The angle subtended by the tip of the arrow, in degrees. TODO + The angle subtended by the tip of the arrow head, in degrees. + Only nonzero angles are accepted. """ self.pad = pad @@ -2659,9 +2661,11 @@ def __init__(self, pad=0.3, head_width=1.5, head_angle=90.0): pad : float, default: 0.3 The amount of padding around the original box. head_width : float, default: 1.5 - TODO + The width of each arrow head, relative to that of the arrow body. + Only positive values are accepted. head_angle : float, default: 90.0 - The angle subtended by the tip of the arrow, in degrees. TODO + The angle subtended by the tip of each arrow head, in degrees. + Only nonzero angles are accepted. """ self.pad = pad From 273a2fe36640f2229d85e574041c07170dc4898f Mon Sep 17 00:00:00 2001 From: RogueRebel33 Date: Mon, 28 Apr 2025 16:42:58 +0100 Subject: [PATCH 09/14] Fix typo in DArrow drawing code --- lib/matplotlib/patches.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 5a5f15021949..31a5a0426a77 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -2683,7 +2683,7 @@ def __call__(self, x0, y0, width, height, mutation_size): # add padding to width and height width, height = width + 2 * pad, height + 2 * pad # boundary points of the padded box (arrow tail/body) - x0, y0 = x0 - pad, y0 - pad, + x0, y0 = x0 - pad, y0 - pad x1, y1 = x0 + width, y0 + height # half-width and quarter-width of arrow tail dx = (y1 - y0) / 2 From bf2d06b5bdae9213388e660633693abb34e3aea1 Mon Sep 17 00:00:00 2001 From: RogueRebel33 Date: Mon, 28 Apr 2025 16:49:29 +0100 Subject: [PATCH 10/14] Fixed padding inconsistency: reverted breaking API change --- lib/matplotlib/patches.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 31a5a0426a77..e3bcff7d015e 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -2680,8 +2680,8 @@ def __init__(self, pad=0.3, head_width=1.5, head_angle=90.0): def __call__(self, x0, y0, width, height, mutation_size): # scaled padding pad = mutation_size * self.pad - # add padding to width and height - width, height = width + 2 * pad, height + 2 * pad + # add padding to height + height = height + 2 * pad # boundary points of the padded box (arrow tail/body) x0, y0 = x0 - pad, y0 - pad x1, y1 = x0 + width, y0 + height From 0ea2f5a6e6e0a7c6b91d562d3e622af9ee76cb6b Mon Sep 17 00:00:00 2001 From: RogueRebel33 Date: Mon, 28 Apr 2025 17:18:53 +0100 Subject: [PATCH 11/14] Fix what's new example --- doc/users/next_whats_new/box_arrow_size_controls.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/users/next_whats_new/box_arrow_size_controls.rst b/doc/users/next_whats_new/box_arrow_size_controls.rst index 6285b00df7cf..99acd10e1df7 100644 --- a/doc/users/next_whats_new/box_arrow_size_controls.rst +++ b/doc/users/next_whats_new/box_arrow_size_controls.rst @@ -34,13 +34,13 @@ with 'backwards' heads may be created. # head_width=1 gives 'road-sign' shape t1 = ax.text(-1, 35, "Primary maximum", - ha="right", va="center", rotation=30, size=12, + ha="right", va="center", rotation=30, size=10, bbox=dict(boxstyle="rarrow,pad=0.3,head_width=1,head_angle=60", fc="lightblue", ec="steelblue", lw=2)) # Negative head_angle gives reversed arrow heads - t2 = ax.text(np.pi, 30, "Lower intensity", - ha="center", va="center", rotation=0, size=12, + t2 = ax.text(np.pi, 30, " Lower intensity ", + ha="center", va="center", rotation=0, size=10, bbox=dict(boxstyle="darrow,pad=0.3,head_width=2,head_angle=-80", fc="lightblue", ec="steelblue", lw=2)) From d7fd40595c83af8dfb5c6e173e8f7e13ee7f70e9 Mon Sep 17 00:00:00 2001 From: RogueRebel33 Date: Wed, 30 Apr 2025 21:11:48 +0100 Subject: [PATCH 12/14] Create unit test for boxarrow head adjustment --- .../boxarrow_adjustment_test_image.png | Bin 0 -> 47953 bytes .../roadsign_test_image.png | Bin 10660 -> 0 bytes lib/matplotlib/tests/test_arrow_patches.py | 31 ++++++++++-------- 3 files changed, 18 insertions(+), 13 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_arrow_patches/boxarrow_adjustment_test_image.png delete mode 100644 lib/matplotlib/tests/baseline_images/test_arrow_patches/roadsign_test_image.png diff --git a/lib/matplotlib/tests/baseline_images/test_arrow_patches/boxarrow_adjustment_test_image.png b/lib/matplotlib/tests/baseline_images/test_arrow_patches/boxarrow_adjustment_test_image.png new file mode 100644 index 0000000000000000000000000000000000000000..f14d77eb36b2cb6d3da30219d976227f6acedd50 GIT binary patch literal 47953 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%0AJg#&_?k8rN{& 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

v9Lz@` z&d0M!CFnXfhiX|_ne5D|{L3iai(l_`KJM?oLAewgyE1TjrVRr{d6Rik!&#Bqb<5v7 zx*=8B*9W7@!KM_%qXS>Ng7Jv@3j0nzsV$%@1t^H<>nfNZ68BEMfA+^`8N}r$P|mqG zZcK#aaYM=fYE(>H`F|ycfGx9DMSnCw0GcU43B`57(%>Q{qs+tGPV?Psw_`y6wFht0@T>X5W>mB zZ3&6~`JS=&>}7HwHz|4vp!(vyC*=9F(P0nnkbRT6IEdkz%{Z7+$KhgweI}qZf+Z!~ zyLXRE2-=~h=9RRx19)(X_dX*Kl>uK@i;T06?qXQQr3!bD{ryuXOyEcCu&hl%wqOkB zeWX4kBf|jrVyhZkJ}Nc2hnYG+o&=OmoDCGV^;W@tp}UlnZs5Hw`tW+!(%L?`vR#w9 zx7Y}~lIS3bR8h__8-z@47LZBmf;wIRodWKnf{}*o_LxISs7-T$gcN3#I&$0F&3uuojkbMUmeM`O^b8@s5KSrHgQ{@Ak<- z2GrfZUr;C;O1jiz#GEvN45)^Ns^jD1UdUkG;7NyUnoRbf6A(I0CXA9URM>Ge?OxX- zH(Jb;WIlihBAy&Lbt4;TGx9DDVisYt8Jf#X9UMs_b5V|C43mQQZ4581Z4dr?T9FJW z^6rLCutH(ao*WW`n=35hB8UrMh=zhdSQDxO&4-4fjkDkM?a*KFUItnU#L4J0L5oOC z1Lu$R6m19y2#~~@uHu%a!;@+uE_jeuBSa#rfEjw!&q#FF92kq{ig*i-X8C#+iRGEB}5-Ho?ioW#{t@fYVE; z!v`jcQJqra#K(vBI*Y>26b*?JADs`0HLKOI(iVY6oe30%etk$z()YdC0Ph1yY1MzZZdSi*@GLV5h;Nlczzsyg=I z@UIJ^!LbYo#Z_bF79x0pil~0eN`rN-yA`dUc zN^6aU>ChvaJ-2P$3M(Xsl%~6PvtbjIkM6*^L>q`n)-_2iC``Xd(#vM%-nU=8FuW#h zr(597hnpY}03=c7)axDYj#c8zoMtFtSYbb;FWXyNBPfQbH;(AZv(rNwF7gJW?uJw% zV5VNX_6lHT*onKrf-7{2I$AbBW9?8PH*oBk^+aBTvD2m zDp}1X8FJgI!SZCVOGigX4tT(eqSAU@V5cofy5w4WU9TR5F%^LU*)U4CuGtXM zge^me)=~LiuSHA+>;!?*du{$|7xCP>U0J*~22aM_45TtWJ+I84sKSWG43jHm~ z9ovP4BjBBBgEz9%K70An=$6FMyqh--A(=bETI+R<`S+E8Ifvr;l$>UHM}BWL-5DWT zlziaH=%-4Dqb*`2MiF!1yE+T}T#$Dkb|Vq@PF_oJ8q7Ht z%c^fyHjTi?S1%gKvM|Niz7X(ZdKE}_) zB+Cv0II(#D#4BR-@xB|IW5ns6vDjLmj%ewT>zfnyZSewTkfzC8JY#9e=RMhLvSS`v zy_wTd9PZO~KiBWXamMRhGRx0ifbp7v23h)Zv~EJt(#=E*ojaneY-U%H^QmhBOu6f= zm0UhNJV&q`fYHla2K?m)Je!3G^F%wkbLS2TXnq(T7E1pz?s9JU$*`lNBP9g8JZ5A` z_kmG)DRf*68siOQ*g53wOloY+M@Kdb3Aq8>5dCza;qOv|aqN@y9!q_^I12&NMg*Fk z>^%JV4+b3RHO~X8p)TI+W;x)364ZpQdJz}`u}rJUIT$u19YsSyc^kfG)Ul*qxI*`* zFAZhbsq^~-v%1#^5X=ORLM&Ch3XlpwiCES(8JZB|pK>9?NjI?tDNdi+V=*4p2Jtha zCi^Pqt`|PEvo8@@V#hl?aIQ~*jso=T%Y8LEx0i}Ay*uLl6jg+OhA<^Hw(FA#d)XASA>dhF?<^N+7+CLV_!rdj3rQP3=0O{gWM8sM){Y}Chwy`#&cw#$`1sZn4M@Xx2L}m<4mG%b}htSi=jZv z6TBQr_u+9WO5HZm=dH&48=&6g9L^&dD#o-Z!ttk=c)sK*lIh3b&4l|MP zScs2*WRoazIz$ZwS4DCY(}T1#DV;gh_mu(`rgeX_S~`^1duYUyu1u$TtI+HXLyvj^ z#tDp3j9QMqgfg)6b}^3NO&nhqCMLEGb~t`7(KVy;XFYykA&8D{u0k~#w86B~r{Q6B zpcEiHb)R)kV2I<@l5`DqU>m3g{+;HmRYE!-hF0;$MVu|_!jKwz<7SE%e4V)82QBG% zIXG_~xmy?X+s{Q_>kG`LafEa^GPW(w8jyC2%j{H&n7G&jba%+Y;`+ku96ZG6&OKFd zJV7iI5#cNNh^`yW+1lUVKaSB*O={WucW`6$;k^cbes;Pzp!Q;RsISG*3sEH08?U^` zgy_aYU`?WTU@DEg4hsxi3sWt48^;dUzq0`c;f%tKCU3d|fhYVA;ESG8`}fZhL7pMQ zy9H4RFgp z+$ZlPEsI$u+`7At{f0_#IzkPgG~Z`t*uOZFxPG?}!mh&sZP%Mkz@@Mvf#7!oX77^CUA^8vM&Lcs(XNk5?#=s*cT+=~b>Gc=u?m~oAU zp!(rnr*hZQf%m--k!VQ%7;|Ritq1?-Ev_U@0r1u9nm%CoOb~R5cH!H_S9qJ2^}`Sv zy9cmoNU{>Y1@^X8`OFDi^zf@wqV}ve_kw?_W0Xtc-EEyE{g_{MH6yfnG3Aco}Tp^H>TMSTro`t zb|Lv1Y{}A~k5-1f945z|oMI5j$%N{dYiWQ1X#Y)x89;ea$G&1*Fo`)HST2^{!jdCY zAS7nntB$&x7~E;Ld-pJSK36Y&@8M#RyeVS`A}mBiN4KvGcC1lE)T9Z;X=<>+N>~+* zxn*fH0*5VU*Yw0kMz*aCEWyO$FpS0&m0)GGHe+x5-{vyzXN?5NDxbw5q8x zMy<$;^Q2^`Klo7|ho@UG{{8fmPXXL$R(>5P=yo~ ztEruv6%;C;PLGWLT4P|)xnZ#b@988LNy5Vr62cy&<-EaEpE*DrW&sYJT*wwZagI9L7uYVW=OdhXx<|EC!_jnHW)5y{Akj5H)9R4NJCtBf;*5>lch5y@(6my9x# zRh(vNi0rI}B!!IlUJvK%d%1l6gwGG3^KyB=-tYJ8q@K^m<35h#whlH>6I!oKPKPXQ zha^W-1L1+!+7(Q}>;s~tXdC=xv)hMj+1V-gn$M;T?Y`+(yKe2BS`!pZ=qO&HnEWT> zh~_0gqECz2QjzvFtZ}Ig+_R@1u&Vp7Z|_8rlKQms#T(GPx3jZ#blokz$KQPEmy(jw zzBA0WF;(%JjQZa|O{(4=UP%Vqj0FvqI^p4dK24Gk3_wy}Gk zeh+qVo8a!#Dv_sWI~Tqajm*Pz*TKTJU_-{U)?Hm)K_TIF`0(M=hnpw_W5nko04eys z<>R~YZ7_BRQI&~r1Yj3-|6MKG{AB6d>$!;*%n;P ztOhT>t}qC>)g8onBm2H{=cK((BWpS+HOgyxX2nwq4Rx>$bSe#zx{51Ps7d~(-~;I4 z7OvDem}0U2IP^=c&AK{e@Zu4&qohQ@f$5AtTegbG6^Kc#f@PmeUxgIU{p~LbW)n_X zWV$o_l8+sxoH)+Cd7@#r%lgVO*Z6WLHhf*-JX&&Rhz3!4H`vUfpybi1Ug#Cq-(0I2 zzo}5(Iyb422`lGR`}EFj&2=zI0!FY4YOe=C#98T{I{L2UoVg-6%r3yb{(CxT36TcDiFtUNcyU;?_Ry? z{w!rRc|u}irvcLbe7r{s<(M-lj)d)j@e~mKz>uX-vPVx@>z}-Q`SN0ixq-LeP)X=g z1Hs{Y=LYO}9X=;%g;nzOM`xX*&MsO=fy#^5T6gzWf=%K_P_Y-Fic6?6;=dAKpEyQV z2|u16W|r(ZY08xCRA-G_s_ld{x_IXYG4}=aK)#C8$K3qksBPbC!I$@sMEEM2QBmEv zhE*P#Yd%GPW9$k*mQ2^}x1PjrfOHn;TJ87pl-tdl5@I z7$f))*$Yw`-pAP|6=%m?Ik0Q$(~XIT)>+uJnZaEH;aZQQU%TrM)}EeQjTXPT`p#~J z{Ki|)dEL+t7pGt2F*~Lff16@Z zx0RcIE+mO#z-@iy>#0fUhoY!@uhRkKkdD8T~_*t>K3Y1a0YXEnm#*s!UJC{s&Fm2V%JZ(X;YPQpM@8 zJke2{(BRb?a>DHDA_S$_rrn{ig`t4|WR@>xA8@vG>R6L=2@%&8I*)(mDxsD>>432 z;su9?~74X7&dim%0>0)J(I2Mta4)3A(V0paV%oQv8^O$a`y*$76E#$T+a3ri5C^{(N|H;l#9ES^COfuHwAbgVn&D?Ssxj{7y(@ zuVY5rxu^TMtM~3remp7Phij!Hh=X1Fdgru&ETbz9?a!=y&Vt~uyH9`^>R%-e_;El> zX-`M_OKB!DO>}Zcjk8zSpmR)`yrHIKk6xw7F*sc2!QaWr^z7b9>r4cg|FdWjQj%13 zgt!_~UmoB;@a%V7cCS7+ke-bsvtpZGvg980EB~#TErLH0tA%!z%ZMEZ5 zBFivx&N<{lRj;#cF_NiL#YbR}>RYPJTQX4PFD!>DVcL3v{3W)+raiblg<; zd78i4VK2{8Z{M9J#kOLQNH~MBi+hYP|}-!eN)0eTDyupK;kmmN2g^shx3CUh&O=>k~=?>HHbuVz?{np=VwJGA?%WtS{DQSZ87 z5E5(a&aMV(QY{eneEM)~Fdf`WRBz%D=I7|T^`{1ykHn4D0jzzssE8v&#Jbrdt@HNv zo+|5tQujgat*L5m1N=!>)6uO2f}vUD6Ad8MBy?TQZu$C`2xrGO8Eij2^q#)5?eYZI z?Q(WLJkbCVnh4gYD=t^J(Dm>Uoe8g_81jS&if@;`@*r*2a4K}v1Ik`!SQ}8TbX(*4FIdn=skZ#8TZqyiEiG+*nAj;2Y=Za12k+h6fEq)<7Z8JE zY1OL&JmZ51YT{UL!-H)5t_!lA0E(3Ph_**nTKI8VZ4j#nXH9Z}{P7?^AD#w(f?pu} zoo7vrmijca-DDhs!mtp#EcpXzZYy|tqQd&Subl^cGkT19tbVTE7p_YEI^kpznGc`i zYHsdH+iX^(?RCDjXt!bC=d*N2RfacU18o;65PLlC^PdaimMAbp!NrHTA%PIf7lj0& zEs*3yV&^V%O(zGvcx#}V^cN=(3Mb09BbSxBx})+-|G4RQ-8zAr2^x~V$nDs&~w%xTIlxY9**PD1VbxZlGY&CUaw8rEGpFptTYMbVN3OaU^!Ot zHh(&T7Gn}WxQ!#){5kAwuHbIiiB?vPEp&s(r_`rMM!Z2*EO#NPhZ3^5eAu{5VxA@u zTm$ltbV*O3P|TalhsEDpkC3}n+qPT5?Ly91?eg-pnSh>_W_lYmB1k~AY3St7kxg5) zFy(h2UsGx&kV(;s$-SBTa!Zc>+@|33{6D3MIqa&b!)5nEkDI;hu&FW z^R~FylPcjQ%STKCS2nLsSRq0va*^blt^V^>mR_cfkm&}0@bKrqf5le3EeSy^0Dr$^4(y*0N`hpKe#nsVyDpVvfXF5rS#<|KHA zssyd5o22uiL0iubr~;T;a$$IO=IXZQl2|mC@|TmE5@zXz;cl-OBC;huzPIqD%ZI%= zx4z^`LO+s8h0T;k2S`i^yrLC>4suOH@Ou;_PP=yfy6NM)uKm^AjypC*%)}dE)P^55 zP$cw`{9%Ask$;AvebL~r_5&0&WA^cXC8y9X5E|*vhUBW~!YlIrxS(g^K5<4I9@<s(x{;>-YbMrWpaoxMF5%3?j>tMixl(|=M1uYct~EcI!Ri-0Fy{INMKcT9qL zYgcRUUwp;S<`5U=jMp`ny2vqPlxu4Wm95zOAjKW~ z_TYzkaYd2q*{JMLUhI_laGVqrCmg&RO6zl-4p|a`C2bziF!4lroje0bj}}B0z-&?S zw8T}&O?Npzzby*EoJ%)`w4VP4NLlE<`i6rS-3iCf(Q)K70HsMs^!7kUVRuEdVeTI? zafWC#6eTQ|q7`OAsE?6>4~pCT`xhizDZk}d&}y~etG4oY06mdnnV4W#@n*}RYOr}hg z-&y*|(6`_y!oG0!1yYh!KZKfr{fT*8pbcfv>n6 z>yvDuB~PTGhcL?=in?nIlWA#p%ISUU?p@XAI(_>R#VWwoYE_8zN&czPr*U}i zR^)KVraj%~2(@P#mKI5s>xk8=^OAd;CT)`TnQiy-5@_pxgQ~KuagA38{MWA zN7sb@!3OIt95~SaJ3I9z1635eVa_&wyrQ&*U)izr9uVu=Nf96AI*WNsZt}QIXIvtM^+_%B9;ro<2)L03JPjXkliyEjWvis232>EFf@Il2#S{DFQ`G=+)B}L)ySd8j%RTI9@yPS(wI?ihi%?cqS}%L0=O%zDJKHo@dJj>*xd!7H0%a zi9GAyXU{^BOHQE}YWMr1OS!E^ZpBLma2-XLxf=j+y=v?+)<-?Auy9fnmb|tT9~Sxd zLFCbOySJDMI23VBQ1?V@Q>OVc zk%rkK>Aoq1g4CHjLw& zt}_mFX*&!;JX91av_%>k&aH>>a5j-h?1(^8Z(T&$mi+4l2NQU;n&`f8dT_&AVfGoa z43RIU6)kk+*Y9BqF9iasp@6djvT35gn{Iz{f$w^QD;XPq{QKm|5&JYpn?6oMtuK0$ zc6Odd+vUTP=`(e>(M<#qdAI@IHv(c1(eed%^={^P?1-CrFN zUXkV1gA|#n!4JT|I`VCXm2o{KhorE2G2TxROjV>BCK`mEBDLhnBNEebcHRl44Xf$5fE`)K$M z>W9274V1LgrYvMfc)*h{;iA-aQ(I29LO4sdjRM{OUfX+Np`nw3WuquyTPft20+<*< z<>dW#a6;s3XB(r4L;r&FMzQFof_P+w%Fv7D&oe@}K9&M{a$Geh8Rkw%P{OPIN7^R6 z@39Qk#&kQo{Mw4A^jonY*?Gtz9cxAvWg0~op-R^vcfVs@9|ud=G1&<_F8axlM7^DO z@v^q2rZ=#)IhAn?ZRQ{O5&G++qL@L^MqtmSpXem=(M|lPH;v=SCbnqEp@H)ov!(#8 z+ssN|zsF~M)Rxn%l=_Af_xHX3aA4S48mIb(eAUDgt4r!5Kb2Fwv^0Ko)&!bka_kQ- zx_1P;n9kmFfB#wbrLOxZucvZ%-ptLlNw^eN+?A(ODk zM0-nUBS)ubj}{r|sc^xin5Gy5J~w^9%;kw(h^UT>9BiVEH4XLW~)=mwbpc^J( zwa%lXNa04(9e27N6u9X?bvZWaM)J}1!#m(DA6(^v&g?u#x=LMPqDAu#fFW8#hU_B= zv)i%rLk0{G6(na)4EN-c_oq3~jxuCbSca!=otN>Qh7?U^I zbMXMnTf0fdeE!p;hmNe7iSe->BNH!loIYp&!Gjan(L)^bwfwuzXyC0hG)GN`FA~yP5IT6!pg`)=#QWKB zc*cq*hW<&HBrk|w{yxoJLe>0oZPrqIG@FEkT0Op-6Gy>NbYY#&MHK(yYT(NNxGv>N zeDiE&r1CBG=MvHg{}y-bKjS^ENZ| zv=Vyv>xZggCy3=j%07Ql{V{LE0!*{1g8i10>D#6hPx+gBH{(9MA!s88kBqO6W96d$ zh?Ka4jzW&BD9GdrG!59y&HE=Jp`-pWkw(Svlk#g>7ps8azZd)I{Cn-1m%;)X12o2! zL}!g{l2d=~!UezTj%fq0Y@pu|^*pO>ry>Vpy{U(3;&xS4)jj4tcCvlIIZ-6TFPkW+BHeg-0IBmN&pl*<+%i(re6&)Fnoo z1-hSxvrS6SBdhl6cfqCHl&ObYj3!*C5r2k0zB8LNNfYGx5LW8zyW*$tQzey@sKJC%W%nOW|`fuC`IV3aoFR1ZgW=~#0X%|@|t4+L)Dv|$c4 z+PB)Ee`hrg*Iiz;Pq7!~xNDgE2%^t!|S%CLwX=;v*YO{+J z94_vq6uljXhmNK)i3G_}@fb9AdV;a;!2O2~nQ`{EcGBZ1VmEjDuprzxBIld0E`krV z??*Al`&D;y+{H_I0gzp{Qy6djN{BlRQ1}^+Okqdpu z;7;uCGN#~Ef=Q`g?7P7j&`L1<#Q;9$BCA2r_?^oCR^3%3+==i|40;CtC(mgt$N z24c)K%l7x3ZcK)FW$;_4`YbCk8RaL~^zrYq^4q63#pk^+zInkD7_$q}tY;4TM{`44 zFv?iFmc};OFJVfePv=d;YXyj72*}eJ5i2{b;fIdO;tu#;!b#8MX8tgk9WbPeRRHb^=6JYn&H1T9QL>t$bU9!D@g=Up#!o|s^Wpcc7LFcRT!#c$R8d1=iKUu^^1D-ae#F@9g z^JsVcFJ&fNlu+DSOa-D<;QzBg`Wv?49v{W0Wxnh88-<0zRP*Dg>}-CS7eyw7Ng92| z7dk|PGj?|=7ADZk!j#?GxS3LH#Oz#)PUw_g;-Qp&IIZwU0mYq4*A?>-Tq6VT5&2uq z;}jQ!RXt+6h~IY*`#BShj$D~`*9MbjO#Yxxfh`-g`0KB}s(+DdF@#vZjzr|^F3B-; zzxcXZ|MS6sfb7-1)ZeTcF5aRAOP5Z6>u5@edhYDmeQsJRVoWvSv7i_=lcc=|&JD%f$5Dw;-&FDCG`ow!n6eAe0qKJKMG~P^|K|_5-pr4wdo42vKCmcZV7d*K{Y?H z3Ay1ko8yXI5t_@@F)usDrTjs$e$VfN{_5SE)7pDKH;e^Nq>6DgQy-6yP(t+0f zXJ_>NJGG0x+nRIlYQBDL7xwrYaKKbEGi4RkuNG#L7aX%YVf@!I8T()sHl-b;Y>2`q zyNPQkR?q|zkz~ap=90Nj_dA$-r97p)u}BDC zcC$}6ibpYO!hp(ckDKiE%a@jA6Rf#ddQ6!z1tZpru#j+=HY6!t2@D$9{F!bGlGd8050KpBpyIg@71Q^eRJbl_`mlL2S4 zzi%8GFti^pXdOF zi|DT#V7;8ebzPb%d3OX!*8As$LYQWDulc25L~K#KiOZJv-&2v65oA?c&klpep`T52b3j>U0FiO21=jjk5=f&I&u zH%=8<&Z0ITc{pKBfTs;J^*YiO$)Iy&^p0=b|4aCV6fpt5A-*W9aLezEC1_e2Dr9yO zb*JK2C;K6|^xW?gtBkWz;91K-c7gmzlo21!_E>HrvvS3jBxZ>h`N{G;QO3s>_xNku$*ccogeIIU0o5 z`fXwiOcgHA&qb6MJu~1Cj$7T(UipKyCBdKyp(x3%jIT2n%O@i909IOO9lq8;3 zdq$bz+Iele%n&^tC@RE;woxb^|4V^OAf;XEe9Q2Urg~k@0HB7dO z3=vh3x&{hIpNg2`+b^T<5nn_Qjk>~v)avz(UX%`v`{EZ6Alg+gBy6Z>BIrLIA5Sz9 zC$EegL4W*`^`8C2Hp0SsX$CXR8gc`9ZK<~|&}r+?V>iq83Xld$g$oXVoTR8pH0OD~ zL4F*f#dqgSd2T$K7<`Tr?%7*O*4D|5&e1RPm(0`eo2NZ2b9L%321#&iPM}Glqs|%M ze#EHHctq!dVssd^6_`JBe!_z}`_>Ixv2fFkgn7D2i|}9Na9LAGn7GF*iEnH))POZ z(1W7+%*7Rj99*15T8yb!J_FWj>Fa;@@FC>WuUpP|?y6A;HRpu`fE^?Utha^++BMG- zx;=)F>+bOPSFN;kJ-;#Gf?L>E!v(hboEtfyn5)*V?Voq|9uO;idoFNj*0>^hxL^tK zpL0JX4EhCAAQ_K)hz`RbwIjOP`kFs&RPcsN6K>v6#QiGMu{-V|azHgR*RdQ~D7D5R)^m;oOmAP1%QVBz{rxoot zJL3ok*TjvXu$sUxX6Jr{!5zr9*I79>Z1E>>Qr~WnnYp~hO**u+SfHUV%==aqlH$;j z550bIV%cIS?uE*4L>EAGVPcz0@6Hnl<|(dIMF~H`=0XJk+fvvN0YVjG+7+@e`ANpi zgYUL*d4zIsEG^FTrGGL(n!W~+87+!Kyv{QAK-lz>(?{7|r&fMIYB)h(6#}#Mewe1pt(_996**9J4{2 z%GxLDNp-3nBn5yVTXeHFjDvF{%fBP%4*kYt}aYKJK{X-J{ z#72q*E|vDU1etjhIuD=V8DVOn`;KH=cv~W!lS&$BpJwDfDAH~Hl(K=1=-KB5yed`O zqCEfzP`mLXx=f#vOY?NuMH<8fu5xh^P<-i!cGrAJ!N{dhisxhHL(MAR{ccc!L?NG1 zqV;8GH}v2blFW3m35T>_+^a{A96l8}MDc#URYF$QUA3UoSKUCjIk3d-y zs)Sf}MIIurthv{O9m4;Uiu&w?-b(UcHWIW`9Q=T{v?x1tR+*!B*{Fo#%j5}DyXbH# zrP^JY7`#^4ZPXx7+9hjTkv{FSdBGMg|21=?w&n zJa_*5jzvSNCcI5Pp?lwnArXIcaV6unt3-Fkfy zY}Tbsbzp2`W~x6RSg?q3W)F9Pi|m+UbBe_9t7mn$dPN=*FRWq-65pU_!w`bcOj`l~ z!hx+_?e347);`01c-o4mhZH!Wx=6eO(Zg|Vsyh&lxaP&>dcvjgdHf}}3xz~+aNYFa zy}wa>4>T8mUE2QH8Rh~4LxuTF)3d(V^6;Vt*;)ep2g zgBB89Jzm_+;QOsDA7!s%a|~=^<`50tzArG)n7pJ2VD~(#vQmD^QJ&t8v72pfe8=_6 zAz?T(E)9$Pq|N4EnC9GEh!xM!Qh|b1{>wjp;qdfW>_|z4wB$gA3?TS z`)&oZElDeMh~hZ3E^+v4xy7tsozZ5nvEjo+FFvSR2Z2LzL13VMdvG-o{J{WQaSOpH zxB(xonWtqt4FKH&y^b)U06^Mx9*+TF5^l!*vdBVn$k9c=w>FtAT49eX%$-llZDF4#yP;ZY?hkR}kHba9uX-~v$s zKnp|XJf6Vs@uZ&QM~-b)#=wnQt<1pN*A7awtSDXDD854jXgkszA+#8p! zXass|Ye$NhAT3Sz>ABUhxj!%p9zpsSUUliaSnGwe1u^pPFnAl0Jrfi{?vl7Dk$ za`xhV>G9^8G7IsCiHV5N1mNcrW#zh(gS+EiU*p8vBtqrz662_(WEid4b6bZ`eo^sb zO=J%N%m(60kfO$2pGl(o?daZ zr)s-)-7ztlY{iKdUl)yh;5uwVBQn-b7|iEEpnKkV-75u23^m4BjFXVg1A(TUO%}_b z`;@!CwtE@-iJQ!*6%#|^s+{yU{cO*-z|H2iyg~Smv&d@z&9#q(-A8-V*FJUps@?m} zTPNDrk)e2&Fm@@Gx;;*>2_ZFp38RM%(GXIkfwje)C>Nc*3;|$__$~eOr;@DeI#4lc zejmIEE23F>w$N9Sr`qKX7)s9;k3#jF=LL0MZagnlSE-XBgxqizI9%~osXY8`Er!0e6tXHUfd}$$>BMTZLIm2MeGuJ85VtJ@H zsl^7BX&{l9Jh5He#rrliHMW&$VXH8_GXs1sCJ)sN@BO#m03Rs(G@&g@&RJP?i*WF5 zlzrjsLWV_SC4@A;&LVm47Rq2&3Pa!^+p_GdKh`eks^r}QB(}N9R`y2xQ&ZILbUL_# zJvcefn~grhxGvE$^ZnWlbN%ojxf60rKf1rdU7#={ea0uhtTbmx`I==^@ah_A4xcIE z+HegK{}puh+e#Zm$J-IxM`Aigx9UNQhWAZ1OGL zbK+QKmY5iXvLGKf{sNd$(fPGM-)FflJ2c6(@u&&1)B3X!(3%66de}$+J zgCJt9X+?LeW=T*U$wkAgZeegY?>W`UX0=QWwlM+2=0}s)G0%F#JO=Pg{CSGoQWR@4an;>D{lkt#6Cu4Q zQe{{e%(tbKLm_xVEoo~d;D{%2uZS27^ zG66_huzdL>Hf*?*5}e@BHHL+6PFOWjgqLgBO;D70wHzIeatSm`1BA+K{CJ5eDnFlU z=1e{Esix*A4q#a3kUxhj#o!KK-}^30-#4$_6{*ax{KJ80aNk9+J`N!y+m)CwN}yk^ z1MatB8wnkgd?CVSypP?UxAMxmw&sagnfM1Ck=|HS(?EJ(&<)Akh%L{3IO89S0m+gH zM=o71A@v;%emZEdCzOZ(=6o5@V!^?9IG|Y&aV}FWjUYlD98SHnE?GpZE=hg)cpIZ({uBxt% z;-a03m9}|jz1=MC#PUG94$gcinV!mJq?neHY)ci@P_wD=!VD3 zSst8*#^%kN%bs7lv@3CL*^6;4V=QT05b+oaS|#EPYOpo4T2F1j$Mu&uv!|CfharZ_ z?q=!F$MhG*ozf_Wioj)-a-w2W&76+W7Fs39g!vo^% zW%lTH?R~GMcez{Q&@>C2L3x(q-B5)xtv9hQdr=603*NeYJI^Tky$!nfSBf00R$8M* z9gz|f2oT59*Xys!QTRayAtr1teHVB{Kik`8jjj)g!|Mjwt*+rt77YNw!qMwMgT)Vk zQDcZ*w?55SRRbyLK7RVdS%)R(i2d@Undi8%p6q5QgY_~_dSO}=(V%FbGPgBFo}SAG&qGvw^X^@L6zPQRoiMJT4wyvV^F_W<4{-wZiNF*3N0i#X1N$DbclQm?&LEEohqZ?%g{f>LhzisA>PM1`bh$ z^L0K(DNTLMYyB544+uj`SJ&oMw}?TQ)DGb@5G{gqm&r4yK4&xa8K$U#7ti4{nBz%G zMU}|WpX=D128w@57~vsp9rZ{~+2_yAu`vf17te#}_!G)4)im;~Zph?9@&h?A(UTkn z4!@7Y^xp>$YRQqWNQPNSF8m`hcU zYC9JgMKho)P~_bM1HDB108wNgXOX>R!`~ef)wl)VS(<1VgR1QC^GkDMB~+4A(}i)V z#1LSRJp6h%;m0h%t$-ycA5tx%f05apB3UA2%QoX-5rt5GbQ|k*K880!R=m`ku#7K5 zb@a%_RX&ajK>M(vUY_iiihC?E|BR)vINqyRdZS-8@ zL)S4RLV|q35HCYOrCBV!i&NV~rT|mizbr1cikY!-IsS=O5S*FE?M}>V#LMiFJ#o?` zZ>k!hP>$K8*_Gn1Rm|bC8ZdC6gnCqAE1ebGebc!hGfhJMUoiR8sMQ?OaR5x=vc{i2 zL8xRa6~sA5OIJCKVuDkwh1LKR_N`O^=xk!1KL{FIHtb?qH9fC{K2z^+QEwtnFpV3>lybpg}M$)rC7^~{SQv zQMWVp@fva$-B~OAv&NkLoDUY;TTkx*<-rnIYP7vcLFI@-$kPm$o|eR2VQ_gF6Ip!u zMKAiYtx8TSvK_+Zb0 z15HS%WpavH-8V;OqUkfESw@0Y*+dK-(a)yPLaQw_|5%nzH=)w&Gi9!>^$h^Ws|5wB zygiQV!0rQ3=dp+y0R3Z2_pNw_lG!|MBQIQC1E+)K#jcZE0x|qU)$L6LC3V^Z2bB!> z8N@gSz^3FU&uGWz6(6O-@MpzuIv2%dwnXO0t@-)+R*!8$s`*z}8OFdN{>REi!3kX& zbtgcENJ}~(I?aDRy`GS^dGf}qe&r9CI=WO4dTJNgMpKqi;VqZue>s?&g%bA_GJ4~o zZ7sV_hL({Emc^jqZQSkHj_B{tA=6Y;#6W=IjZ#mdcz{|3ygE*%knV3Eu&l4?1e)sT-+=gOS zq6iuqU1kBV`J(+1;0MQY>ye!r8C@RNbz?)m&adc`?5e60V{~VHF1X<%j6CZXq>JWO za>%rY>=@F&e+zyI)+tC#+Y4PbA{6u@^z|iGxk6uT z^5J~KHd9w?j_#wa-TH>DcdW8worcL!_vJ z<>F1&_5-)-*)22*t`1Ewn5yrOTz2jpA+D78rQ-viPuyDIyf?OzJH#UY;QB~ zm=B?XRhoFbH5iy9Gs4~7Wy%xWl~JpPhcq!r#v4}L1@ z=z(^8DCV_J7ET0k+YreADcT0+yxhaC$EH67gfGWkzO*sqA(?_R$FG5%nS1> zTVbfWh?=d>z$r48O49K`!pNA`=^rz4{l__Jzb_)m6LX-tc;ozgdDwV%?9`SmE^E`L z3GA~8heTTCn+(oaD7#&dYA>iH`Sl>fe*xSz=H@3dSVG2;C3zG+-zu3>aPFGVw#EHg z1+wMYs9Ao-L^ooC&abN!R7=z(R-1;}dU@4X{4al?m5NUj$`wg8UNdXIJwA{65S!w6 zL>0>~vt~WEs{EVQVF&t7zuC3Zo^Sn$_e9M8^bs#ADw@*?OJ+XSG20*CY2YM~j$~U- zGTWD7+v}$Iw@_B-xqj-w_hDF3-(%i5EK3~I-d%$~6T>4lV=Y z>I3t++K76|V1sU7k9I5ds1`CWv~=mB_m4zE8>8H=qUD$t*YC^uj$PX-B!r(jfN=^K zDuA9O@EZ_YRq3nsSTsA}osCr_zHa4_1`)l%aIW%~1HeW0m#1@&`Of9{w|xKf!dL$r zwx++YF#K4FatV99wcbB=r8OE_3ZKe1aQ=TLT5D@7b5Zdv$IhEKFR1*ITsT}a66{4= zZ(sfyUfH*cA5~1B!Y&V4pTKDKSmgYB1QY&!m(7?tb0-4CRx0QQQZp(dM&Cb-O0BK< zfm!fbh3mu;$KhmT^1or236C{?m(%jg+5mz(LCkVU{yz}1Ods)E*O*g4r`oPL14*gm zBu3g(-LU80xzu>Y-HjG*bzpgL70v<31QI@Wwc^B?yu;xNhfysz0F~UlIpN5_IBV@a zyLT(lv@=4OL`}1brsINMQiT5xMsiV`NlR6H%Nmqhg2`_Ej6-Cp?>uU&dJ|#n%)cnLu~1y*LVL-$$CWE9TkrMbb#J4Z~yem?u+4PjOrQAyu5&N zJ$lnIYi*S_Z5rV6;Q7tLS;KNnPAvyt>;&KRA4=vPotD@X5o8uT`Z{ViD!84Uho8*6 zWudd(#MszVuii4`->Tnv&3_wW~UP`D8imD`-FQOxHJ)Do3qdxHkLy+ z2l!w4?n7`ph7BkQ3XRuq?Z~9!nh{za?Gn{Um%sY#nZqZ8GD*V!`fP)`hK%9>T(c@a zl<>JDc#_LWhxy=;k~u;(n{nEHpY=ba-iE`CX+Ah>y}ai>suP-N>X@HW?Bon6<0B!5 zyN2_`{IJU4ySYEY6&?m88vu)VZr?uc;E2Z@TieiAZ1EX@6lze)s=7~Z{s}gRQ{T{^ z>8<~$&cbU<;Yb}E#eF6BnP9s7{{3;MQj4~zos9m4PU$pUl89qx zZ@+)U{Hd)P@=Vpcb$gjy5$E8C$D|X75fd!fi5y8;bds5cH_KY+k~DmPM3DBEi=MG$ zIw)mLB>Yrbwkcr_Z&!yh{f(gctHe4%xH4I9W50&h<+_Is9$dQoqNz=D3g~M{F0%|J znvizelNp!cAe+TbQ&{=rHY+HL6wgL0jrp7%&r2;f9zryps@rD>Cm%-Bw^9)u%7@gX zd5q1HS@Eqb&lL`0T!f*_+-X8xr8-i}rd)S~o?gj6E?x{AP z!0X9bn_cDvmF=3#?wY43Q5@80s$~HbfZJF`*gvATXB%Mf+JPmY*N5hku%<0M)VjIkSIo@Y(q=t{!57Od{e;FTAv1>|)v> zxem}kQU$%Dt5Q95ax+lN!uCrO+}%fU z`Xhdv{_^yJMa~xKLW{gCE877ipK$T|6)qAMd=#t=8<4A0$*7fNHl9&SQTF40+p$iS z${6$Rj`er=_~h0$L$(0cp8lo%R5fODJn8lxi9xcZ)1e2}o!hR&$+e5>ivXYSqGXqk zG%?O^7gK;uO#ju_zwCbTn>Sx=eyka_@q1gkEh9P^N+nL0s4xG#=Xjcn-|^*Ew@g$Ub9j3K1JXfoT;5)@V)Eo& zdi@Xyq-QQxJy_tzCIgLXkA&YbV9CPs^9{{&4SrR%6nU?VLui4bt9;dXeEYw+n3O>Fx6TlQuNCA|5Hr_{Yg+#h>s#;Z3swg)Q> z)1-QZOE_}FQiTo>iR4yPNbvl#;|H%ixYpTX-x%&_8MuT6HKczq_plNaBXx|Fe8qp= z3%>L*LBeW_AGZV+moPVM=4}HuxSn;PlcUwsI2Jl>%ejQ#>u z%H+x1SKBGbsJbFPzp38xyLp&x9Y*b~B5s=fEBC5o+wwyCoaj`D>CXp(#plNLtgLQO zGd+9uM69fRVz8?#6XlwqMc67uFF-#>b=iw>i)*a4xyzRAqz z6rr7muR40wKqs-Io>sp25IlXjl~yIs9{Gndl9m(4KGK@sc`8OY&$C-Zhd*UNsT zRhXHz2Krg+Hpr*W03O8U)+_&5IVf@5)YulHfs6Uo#&%;9!``!AB$aZvf8z-+4!JtAGTn=x;GB{>t?L9cr)gcJ z%`*h*qD>*Kq}#EwUHF|{ zpE=S?3VEQN;+18=?~cTM(564g^tGXnklDc_do?oRpw$tnjoQ=>>soLAS*1ke6$uk{ z4<`9cze}3y1Tfa-EO17brW;?1CX+q0-%kYfTw9pjX3tZZVPm)K(aA=@@!os)<~iN2 z>pE(ED;Ckb8w=ToOg%kn*7PJ{KH(h9ns0X>KjiNf*?Kv-Tr+PaYtUh8X6&IN+KyM^ z?5Rf_nwjd~vp4_pf^-1!lZ=wfemB|`yn{iOX*^klajePfRFi$IAM?fL(x&1r02x+N zb@a38O7gUMnqJa~iRa_LYY8cSY-}m97mL=l1+S%jYpC)P16xY#$7+KrU^*A@-*U^LvPZ|4Zoi!HFFDzZBL^eUsx7?q ztIDu;J2&^u31q3x`ET&~G<%Wd5yRK?+t^M-BVeOjMXF61w1jsaoifrDcvnsx z{t3MO?bIQL!;j(g6juXu>wc&BVFj-wtd~Bs|FJ3GAYv6dUrK73Ba^8T#ATnwzLO4s z!V*SF@#eAi$4P+Zau^_ZZ$(3v@Xv;%@8U5hkmT}{C!GOO`hN{vnU$3#!9{1iY5^Q3 zx`#5u9s|*390Y?7n!8`%jac$+)cCuA%F_c>9EQfB!v?dr}hjsgh2>j;6Is0&MCHh)u#cP50TnKwthg=;^#n z9~JPIe${S!bXGQfh{}+vg5ue4qiV`FBg{2_O8iSt{)aSD3~Q(U-6-+k`n%@+S~dJL z$A{i2mbUTMojZMrP%{A$dkuMk!G-oizlg9_mAaL)%zv)?lmb*KUgA+Hqd@;<)+R9_ zrJxS@=WIU=wY!UtTNAA#(I!*SnF`*>=@9r%q0V6}5@^P&xxp2L5O9@wuB_p;+rn@0 zsDyXo%GacQQ%<|#s5R?(ZpmTpFzK)e>=4=Z(Q93-fl$5Fl z2A8fbKPgK_iJno?WJnP{cjsMaeYdvAD%uTui{{Dd$M>;g$I9GXLle-x#+47UdN^B@ z{0mZOWU|n~eJHVu)F5MMYk-*|zqqjRJt+L8fQ7KPxX>kL_WItVy3{lLU3q{^!6MB{6-E-dX+~@xvbR0j6@UNf;r)Tz$MH~*WK?;r*B}fk^r*bo=u+o+-c4&)q zrfs`+}cXoRvpK^L6RcCHo56+hAEUoEU_7 zpE5fZSlWG4P24;RP*Y?^Sc%PmcO280$6(51ihh?JHf@!Q`D|1q1Gy|YAco2~k)K;R0ipF9o4~GvW-? z1S{v2=ft{-OxII>rBIoFqh z2l3o`a&wU$vIpu8$Q|q=`_>u9+D04QhE9$T!jAg6_zL%L5(2aqHfjn?14pu zf0$uo+D!H2ArRt2Ri8dZZmuhzErVdtBkdoR0l>f(&Rl6==gs#V!;K-f@k6+lvaVk@ zQ|rov9*)&WslJ*OoH*n&a&TgA1&8f`9RUHcbZmQqg9|$aZ2a|eI1ag7e(@6CyM0n% zL0i7!L$GYg`Ps+5k+1mrbmx<+m=7t@MnpoKS?NbBh)7yEU~fSYfi6v z$g4u$76WCxv_V3|ZeEw)R$5pqzsi9$So z7-hVL;45ov!0d%?oNwZhZ=t=QK=rw0zB*=9ED!Ollp%y*l1K2?>4u4kNe=hA>-b@P z+VNSgXJ(4=WP-FTU$*EpYu;RwzE`9WyZ9+82sN$GteAy0KN50GGJbsDd|W?%*i*n9H}XIW-6b{t8_~2?UW0=gOtj%`~XYi*1Q=_tUIKeFk%^ zD3PEpLkcw4Ha|=UgM^@Z_X^vduycm}gQs!=mZDaX%9KA7MVCU*zr;XI1&(r=rIA=n zQn?_)E+siz6r>+17aW^)7#*q+lJk|F!?O-3f3+;}<&{lEw8+GW-Nee8!#wdRONgc@ z?)DUoi?2vBpA1NM)Ll=FEhPLdvbZ}ROo^vQ_I z8AAsZ1KE)$)INn;G&i{wV@44F*tA#j4wZMP#Q`as8|5_*uQe1BgXOTKmg!Gre_{ZmS#h&IoZ>J`F1Nm>5ZyZ7(SDf~1b3cs^1TxPXMj6~I> za^Fw0Zj!nAnpuq#BcYV%2cj(**wfd`^Z)(F|838p^mn~$>%$fq=*MnQ@Xv&?lTD5p I&++{K0Q|^ZssI20 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_arrow_patches/roadsign_test_image.png b/lib/matplotlib/tests/baseline_images/test_arrow_patches/roadsign_test_image.png deleted file mode 100644 index d9cf3646b5857078f0df436313c15f3bd78a81fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10660 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 B6f^(; diff --git a/lib/matplotlib/tests/test_arrow_patches.py b/lib/matplotlib/tests/test_arrow_patches.py index 86209fc26c8e..530ffe87e7b1 100644 --- a/lib/matplotlib/tests/test_arrow_patches.py +++ b/lib/matplotlib/tests/test_arrow_patches.py @@ -49,27 +49,32 @@ def test_boxarrow(): bbox=dict(boxstyle=stylename, fc="w", ec="k")) -@image_comparison(['roadsign_test_image.png']) -def temp_test_boxarrow(): +@image_comparison(['boxarrow_adjustment_test_image.png']) +def test_boxarrow_adjustment(): styles = mpatches.BoxStyle.get_styles() - n = len(styles) - spacing = 1.2 + repetitions = 2 + spacing = 2.4 - figheight = (n * spacing + .5) + figheight = (3 * repetitions * spacing + .5) fig = plt.figure(figsize=(4 / 1.5, figheight / 1.5)) fontsize = 0.3 * 72 - for i, stylename in enumerate(sorted(styles)): - if stylename in ("larrow", "rarrow", "darrow"): - fig.text(0.5, ((n - i) * spacing - 0.5)/figheight, stylename, - ha="center", - size=fontsize, - transform=fig.transFigure, - bbox=dict(boxstyle=stylename+",head_width=1", fc="w", - ec="k")) + angle = -80 + angle_step = 120 / repetitions + for i in range(repetitions): + for j, stylename in enumerate(sorted(styles)): + if stylename in ("larrow", "rarrow", "darrow"): + fig.text(0.5, ((3 * repetitions - i - j) * spacing - 0.5)/figheight, + stylename, + ha="center", + size=fontsize, + transform=fig.transFigure, + rotation=angle, + bbox=dict(boxstyle=stylename+f",head_width={(i + j) / 2},head_angle={angle}", fc="w", ec="k")) + angle = angle + angle_step def __prepare_fancyarrow_dpi_cor_test(): From ff34b4bf419bc33f5833dd939b62fac895778b27 Mon Sep 17 00:00:00 2001 From: RogueRebel33 Date: Wed, 30 Apr 2025 21:37:56 +0100 Subject: [PATCH 13/14] Fixed linting --- lib/matplotlib/tests/test_arrow_patches.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/tests/test_arrow_patches.py b/lib/matplotlib/tests/test_arrow_patches.py index 530ffe87e7b1..781f78b21920 100644 --- a/lib/matplotlib/tests/test_arrow_patches.py +++ b/lib/matplotlib/tests/test_arrow_patches.py @@ -73,7 +73,9 @@ def test_boxarrow_adjustment(): size=fontsize, transform=fig.transFigure, rotation=angle, - bbox=dict(boxstyle=stylename+f",head_width={(i + j) / 2},head_angle={angle}", fc="w", ec="k")) + bbox=dict(boxstyle=stylename+\ + f",head_width={(i + j) / 2},head_angle={angle}", + fc="w", ec="k")) angle = angle + angle_step From d9b0b32113c6b7cd2728b07eade3b9e65bafc5da Mon Sep 17 00:00:00 2001 From: RogueRebel33 Date: Thu, 1 May 2025 12:35:19 +0100 Subject: [PATCH 14/14] Update new test to use mpl20 figure style --- .../boxarrow_adjustment_test_image.png | Bin 47953 -> 48010 bytes lib/matplotlib/tests/test_arrow_patches.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/tests/baseline_images/test_arrow_patches/boxarrow_adjustment_test_image.png b/lib/matplotlib/tests/baseline_images/test_arrow_patches/boxarrow_adjustment_test_image.png index f14d77eb36b2cb6d3da30219d976227f6acedd50..3b1d95ee9fe86413d157ed6775084f7b315d253d 100644 GIT binary patch literal 48010 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%0AJg#&_?k8rN{& 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

v9Lz@` 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 I&++{K0Q|^ZssI20 diff --git a/lib/matplotlib/tests/test_arrow_patches.py b/lib/matplotlib/tests/test_arrow_patches.py index 781f78b21920..3a917b42033a 100644 --- a/lib/matplotlib/tests/test_arrow_patches.py +++ b/lib/matplotlib/tests/test_arrow_patches.py @@ -49,7 +49,7 @@ def test_boxarrow(): bbox=dict(boxstyle=stylename, fc="w", ec="k")) -@image_comparison(['boxarrow_adjustment_test_image.png']) +@image_comparison(['boxarrow_adjustment_test_image.png'], style='mpl20') def test_boxarrow_adjustment(): styles = mpatches.BoxStyle.get_styles()