rafaqz / DimensionalData.jl

Named dimensions and indexing for julia arrays and other data
https://rafaqz.github.io/DimensionalData.jl/stable/
MIT License
271 stars 38 forks source link

heatmap! broken for DimArray #546

Closed felixcremer closed 10 months ago

felixcremer commented 11 months ago

When I try to plot a heatmap of a DimArray into a preexisting axis I get the following error: The printing of the error also takes a very long time, because the signature print shows :Float64 for every element of the array which takes some time for larger arrays.


julia> ras = DimArray(rand(X(2),Y(2)))
2×2 DimArray{Float64,2} with dimensions: X, Y
 0.122372  0.278473
 0.932241  0.235439

julia> fig = Figure()

julia> ax = Axis(fig[1,1])
Axis with 0 plots:

julia> heatmap!(ax, ras)
ERROR: `Makie.convert_arguments` for the plot type Heatmap{NTuple{4, Float64}} and its conversion trait DiscreteSurface() was unsuccessful.

The signature that could not be converted was:
::Float64, ::Float64, ::Float64, ::Float64

Makie needs to convert all plot input arguments to types that can be consumed by the backends (typically Arrays with Float32 elements).
You can define a method for `Makie.convert_arguments` (a type recipe) for these types or their supertypes to make this set of arguments convertible (See http://docs.makie.org/stable/documentation/recipes/index.html).

Alternatively, you can define `Makie.convert_single_argument` for single arguments which have types that are unknown to Makie but which can be converted to known types and fed back to the conversion pipeline.

Stacktrace:
  [1] error(s::String)
    @ Base ./error.jl:35
  [2] convert_arguments(::Type{Heatmap{NTuple{4, Float64}}}, ::Float64, ::Vararg{Float64}; kw::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ Makie ~/.julia/packages/Makie/1hq9u/src/conversions.jl:17
  [3] convert_arguments(::Type{Heatmap{NTuple{4, Float64}}}, ::Float64, ::Float64, ::Float64, ::Float64)
    @ Makie ~/.julia/packages/Makie/1hq9u/src/conversions.jl:7
  [4] plot!(::Scene, ::Type{Heatmap}, ::Attributes, ::Float64, ::Vararg{Float64}; kw_attributes::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ Makie ~/.julia/packages/Makie/1hq9u/src/interfaces.jl:292
  [5] plot!(::Scene, ::Type{Heatmap}, ::Attributes, ::Float64, ::Float64, ::Float64, ::Vararg{Float64})
    @ Makie ~/.julia/packages/Makie/1hq9u/src/interfaces.jl:275
  [6] plot!(::Axis, ::Type{Heatmap}, ::Attributes, ::Float64, ::Vararg{Float64}; kw_attributes::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ Makie ~/.julia/packages/Makie/1hq9u/src/makielayout/blocks/axis.jl:788
  [7] plot!(::Axis, ::Type{Heatmap}, ::Attributes, ::Float64, ::Float64, ::Float64, ::Vararg{Float64})
    @ Makie ~/.julia/packages/Makie/1hq9u/src/makielayout/blocks/axis.jl:775
  [8] plot!(::Type{Heatmap}, ::Axis, ::Float64, ::Vararg{Float64}; kw_attributes::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ Makie ~/.julia/packages/Makie/1hq9u/src/makielayout/blocks/axis.jl:805
  [9] plot!(::Type{Heatmap}, ::Axis, ::Float64, ::Float64, ::Float64, ::Float64)
    @ Makie ~/.julia/packages/Makie/1hq9u/src/makielayout/blocks/axis.jl:803
 [10] plot!(::Type{Heatmap}, ::Float64, ::Vararg{Float64}; kw_attributes::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ Makie ~/.julia/packages/Makie/1hq9u/src/figureplotting.jl:69
 [11] plot!(::Type{Heatmap}, ::Float64, ::Float64, ::Float64, ::Float64)
    @ Makie ~/.julia/packages/Makie/1hq9u/src/figureplotting.jl:64
 [12] heatmap!(::Float64, ::Vararg{Float64}; attributes::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ MakieCore ~/.julia/packages/MakieCore/eLhyO/src/recipes.jl:39
 [13] heatmap!(::Float64, ::Float64, ::Float64, ::Vararg{Float64})
    @ MakieCore ~/.julia/packages/MakieCore/eLhyO/src/recipes.jl:38
 [14] #heatmap!#23
    @ ~/Documents/conferences/202310_Bozen_OEMC_GW23/dev/DimensionalData/ext/DimensionalDataMakie.jl:158 [inlined]
 [15] heatmap!(axis::Axis, A::DimArray{Float64, 2, Tuple{X{DimensionalData.Dimensions.LookupArrays.NoLookup{Base.OneTo{Int64}}}, Y{DimensionalData.Dimensions.LookupArrays.NoLookup{Base.OneTo{Int64}}}}, Tuple{}, Matrix{Float64}, DimensionalData.NoName, DimensionalData.Dimensions.LookupArrays.NoMetadata})
    @ DimensionalDataMakie ~/Documents/conferences/202310_Bozen_OEMC_GW23/dev/DimensionalData/ext/DimensionalDataMakie.jl:152
 [16] top-level scope
    @ REPL[81]:1

caused by: MethodError: no method matching convert_arguments(::Type{Heatmap{NTuple{4, Float64}}}, ::Float64, ::Float64, ::Float64, ::Float64)

Closest candidates are:
  convert_arguments(::Union{Type{Any}, Type{<:AbstractPlot}}, ::Any...; kw...)
   @ Makie ~/.julia/packages/Makie/1hq9u/src/conversions.jl:7
  convert_arguments(::Type{<:Combined{Makie.bracket}}, ::Real, ::Real, ::Real, ::Real)
   @ Makie ~/.julia/packages/Makie/1hq9u/src/basic_recipes/bracket.jl:35
  convert_arguments(::Type{<:Combined{Makie.errorbars}}, ::Any, ::Any, ::Any, ::Any)
   @ Makie ~/.julia/packages/Makie/1hq9u/src/basic_recipes/error_and_rangebars.jl:73
  ...

Stacktrace:
  [1] convert_arguments_individually(::Type{Heatmap{NTuple{4, Float64}}}, ::Float64, ::Vararg{Float64})
    @ Makie ~/.julia/packages/Makie/1hq9u/src/conversions.jl:47
  [2] convert_arguments(::Type{Heatmap{NTuple{4, Float64}}}, ::Float64, ::Vararg{Float64}; kw::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ Makie ~/.julia/packages/Makie/1hq9u/src/conversions.jl:14
  [3] convert_arguments(::Type{Heatmap{NTuple{4, Float64}}}, ::Float64, ::Float64, ::Float64, ::Float64)
    @ Makie ~/.julia/packages/Makie/1hq9u/src/conversions.jl:7
  [4] plot!(::Scene, ::Type{Heatmap}, ::Attributes, ::Float64, ::Vararg{Float64}; kw_attributes::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ Makie ~/.julia/packages/Makie/1hq9u/src/interfaces.jl:292
  [5] plot!(::Scene, ::Type{Heatmap}, ::Attributes, ::Float64, ::Float64, ::Float64, ::Vararg{Float64})
    @ Makie ~/.julia/packages/Makie/1hq9u/src/interfaces.jl:275
  [6] plot!(::Axis, ::Type{Heatmap}, ::Attributes, ::Float64, ::Vararg{Float64}; kw_attributes::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ Makie ~/.julia/packages/Makie/1hq9u/src/makielayout/blocks/axis.jl:788
  [7] plot!(::Axis, ::Type{Heatmap}, ::Attributes, ::Float64, ::Float64, ::Float64, ::Vararg{Float64})
    @ Makie ~/.julia/packages/Makie/1hq9u/src/makielayout/blocks/axis.jl:775
  [8] plot!(::Type{Heatmap}, ::Axis, ::Float64, ::Vararg{Float64}; kw_attributes::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ Makie ~/.julia/packages/Makie/1hq9u/src/makielayout/blocks/axis.jl:805
  [9] plot!(::Type{Heatmap}, ::Axis, ::Float64, ::Float64, ::Float64, ::Float64)
    @ Makie ~/.julia/packages/Makie/1hq9u/src/makielayout/blocks/axis.jl:803
 [10] plot!(::Type{Heatmap}, ::Float64, ::Vararg{Float64}; kw_attributes::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ Makie ~/.julia/packages/Makie/1hq9u/src/figureplotting.jl:69
 [11] plot!(::Type{Heatmap}, ::Float64, ::Float64, ::Float64, ::Float64)
    @ Makie ~/.julia/packages/Makie/1hq9u/src/figureplotting.jl:64
 [12] heatmap!(::Float64, ::Vararg{Float64}; attributes::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ MakieCore ~/.julia/packages/MakieCore/eLhyO/src/recipes.jl:39
 [13] heatmap!(::Float64, ::Float64, ::Float64, ::Vararg{Float64})
    @ MakieCore ~/.julia/packages/MakieCore/eLhyO/src/recipes.jl:38
 [14] #heatmap!#23
    @ ~/Documents/conferences/202310_Bozen_OEMC_GW23/dev/DimensionalData/ext/DimensionalDataMakie.jl:158 [inlined]
 [15] heatmap!(axis::Axis, A::DimArray{Float64, 2, Tuple{X{DimensionalData.Dimensions.LookupArrays.NoLookup{Base.OneTo{Int64}}}, Y{DimensionalData.Dimensions.LookupArrays.NoLookup{Base.OneTo{Int64}}}}, Tuple{}, Matrix{Float64}, DimensionalData.NoName, DimensionalData.Dimensions.LookupArrays.NoMetadata})
    @ DimensionalDataMakie ~/Documents/conferences/202310_Bozen_OEMC_GW23/dev/DimensionalData/ext/DimensionalDataMakie.jl:152
 [16] top-level scope
    @ REPL[81]:1

caused by: MethodError: no method matching convert_arguments(::DiscreteSurface, ::Float64, ::Float64, ::Float64, ::Float64)

Closest candidates are:
  convert_arguments(::Type{<:Combined{Makie.bracket}}, ::Real, ::Real, ::Real, ::Real)
   @ Makie ~/.julia/packages/Makie/1hq9u/src/basic_recipes/bracket.jl:35
  convert_arguments(::Type{<:Combined{Makie.errorbars}}, ::Any, ::Any, ::Any, ::Any)
   @ Makie ~/.julia/packages/Makie/1hq9u/src/basic_recipes/error_and_rangebars.jl:73
  convert_arguments(::Type{<:Arrows}, ::Any, ::Any, ::Any, ::Any)
   @ Makie ~/.julia/packages/Makie/1hq9u/src/basic_recipes/arrows.jl:109
  ...

Stacktrace:
  [1] convert_arguments(::Type{Heatmap{NTuple{4, Float64}}}, ::Float64, ::Vararg{Float64}; kw::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ Makie ~/.julia/packages/Makie/1hq9u/src/conversions.jl:10
  [2] convert_arguments(::Type{Heatmap{NTuple{4, Float64}}}, ::Float64, ::Float64, ::Float64, ::Float64)
    @ Makie ~/.julia/packages/Makie/1hq9u/src/conversions.jl:7
  [3] plot!(::Scene, ::Type{Heatmap}, ::Attributes, ::Float64, ::Vararg{Float64}; kw_attributes::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ Makie ~/.julia/packages/Makie/1hq9u/src/interfaces.jl:292
  [4] plot!(::Scene, ::Type{Heatmap}, ::Attributes, ::Float64, ::Float64, ::Float64, ::Vararg{Float64})
    @ Makie ~/.julia/packages/Makie/1hq9u/src/interfaces.jl:275
  [5] plot!(::Axis, ::Type{Heatmap}, ::Attributes, ::Float64, ::Vararg{Float64}; kw_attributes::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ Makie ~/.julia/packages/Makie/1hq9u/src/makielayout/blocks/axis.jl:788
  [6] plot!(::Axis, ::Type{Heatmap}, ::Attributes, ::Float64, ::Float64, ::Float64, ::Vararg{Float64})
    @ Makie ~/.julia/packages/Makie/1hq9u/src/makielayout/blocks/axis.jl:775
  [7] plot!(::Type{Heatmap}, ::Axis, ::Float64, ::Vararg{Float64}; kw_attributes::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ Makie ~/.julia/packages/Makie/1hq9u/src/makielayout/blocks/axis.jl:805
  [8] plot!(::Type{Heatmap}, ::Axis, ::Float64, ::Float64, ::Float64, ::Float64)
    @ Makie ~/.julia/packages/Makie/1hq9u/src/makielayout/blocks/axis.jl:803
  [9] plot!(::Type{Heatmap}, ::Float64, ::Vararg{Float64}; kw_attributes::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ Makie ~/.julia/packages/Makie/1hq9u/src/figureplotting.jl:69
 [10] plot!(::Type{Heatmap}, ::Float64, ::Float64, ::Float64, ::Float64)
    @ Makie ~/.julia/packages/Makie/1hq9u/src/figureplotting.jl:64
 [11] heatmap!(::Float64, ::Vararg{Float64}; attributes::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ MakieCore ~/.julia/packages/MakieCore/eLhyO/src/recipes.jl:39
 [12] heatmap!(::Float64, ::Float64, ::Float64, ::Vararg{Float64})
    @ MakieCore ~/.julia/packages/MakieCore/eLhyO/src/recipes.jl:38
 [13] #heatmap!#23
    @ ~/Documents/conferences/202310_Bozen_OEMC_GW23/dev/DimensionalData/ext/DimensionalDataMakie.jl:158 [inlined]
 [14] heatmap!(axis::Axis, A::DimArray{Float64, 2, Tuple{X{DimensionalData.Dimensions.LookupArrays.NoLookup{Base.OneTo{Int64}}}, Y{DimensionalData.Dimensions.LookupArrays.NoLookup{Base.OneTo{Int64}}}}, Tuple{}, Matrix{Float64}, DimensionalData.NoName, DimensionalData.Dimensions.LookupArrays.NoMetadata})
    @ DimensionalDataMakie ~/Documents/conferences/202310_Bozen_OEMC_GW23/dev/DimensionalData/ext/DimensionalDataMakie.jl:152
 [15] top-level scope
    @ REPL[81]:1
rafaqz commented 11 months ago

Oops I fixed another bug and made this one. Have a go fixing???

Something is being splatted that shouldnt be