From 13eb2eb5916f4cbc5dc25668e8c6c094b3ec9851 Mon Sep 17 00:00:00 2001 From: t-bltg Date: Sat, 23 Dec 2023 21:50:50 +0100 Subject: [PATCH 1/2] fix minorticks out of limits --- src/makielayout/lineaxis.jl | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/makielayout/lineaxis.jl b/src/makielayout/lineaxis.jl index 38ec8004042..7d585eb2698 100644 --- a/src/makielayout/lineaxis.jl +++ b/src/makielayout/lineaxis.jl @@ -187,6 +187,10 @@ function update_tick_obs(tick_obs, horizontal::Observable{Bool}, flipped::Observ return end +# if labels are given manually, it's possible that some of them are outside the displayed limits +# we only check approximately because otherwise because of floating point errors, ticks can be dismissed sometimes +is_valid_tick(tv, limits) = (limits[1] <= tv || limits[1] ≈ tv) && (tv <= limits[2] || tv ≈ limits[2]) + function update_tickpos_string(closure_args, tickvalues_labels_unfiltered, reversed::Bool, scale) tickstrings, tickpositions, tickvalues, pos_extents_horizontal, limits_obs = closure_args @@ -204,12 +208,7 @@ function update_tickpos_string(closure_args, tickvalues_labels_unfiltered, rever lim_o = limits[1] lim_w = limits[2] - limits[1] - # if labels are given manually, it's possible that some of them are outside the displayed limits - # we only check approximately because otherwise because of floating point errors, ticks can be dismissed sometimes - i_values_within_limits = findall(tickvalues_unfiltered) do tv - return (limits[1] <= tv || limits[1] ≈ tv) && - (tv <= limits[2] || tv ≈ limits[2]) - end + i_values_within_limits = findall(tv -> is_valid_tick(tv, limits), tickvalues_unfiltered) tickvalues[] = tickvalues_unfiltered[i_values_within_limits] @@ -231,7 +230,7 @@ function update_tickpos_string(closure_args, tickvalues_labels_unfiltered, rever return end -function update_minor_ticks(minortickpositions, limits::NTuple{2, Float32}, pos_extents_horizontal, minortickvalues, scale, reversed::Bool) +function update_minor_ticks(minortickpositions, limits::NTuple{2, Float32}, pos_extents_horizontal, minortickvalues_unfiltered, scale, reversed::Bool) position::Float32, extents_uncorrected::NTuple{2, Float32}, horizontal::Bool = pos_extents_horizontal extents = reversed ? reverse(extents_uncorrected) : extents_uncorrected @@ -239,6 +238,8 @@ function update_minor_ticks(minortickpositions, limits::NTuple{2, Float32}, pos_ px_o = extents[1] px_width = extents[2] - extents[1] + minortickvalues = filter(tv -> is_valid_tick(tv, limits), minortickvalues_unfiltered) + tickvalues_scaled = scale.(minortickvalues) tick_fractions = (tickvalues_scaled .- scale(limits[1])) ./ (scale(limits[2]) - scale(limits[1])) From 55b99f36c08059c25efbd55081946f4bde252d84 Mon Sep 17 00:00:00 2001 From: t-bltg Date: Sat, 23 Dec 2023 21:58:29 +0100 Subject: [PATCH 2/2] add regression test --- ReferenceTests/src/tests/examples2d.jl | 9 ++++++++- src/makielayout/lineaxis.jl | 6 +++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/ReferenceTests/src/tests/examples2d.jl b/ReferenceTests/src/tests/examples2d.jl index 8cc85e7e075..735be7bb507 100644 --- a/ReferenceTests/src/tests/examples2d.jl +++ b/ReferenceTests/src/tests/examples2d.jl @@ -1354,7 +1354,7 @@ function ppu_test_plot(resolution, px_per_unit, scalefactor) fig, ax, pl = scatter(1:4, markersize=100, color=1:4, figure=(; size=resolution), axis=(; titlesize=50, title="ppu: $px_per_unit, sf: $scalefactor")) DataInspector(ax) hidedecorations!(ax) - return fig + fig end @reference_test "px_per_unit and scalefactor" begin @@ -1373,3 +1373,10 @@ end st end end + +@reference_test "spurious minor tick (#3487)" begin + fig = Figure(size=(227, 170)) + ax = Axis(fig[1, 1]; yticks = 0:.2:1, yminorticksvisible = true) + ylims!(ax, 0, 1) + fig +end diff --git a/src/makielayout/lineaxis.jl b/src/makielayout/lineaxis.jl index 7d585eb2698..de5d3600d5b 100644 --- a/src/makielayout/lineaxis.jl +++ b/src/makielayout/lineaxis.jl @@ -189,7 +189,7 @@ end # if labels are given manually, it's possible that some of them are outside the displayed limits # we only check approximately because otherwise because of floating point errors, ticks can be dismissed sometimes -is_valid_tick(tv, limits) = (limits[1] <= tv || limits[1] ≈ tv) && (tv <= limits[2] || tv ≈ limits[2]) +is_within_limits(tv, limits) = (limits[1] ≤ tv || limits[1] ≈ tv) && (tv ≤ limits[2] || tv ≈ limits[2]) function update_tickpos_string(closure_args, tickvalues_labels_unfiltered, reversed::Bool, scale) @@ -208,7 +208,7 @@ function update_tickpos_string(closure_args, tickvalues_labels_unfiltered, rever lim_o = limits[1] lim_w = limits[2] - limits[1] - i_values_within_limits = findall(tv -> is_valid_tick(tv, limits), tickvalues_unfiltered) + i_values_within_limits = findall(tv -> is_within_limits(tv, limits), tickvalues_unfiltered) tickvalues[] = tickvalues_unfiltered[i_values_within_limits] @@ -238,7 +238,7 @@ function update_minor_ticks(minortickpositions, limits::NTuple{2, Float32}, pos_ px_o = extents[1] px_width = extents[2] - extents[1] - minortickvalues = filter(tv -> is_valid_tick(tv, limits), minortickvalues_unfiltered) + minortickvalues = filter(tv -> is_within_limits(tv, limits), minortickvalues_unfiltered) tickvalues_scaled = scale.(minortickvalues)