From 9bd176d3b9d2533d0b41deac6d40f39436b09b8c Mon Sep 17 00:00:00 2001 From: Ruth Comer <10599679+rcomer@users.noreply.github.com> Date: Tue, 16 Jul 2024 20:31:43 +0100 Subject: [PATCH] FIX: make sticky edge tolerance relative to data range --- lib/matplotlib/axes/_base.py | 10 ++-------- .../test_axes/sticky_tolerance_cf.png | Bin 0 -> 6222 bytes lib/matplotlib/tests/test_axes.py | 10 ++++++++++ 3 files changed, 12 insertions(+), 8 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/sticky_tolerance_cf.png diff --git a/lib/matplotlib/axes/_base.py b/lib/matplotlib/axes/_base.py index 4606e5c01aec..a29583668a17 100644 --- a/lib/matplotlib/axes/_base.py +++ b/lib/matplotlib/axes/_base.py @@ -2962,22 +2962,16 @@ def handle_single_axis( # Prevent margin addition from crossing a sticky value. A small # tolerance must be added due to floating point issues with - # streamplot; it is defined relative to x0, x1, x1-x0 but has + # streamplot; it is defined relative to x1-x0 but has # no absolute term (e.g. "+1e-8") to avoid issues when working with # datasets where all values are tiny (less than 1e-8). - tol = 1e-5 * max(abs(x0), abs(x1), abs(x1 - x0)) + tol = 1e-5 * abs(x1 - x0) # Index of largest element < x0 + tol, if any. i0 = stickies.searchsorted(x0 + tol) - 1 x0bound = stickies[i0] if i0 != -1 else None - # Ensure the boundary acts only if the sticky is the extreme value - if x0bound is not None and x0bound > x0: - x0bound = None # Index of smallest element > x1 - tol, if any. i1 = stickies.searchsorted(x1 - tol) x1bound = stickies[i1] if i1 != len(stickies) else None - # Ensure the boundary acts only if the sticky is the extreme value - if x1bound is not None and x1bound < x1: - x1bound = None # Add the margin in figure space and then transform back, to handle # non-linear scales. diff --git a/lib/matplotlib/tests/baseline_images/test_axes/sticky_tolerance_cf.png b/lib/matplotlib/tests/baseline_images/test_axes/sticky_tolerance_cf.png new file mode 100644 index 0000000000000000000000000000000000000000..a2e185c2769d6de5ae19ee2154fc6097a9173a32 GIT binary patch literal 6222 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 13c181b68492..3791763f323f 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -701,6 +701,16 @@ def test_sticky_tolerance(): axs.flat[3].barh(y=1, width=width, left=-20000.1) +@image_comparison(['sticky_tolerance_cf.png'], remove_text=True, style="mpl20") +def test_sticky_tolerance_contourf(): + fig, ax = plt.subplots() + + x = y = [14496.71, 14496.75] + data = [[0, 1], [2, 3]] + + ax.contourf(x, y, data) + + def test_nargs_stem(): with pytest.raises(TypeError, match='0 were given'): # stem() takes 1-3 arguments.