Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Heatmap of single-value matrix works on CairoMakie but not via AoG #590

Open
kapple19 opened this issue Jan 17, 2025 · 4 comments
Open

Heatmap of single-value matrix works on CairoMakie but not via AoG #590

kapple19 opened this issue Jan 17, 2025 · 4 comments

Comments

@kapple19
Copy link

kapple19 commented Jan 17, 2025

Bug description

AoG seems to try and create a range of values for the heatmap's colorbar ticks,
but if it's just one value then it errors creating a Colon range with step zero.

Heatmap is produced by CairoMakie without issue,
so the issues lies in AoG code.

get_minor_tickvalues needs a corner case to handle this?

Steps to reproduce

Heatmap of zeros by CairoMakie:

fig, axis, plot = heatmap(zeros(3, 2); colormap = :jet)
Colorbar(fig[1, 2], plot)
fig

Image

Heatmap of zeros by CairoMakie via AoG:

julia> pregrouped([1:3], [1:2], [zeros(3, 2)]) * visual(Heatmap) |> draw
ERROR: ArgumentError: range step cannot be zero

julia> pregrouped([1:3], [1:2], [ones(3, 2)]) * visual(Heatmap) |> draw
ERROR: ArgumentError: range step cannot be zero

Error reporting

ERROR: ArgumentError: range step cannot be zero
Stacktrace:
  [1] (::Colon)(start::Float64, step::Float64, stop::Float64)
    @ Base .\twiceprecision.jl:394
  [2] get_minor_tickvalues(i::IntervalsBetween, scale::Function, tickvalues::Vector{Float64}, vmin::Float64, vmax::Float64)
    @ Makie C:\Users\aaron\.julia\packages\Makie\Y3ABD\src\makielayout\lineaxis.jl:733
  [3] (::Makie.var"#1618#1632"{…})(tickvalues::Vector{…}, minorticks::IntervalsBetween)
    @ Makie C:\Users\aaron\.julia\packages\Makie\Y3ABD\src\makielayout\lineaxis.jl:443
  [4] invokelatest(::Any, ::Any, ::Vararg{Any}; kwargs::@Kwargs{})
    @ Base .\essentials.jl:1055
  [5] invokelatest(::Any, ::Any, ::Vararg{Any})
    @ Base .\essentials.jl:1052
  [6] (::Observables.OnAny)(value::Any)
    @ Observables C:\Users\aaron\.julia\packages\Observables\YdEbO\src\Observables.jl:420
  [7] #invokelatest#2
    @ .\essentials.jl:1055 [inlined]
  [8] invokelatest
    @ .\essentials.jl:1052 [inlined]
  [9] notify
    @ C:\Users\aaron\.julia\packages\Observables\YdEbO\src\Observables.jl:206 [inlined]
 [10] setindex!(observable::Observable, val::Any)
    @ Observables C:\Users\aaron\.julia\packages\Observables\YdEbO\src\Observables.jl:123
 [11] update_tickpos_string(closure_args::Tuple{…}, tickvalues_labels_unfiltered::Tuple{…}, reversed::Bool, scale::typeof(identity))
    @ Makie C:\Users\aaron\.julia\packages\Makie\Y3ABD\src\makielayout\lineaxis.jl:216
 [12] invokelatest(::Any, ::Any, ::Vararg{Any}; kwargs::@Kwargs{})
    @ Base .\essentials.jl:1055
 [13] invokelatest(::Any, ::Any, ::Vararg{Any})
    @ Base .\essentials.jl:1052
 [14] (::Observables.OnAny)(value::Any)
    @ Observables C:\Users\aaron\.julia\packages\Observables\YdEbO\src\Observables.jl:420
 [15] #invokelatest#2
    @ .\essentials.jl:1055 [inlined]
 [16] invokelatest
    @ .\essentials.jl:1052 [inlined]
 [17] notify
    @ C:\Users\aaron\.julia\packages\Observables\YdEbO\src\Observables.jl:206 [inlined]
 [18] setindex!(observable::Observable, val::Any)
    @ Observables C:\Users\aaron\.julia\packages\Observables\YdEbO\src\Observables.jl:123
 [19] (::Observables.MapCallback)(value::Any)
    @ Observables C:\Users\aaron\.julia\packages\Observables\YdEbO\src\Observables.jl:436
 [20] #invokelatest#2
    @ .\essentials.jl:1055 [inlined]
 [21] invokelatest
    @ .\essentials.jl:1052 [inlined]
 [22] notify
    @ C:\Users\aaron\.julia\packages\Observables\YdEbO\src\Observables.jl:206 [inlined]
 [23] Makie.LineAxis(parent::Scene, attrs::Attributes)
    @ Makie C:\Users\aaron\.julia\packages\Makie\Y3ABD\src\makielayout\lineaxis.jl:484
 [24] #LineAxis#1593
    @ C:\Users\aaron\.julia\packages\Makie\Y3ABD\src\makielayout\lineaxis.jl:8 [inlined]
 [25] initialize_block!(cb::Colorbar)
    @ Makie C:\Users\aaron\.julia\packages\Makie\Y3ABD\src\makielayout\blocks\colorbar.jl:364     
 [26] _block(T::Type{…}, fig_or_scene::Figure, args::Vector{…}, kwdict::Dict{…}, bbox::Nothing; kwdict_complete::Bool)
    @ Makie C:\Users\aaron\.julia\packages\Makie\Y3ABD\src\makielayout\blocks.jl:398
 [27] _block
    @ C:\Users\aaron\.julia\packages\Makie\Y3ABD\src\makielayout\blocks.jl:317 [inlined]
 [28] #_block#1442
    @ C:\Users\aaron\.julia\packages\Makie\Y3ABD\src\makielayout\blocks.jl:262 [inlined]
 [29] _block(::Type{…}, ::GridPosition; kwargs::@Kwargs{…})
    @ Makie C:\Users\aaron\.julia\packages\Makie\Y3ABD\src\makielayout\blocks.jl:256
 [30] _block
    @ C:\Users\aaron\.julia\packages\Makie\Y3ABD\src\makielayout\blocks.jl:249 [inlined]
 [31] #_#1440
    @ C:\Users\aaron\.julia\packages\Makie\Y3ABD\src\makielayout\blocks.jl:240 [inlined]
 [32] colorbar!(figpos::GridPosition, grid::AlgebraOfGraphics.FigureGrid; kwargs::@Kwargs{vertical::Bool})
    @ AlgebraOfGraphics C:\Users\aaron\.julia\packages\AlgebraOfGraphics\16fMO\src\guides\colorbar.jl:16
 [33] colorbar!
    @ C:\Users\aaron\.julia\packages\AlgebraOfGraphics\16fMO\src\guides\colorbar.jl:14 [inlined]  
 [34] #colorbar!#363
    @ C:\Users\aaron\.julia\packages\AlgebraOfGraphics\16fMO\src\guides\colorbar.jl:5 [inlined]   
 [35] colorbar!
    @ C:\Users\aaron\.julia\packages\AlgebraOfGraphics\16fMO\src\guides\colorbar.jl:1 [inlined]   
 [36] (::AlgebraOfGraphics.var"#381#386"{…})(f::Figure)
    @ AlgebraOfGraphics C:\Users\aaron\.julia\packages\AlgebraOfGraphics\16fMO\src\draw.jl:166    
 [37] update
    @ C:\Users\aaron\.julia\packages\AlgebraOfGraphics\16fMO\src\draw.jl:10 [inlined]
 [38] _draw(d::Layer, scales::AlgebraOfGraphics.Scales; axis::Dictionaries.Dictionary{…}, figure::Dictionaries.Dictionary{…}, facet::Dictionaries.Dictionary{…}, legend::Dictionaries.Dictionary{…}, colorbar::Dictionaries.Dictionary{…})
    @ AlgebraOfGraphics C:\Users\aaron\.julia\packages\AlgebraOfGraphics\16fMO\src\draw.jl:161    
 [39] _draw
    @ C:\Users\aaron\.julia\packages\AlgebraOfGraphics\16fMO\src\draw.jl:154 [inlined]
 [40] draw(d::Layer, scales::AlgebraOfGraphics.Scales; axis::@NamedTuple{}, figure::@NamedTuple{}, facet::@NamedTuple{}, legend::@NamedTuple{}, colorbar::@NamedTuple{}, palette::Nothing)
    @ AlgebraOfGraphics C:\Users\aaron\.julia\packages\AlgebraOfGraphics\16fMO\src\draw.jl:85     
 [41] draw
    @ C:\Users\aaron\.julia\packages\AlgebraOfGraphics\16fMO\src\draw.jl:75 [inlined]
 [42] draw(d::Layer)
    @ AlgebraOfGraphics C:\Users\aaron\.julia\packages\AlgebraOfGraphics\16fMO\src\draw.jl:75     
 [43] |>(x::Layer, f::typeof(draw))
    @ Base .\operators.jl:926
 [44] top-level scope
    @ REPL[9]:1

Version info

julia> versioninfo()
Julia Version 1.11.2
Commit 5e9a32e7af (2024-12-01 20:02 UTC)
Build Info:
  Official https://julialang.org/ release
Platform Info:
  OS: Windows (x86_64-w64-mingw32)
  CPU: 16 × 11th Gen Intel(R) Core(TM) i7-11850H @ 2.50GHz
  WORD_SIZE: 64
  LLVM: libLLVM-16.0.6 (ORCJIT, tigerlake)
Threads: 8 default, 0 interactive, 4 GC (on 16 virtual cores)
Environment:
  JULIA_EDITOR = code
  JULIA_NUM_THREADS = 8

(FixingRAM) pkg> st
Status `C:\Users\aaron\.julia\dev\OceanSonarProjects\proj\Janis\Dev\FixingRAM\Project.toml`
  [cbdf2221] AlgebraOfGraphics v0.8.14
⌃ [13f3f980] CairoMakie v0.12.18
  [0703355e] DimensionalData v0.29.6
  [0f8b85d8] JSON3 v1.14.1
  [92640e7d] JanisClient v0.2.0 `../../../../lib/JanisClient/`
Info Packages marked with ⌃ have new versions available and may be upgradable.

Before opening an issue

Makie had a recent breaking update that DimensionalData doesn't play with yet.

And an environment with CairoMakie 0.13.0 and AoG only produces MakieOrg/Makie.jl#4731.

@asinghvi17
Copy link
Member

DimensionalData should now be compatible with Makie v0.22.

@kapple19
Copy link
Author

kapple19 commented Feb 2, 2025

With

(jl_PuhZeS) pkg> st
Status `C:\Users\Aaron\AppData\Local\Temp\jl_PuhZeS\Project.toml`
  [cbdf2221] AlgebraOfGraphics v0.9.1
  [13f3f980] CairoMakie v0.13.1

(jl_PuhZeS) pkg> st -m Makie
Status `C:\Users\Aaron\AppData\Local\Temp\jl_PuhZeS\Manifest.toml`
  [ee78f7c6] Makie v0.22.1

the following

pregrouped([1:3], [1:2], [rand(3, 2)]) * visual(Heatmap) |> draw

works as usual but now

julia> pregrouped([1:3], [1:2], [zeros(3, 2)]) * visual(Heatmap) |> draw
ERROR: Invalid text boundingbox GeometryBasics.HyperRectangle{3, Float64}([109.0, NaN, 0.0], [7.783999919891357, 16.309999465942383, 0.0])

Full error:

julia> pregrouped([1:3], [1:2], [zeros(3, 2)]) * visual(Heatmap) |> draw
ERROR: Invalid text boundingbox GeometryBasics.HyperRectangle{3, Float64}([109.0, NaN, 0.0], [7.783999919891357, 16.309999465942383, 0.0])
Stacktrace:
  [1] error(s::String)
    @ Base .\error.jl:35
  [2] string_boundingbox
    @ C:\Users\Aaron\.julia\packages\Makie\Q6F2P\src\layouting\text_boundingbox.jl:64 [inlined]
  [3] (::Makie.var"#1053#1054")(layout::Makie.GlyphCollection, pos::Point{3, Float64}, rot::Quaternionf)
    @ Makie C:\Users\Aaron\.julia\packages\Makie\Q6F2P\src\layouting\text_boundingbox.jl:110
  [4] macro expansion
    @ C:\Users\Aaron\.julia\packages\Makie\Q6F2P\src\utilities\utilities.jl:213 [inlined]
  [5] broadcast_foreach(::Makie.var"#1053#1054", ::Vector{Makie.GlyphCollection}, ::Vector{Point{3, Float64}}, ::Quaternionf)
    @ Makie C:\Users\Aaron\.julia\packages\Makie\Q6F2P\src\utilities\utilities.jl:199
  [6] unchecked_boundingbox(layouts::Vector{Makie.GlyphCollection}, positions::Vector{Point{…}}, rotations::Quaternionf)
    @ Makie C:\Users\Aaron\.julia\packages\Makie\Q6F2P\src\layouting\text_boundingbox.jl:108
  [7] string_boundingbox(::Vector{Makie.GlyphCollection}, ::Vector{Point{3, Float64}}, ::Vararg{Any})
    @ Makie C:\Users\Aaron\.julia\packages\Makie\Q6F2P\src\layouting\text_boundingbox.jl:63
  [8] string_boundingbox(x::MakieCore.Text{Tuple{Vector{Makie.GlyphCollection}}})
    @ Makie C:\Users\Aaron\.julia\packages\Makie\Q6F2P\src\layouting\text_boundingbox.jl:59
  [9] string_boundingbox(plot::MakieCore.Text{Tuple{Vector{Point{3, Float64}}}})
    @ Makie C:\Users\Aaron\.julia\packages\Makie\Q6F2P\src\layouting\text_boundingbox.jl:26
 [10] string_boundingbox(plot::MakieCore.Text{Tuple{Vector{Tuple{Any, Point{2, Float32}}}}})
    @ Makie C:\Users\Aaron\.julia\packages\Makie\Q6F2P\src\layouting\text_boundingbox.jl:26
 [11] data_limits(plot::MakieCore.Text{Tuple{Vector{Tuple{Any, Point{2, Float32}}}}})
    @ Makie C:\Users\Aaron\.julia\packages\Makie\Q6F2P\src\layouting\data_limits.jl:80
 [12] boundingbox(plot::MakieCore.Text{Tuple{Vector{Tuple{Any, Point{2, Float32}}}}}, target_space::Symbol)
    @ Makie C:\Users\Aaron\.julia\packages\Makie\Q6F2P\src\layouting\text_boundingbox.jl:13
 [13] (::Makie.var"#1611#1625"{Observable{Tuple{}}, Observable{Any}})(::Vector{Tuple{Any, Point{…}}}, ::Vararg{Any})
    @ Makie C:\Users\Aaron\.julia\packages\Makie\Q6F2P\src\makielayout\lineaxis.jl:309
 [14] invokelatest(::Any, ::Any, ::Vararg{Any}; kwargs::@Kwargs{})
    @ Base .\essentials.jl:1055
 [15] invokelatest(::Any, ::Any, ::Vararg{Any})
    @ Base .\essentials.jl:1052
 [16] (::Observables.MapCallback)(value::Any)
    @ Observables C:\Users\Aaron\.julia\packages\Observables\YdEbO\src\Observables.jl:436
 [17] #invokelatest#2
    @ .\essentials.jl:1055 [inlined]
 [18] invokelatest
    @ .\essentials.jl:1052 [inlined]
 [19] notify(observable::Observables.AbstractObservable)
    @ Observables C:\Users\Aaron\.julia\packages\Observables\YdEbO\src\Observables.jl:206
 [20] Makie.LineAxis(parent::Scene, attrs::Attributes)
    @ Makie C:\Users\Aaron\.julia\packages\Makie\Q6F2P\src\makielayout\lineaxis.jl:512
 [21] #LineAxis#1595
    @ C:\Users\Aaron\.julia\packages\Makie\Q6F2P\src\makielayout\lineaxis.jl:8 [inlined]
 [22] initialize_block!(cb::Colorbar)
    @ Makie C:\Users\Aaron\.julia\packages\Makie\Q6F2P\src\makielayout\blocks\colorbar.jl:364
 [23] _block(T::Type{…}, fig_or_scene::Figure, args::Vector{…}, kwdict::Dict{…}, bbox::Nothing; kwdict_complete::Bool)
    @ Makie C:\Users\Aaron\.julia\packages\Makie\Q6F2P\src\makielayout\blocks.jl:398
 [24] _block
    @ C:\Users\Aaron\.julia\packages\Makie\Q6F2P\src\makielayout\blocks.jl:317 [inlined]
 [25] #_block#1444
    @ C:\Users\Aaron\.julia\packages\Makie\Q6F2P\src\makielayout\blocks.jl:262 [inlined]
 [26] _block(::Type{…}, ::GridPosition; kwargs::@Kwargs{})
    @ Makie C:\Users\Aaron\.julia\packages\Makie\Q6F2P\src\makielayout\blocks.jl:256
 [27] _block
    @ C:\Users\Aaron\.julia\packages\Makie\Q6F2P\src\makielayout\blocks.jl:249 [inlined]
 [28] #_#1442
    @ C:\Users\Aaron\.julia\packages\Makie\Q6F2P\src\makielayout\blocks.jl:240 [inlined]
 [29] colorbar!(figpos::GridPosition, grid::AlgebraOfGraphics.FigureGrid; kwargs::@Kwargs{vertical::Bool})
    @ AlgebraOfGraphics C:\Users\Aaron\.julia\packages\AlgebraOfGraphics\E0gIq\src\guides\colorbar.jl:16
 [30] colorbar!
    @ C:\Users\Aaron\.julia\packages\AlgebraOfGraphics\E0gIq\src\guides\colorbar.jl:14 [inlined]
 [31] #colorbar!#363
    @ C:\Users\Aaron\.julia\packages\AlgebraOfGraphics\E0gIq\src\guides\colorbar.jl:5 [inlined]
 [32] colorbar!
    @ C:\Users\Aaron\.julia\packages\AlgebraOfGraphics\E0gIq\src\guides\colorbar.jl:1 [inlined]
 [33] (::AlgebraOfGraphics.var"#383#390"{})(f::Figure)
    @ AlgebraOfGraphics C:\Users\Aaron\.julia\packages\AlgebraOfGraphics\E0gIq\src\draw.jl:182
 [34] update
    @ C:\Users\Aaron\.julia\packages\AlgebraOfGraphics\E0gIq\src\draw.jl:10 [inlined]
 [35] _draw(ae::Matrix{…}; axis::Dictionaries.Dictionary{…}, figure::Dictionaries.Dictionary{…}, facet::Dictionaries.Dictionary{…}, legend::Dictionaries.Dictionary{…}, colorbar::Dictionaries.Dictionary{…})
    @ AlgebraOfGraphics C:\Users\Aaron\.julia\packages\AlgebraOfGraphics\E0gIq\src\draw.jl:175
 [36] _draw(d::Layer, scales::AlgebraOfGraphics.Scales; axis::Dictionaries.Dictionary{…}, figure::Dictionaries.Dictionary{…}, facet::Dictionaries.Dictionary{…}, legend::Dictionaries.Dictionary{…}, colorbar::Dictionaries.Dictionary{…})
    @ AlgebraOfGraphics C:\Users\Aaron\.julia\packages\AlgebraOfGraphics\E0gIq\src\draw.jl:158
 [37] _draw
    @ C:\Users\Aaron\.julia\packages\AlgebraOfGraphics\E0gIq\src\draw.jl:154 [inlined]
 [38] draw(d::Layer, scales::AlgebraOfGraphics.Scales; axis::@NamedTuple{}, figure::@NamedTuple{}, facet::@NamedTuple{}, legend::@NamedTuple{}, colorbar::@NamedTuple{}, palette::Nothing)
    @ AlgebraOfGraphics C:\Users\Aaron\.julia\packages\AlgebraOfGraphics\E0gIq\src\draw.jl:85
 [39] draw
    @ C:\Users\Aaron\.julia\packages\AlgebraOfGraphics\E0gIq\src\draw.jl:75 [inlined]
 [40] draw(d::Layer)
    @ AlgebraOfGraphics C:\Users\Aaron\.julia\packages\AlgebraOfGraphics\E0gIq\src\draw.jl:75
 [41] |>(x::Layer, f::typeof(draw))
    @ Base .\operators.jl:926
 [42] top-level scope
    @ REPL[10]:1
Some type information was truncated. Use `show(err)` to see complete types.

@jkrumbiegel
Copy link
Member

Is this an AoG problem or can it be reproduced with just Makie primitives?

@kapple19
Copy link
Author

If I understand your question correctly, the same matrix is plottable in Makie but not in AoG, so it's an AoG issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants