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

Add Makie recipes #528

Closed rafaqz closed 12 months ago

rafaqz commented 1 year ago

Adds a Makie.jl extension and support for most plot types with axis labels and ticks.

Seems a clean way to generate Makie plots with very little code:

heatmap(rand(Ti('a':'z'), Y(10)))
lines(rand(X(0.1:0.1:1.0); name="values"))
boxplot(rand(X(1:10), Y([:a, :b, :c])))

@lazarusA maybe you have some ideas for all the things I have missed?

@tomchor this also implements your dims=:a => X request for 2d and 3d plots.

Closes #524, closes #528 and closes #275

Also @JoshuaBillson this may be of interest with RemoteSensingToolbox for your Makie.jl recipes, and @asinghvi17 as you got all this started! I think most of Rasters.jl Makie recipes could move here so everyone can use it?

lazarusA commented 1 year ago

wow! this is so great. I will take a good look. Now, a lot my current code in YAXAarrays will be duplicated, but this is definitely cleaner 😄

tomchor commented 1 year ago

@rafaqz this is looking great!

@tomchor this also implements your dims=:a => X request for 2d and 3d plots.

Nice! :heart:

Let me know when this is ready for testing and I'll try some of my code on this branch.

rafaqz commented 1 year ago

@lazarusA and @tomchor if you want to try these out we may as well merge soon

tomchor commented 1 year ago

@lazarusA and @tomchor if you want to try these out we may as well merge soon

I'm getting an error like

ERROR: LoadError: Error in conversion pipeline. xs and ys should have size ni+1, nj+1. Found: xs: 85, ys: 256, ni: 85, nj: 256
Stacktrace:
  [1] error(s::String)
    @ Base ./error.jl:35
  [2] draw_atomic(scene::Scene, screen::CairoMakie.Screen{CairoMakie.IMAGE}, primitive::Union{Image, Heatmap})
    @ CairoMakie /glade/work/tomasc/.julia/packages/CairoMakie/58F4c/src/primitives.jl:671
  [3] draw_plot(scene::Scene, screen::CairoMakie.Screen{CairoMakie.IMAGE}, primitive::Heatmap{Tuple{Vector{Float32}, Vector{Float32}, Matrix{Float32}}})
  [4] cairo_draw(screen::CairoMakie.Screen{CairoMakie.IMAGE}, scene::Scene)
    @ CairoMakie /glade/work/tomasc/.julia/packages/CairoMakie/58F4c/src/infrastructure.jl:51
  [5] colorbuffer(screen::CairoMakie.Screen{CairoMakie.IMAGE})
    @ CairoMakie /glade/work/tomasc/.julia/packages/CairoMakie/58F4c/src/screen.jl:307
  [6] colorbuffer(screen::CairoMakie.Screen{CairoMakie.IMAGE}, format::Makie.ImageStorageFormat)
    @ Makie /glade/work/tomasc/.julia/packages/Makie/Xg6gx/src/display.jl:363
  [7] recordframe!(io::VideoStream)
    @ Makie /glade/work/tomasc/.julia/packages/Makie/Xg6gx/src/ffmpeg-util.jl:242
  [8] Record(func::var"#33#34", figlike::Figure, iter::StepRange{Int64, Int64}; kw_args::Base.Pairs{Symbol, Any, Tuple{Symbol, Symbol}, NamedTuple{(:format, :framerate), Tuple{SubString{String}, Int64}}})
    @ Makie /glade/work/tomasc/.julia/packages/Makie/Xg6gx/src/recording.jl:168
  [9] record(func::Function, figlike::Figure, path::String, iter::StepRange{Int64, Int64}; kw_args::Base.Pairs{Symbol, Int64, Tuple{Symbol}, NamedTuple{(:framerate,), Tuple{Int64}}})
    @ Makie /glade/work/tomasc/.julia/packages/Makie/Xg6gx/src/recording.jl:148
 [10] top-level scope
    @ /glade/scratch/tomasc/twake3/headland_simulations/plot_headland_video.jl:217

but tbh I haven't been able to pinpoint it to this change since I hadn't updated DD/Rasters/Makie in a little while (due to issues like https://github.com/rafaqz/Rasters.jl/issues/492).

Can you please exemplify how to plot DimArrays with non-default (i.e. not X, Y Z) dimension names? Did you end up going with Makie.heatmap(raster; dims=(X=:fX, Y=:fY))?

I it turns out this branch is the source of the error I'll make a MWE asap.

rafaqz commented 12 months ago

Ok there was a small bug in this, so checkout the branch again (its also been rebased sorry)

But this example should work:

A = DimArray(rand(10, 10), (:a, :b))
Makie.heatmap(A; dims=(:a => X, :b => Y))

It ended up making more sense to use Pairs than a namedtuple.

(this is in the heatmap etc docstings too, see if they make sense)

tomchor commented 12 months ago

I haven't tested my full plots, but a simple example revals:

julia> using DimensionalData, GLMakie

julia> A = DimArray(rand(4, 4), (:a, :b))
4×4 DimArray{Float64,2} with dimensions: Dim{:a}, Dim{:b}
 0.170095  0.938657  0.362559  0.275481
 0.273901  0.689077  0.618861  0.920637
 0.863314  0.834279  0.343351  0.196132
 0.645745  0.468384  0.66314   0.0274788

julia> heatmap(A) # Plots things appropriately

julia> heatmap(A, dims=(:b => :X))
ERROR: ArgumentError: Some dims were not found in object.
Stacktrace:
  [1] _extradimserror()
    @ DimensionalData.Dimensions ~/.julia/packages/DimensionalData/QypyH/src/Dimensions/primitives.jl:744
  [2] dimnum
    @ ~/.julia/packages/DimensionalData/QypyH/src/Dimensions/primitives.jl:204 [inlined]
  [3] permutedims
    @ ~/.julia/packages/DimensionalData/QypyH/src/array/methods.jl:205 [inlined]
  [4] _permute_xyz(A::DimArray{Float64, 2, Tuple{Dim{:a, DimensionalData.Dimensions.LookupArrays.NoLookup{Base.OneTo{Int64}}}, Dim{:b, DimensionalData.Dimensions.LookupArrays.NoLookup{Base.OneTo{Int64}}}}, Tuple{}, Matrix{Float64}, DimensionalData.NoName, DimensionalData.Dimensions.LookupArrays.NoMetadata}, replacements::Tuple{Dim{:b, X{Colon}}})
    @ DimensionalDataMakie ~/.julia/packages/DimensionalData/QypyH/ext/DimensionalDataMakie.jl:412
  [5] _permute_xyz(A::DimArray{Float64, 2, Tuple{Dim{:a, DimensionalData.Dimensions.LookupArrays.NoLookup{Base.OneTo{Int64}}}, Dim{:b, DimensionalData.Dimensions.LookupArrays.NoLookup{Base.OneTo{Int64}}}}, Tuple{}, Matrix{Float64}, DimensionalData.NoName, DimensionalData.Dimensions.LookupArrays.NoMetadata}, replacements::Tuple{Pair{Symbol, Symbol}})
    @ DimensionalDataMakie ~/.julia/packages/DimensionalData/QypyH/ext/DimensionalDataMakie.jl:405
  [6] _permute_xyz
    @ ~/.julia/packages/DimensionalData/QypyH/ext/DimensionalDataMakie.jl:404 [inlined]
  [7] _prepare_for_makie(A::DimArray{Float64, 2, Tuple{Dim{:a, DimensionalData.Dimensions.LookupArrays.NoLookup{Base.OneTo{Int64}}}, Dim{:b, DimensionalData.Dimensions.LookupArrays.NoLookup{Base.OneTo{Int64}}}}, Tuple{}, Matrix{Float64}, DimensionalData.NoName, DimensionalData.Dimensions.LookupArrays.NoMetadata}, replacements::Pair{Symbol, Symbol})
    @ DimensionalDataMakie ~/.julia/packages/DimensionalData/QypyH/ext/DimensionalDataMakie.jl:401
  [8] _surface2(A::DimArray{Float64, 2, Tuple{Dim{:a, DimensionalData.Dimensions.LookupArrays.NoLookup{Base.OneTo{Int64}}}, Dim{:b, DimensionalData.Dimensions.LookupArrays.NoLookup{Base.OneTo{Int64}}}}, Tuple{}, Matrix{Float64}, DimensionalData.NoName, DimensionalData.Dimensions.LookupArrays.NoMetadata}, attributes::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, dims::Pair{Symbol, Symbol})
    @ DimensionalDataMakie ~/.julia/packages/DimensionalData/QypyH/ext/DimensionalDataMakie.jl:150
  [9] heatmap(A::DimArray{Float64, 2, Tuple{Dim{:a, DimensionalData.Dimensions.LookupArrays.NoLookup{Base.OneTo{Int64}}}, Dim{:b, DimensionalData.Dimensions.LookupArrays.NoLookup{Base.OneTo{Int64}}}}, Tuple{}, Matrix{Float64}, DimensionalData.NoName, DimensionalData.Dimensions.LookupArrays.NoMetadata}; dims::Pair{Symbol, Symbol}, colorbarkw::NamedTuple{(), Tuple{}}, attributes::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ DimensionalDataMakie ~/.julia/packages/DimensionalData/QypyH/ext/DimensionalDataMakie.jl:130
 [10] top-level scope
    @ REPL[23]:1

I'd expect the previous command to work, since you can infer that :a => :Y just by elimination. In fact that's the example given in the current docstring: https://github.com/rafaqz/DimensionalData.jl/blob/83ca6ddabcdc55d9142d2e55c42dbd69f603e332/ext/DimensionalDataMakie.jl#L22-L26

Instead I have to manually write out both axes for this to work: heatmap(A, dims=(:b => :X, :a => :Y)). Is this by design?

tomchor commented 12 months ago

Another comment is that I've thought about it, and it still seems much simpler to me to take advantage of the notation already used by Makie (i.e. the method heatmap(x, y, values)) and make the UI something like:

heatmap(A, x=:b, y=:a)

instead of the current

heatmap(A, dims=(:b => :X, :a => :Y))

For me the main selling points are that it's shorter to write and it's more intuitive to Makie users since it an interface that's much closer to Makie's. (The same goes for the Plots interface.) It probably would make it easier to find the appropriate methods to since a quick call to methods(heatmap) would list the appropriate x and y keywords, instead of dims (which a user would need to read the docstring attentively to learn how to use).

Is there a specific reason why a dims kwarg was used instead of x and y?

rafaqz commented 12 months ago

Instead I have to manually write out both axes for this to work: heatmap(A, dims=(:b => :X, :a => :Y)). Is this by design?

No, it must have broken. I've just tested this:

julia> heatmap(A; dims=(:b => Y))

Which somehow works.

I don't have actual tests for this because Makie will kill our CI. But I might add a proper test suit to run locally to try to get more edge cases.

Is there a specific reason why a dims kwarg was used instead of x and y?

Bad syntax doesn't need a reason, its the natural state of code :sweat_smile:

But seriously my main reason not to use keywords like that is your example:

heatmap(x, y, values)

x and y are already argument names used in Makie documentation and having them as keywords seems a bit weird. But you may be right, it is a nice symetry - they specify which dimension lookups end up as those arguments.

dims looks more like a DimensionalData.jl thing. But youre right, the syntax sucks, and if you just want to specify one of the keywords:

heatmap(A, x=:a)

is pretty concise.

I 'll switch to x/y/z keywords, thanks for the feedback

rafaqz commented 12 months ago

Ok the bug is fixed and this should work:

heatmap(A; x=:a)
rafaqz commented 12 months ago

Ok here's a little test suit of the current state of things:

    using GLMakie, DimensionalData
    # 1d
    A1 = rand(X('a':'e'); name=:test)
    plot(A1)
    scatter(A1)
    lines(A1)
    scatterlines(A1)
    stairs(A1)
    stem(A1)
    barplot(A1)
    waterfall(A1)
    # 2d
    A2 = rand(X(10:10:100), Y(['a', 'b', 'c']))
    A2r = rand(Y(10:10:100), X(['a', 'b', 'c']))
    plot(A2)
    # Categorical wins: it's on x, even though its Y
    boxplot(A2)
    boxplot(A2r)
    violin(A2)
    rainclouds(A2)
    # Series also puts Categories in the legend no matter where they are
    series(A2)
    series(A2r)
    # x/y can be specified
    A2 = DimArray(rand(10, 10), (:a, :b); name=:stuff)
    plot(A2)
    contourf(A2; x=:a)
    heatmap(A2; y=:b)
    @test_throws ArgumentError plot(A2; y=:c)
    # 3d
    A3 = rand(X(7), Z(10), Y(5))
    volume(A3)
    A3 = DimArray(rand(10, 10, 5), (:a, :b, :c); name=:stuff)
    volume(A3)
    volumeslices(A3)
    # x/y/z can be specified
    A2 = DimArray(rand(10, 10, 7), (:a, :b, :c); name=:stuff)
    volume(A3; x=:c)
    volumeslices(A3; z=:a)

@lazarusA would be good to get feedback from you on these too

lazarusA commented 12 months ago

all of your previous tests work for me as well. And at the moment, I don't have other use cases that might be useful.

lazarusA commented 12 months ago

I would expect also this one to work (which is not currently):

dd = DimArray(rand(m,n), (:a,:b))
series(dd)

where the color will need to be color= resample_cmap(:colormap, m). Probably the same should be done for your current implementation.

lazarusA commented 12 months ago

and maybe similarly,

A2 = rand(X(10:10:100), Y(['a', 'b', 'c']))
A2

surface(A2)

note: I know too many use cases. We should add more in following PRs. Otherwise this could go on forever.

rafaqz commented 12 months ago

Ok surface and series work now, keep em coming

    using GLMakie
    # 1d
    A1 = rand(X('a':'e'); name=:test)
    plot(A1)
    scatter(A1)
    lines(A1)
    scatterlines(A1)
    stairs(A1)
    stem(A1)
    barplot(A1)
    waterfall(A1)
    # 2d
    A2 = rand(X(10:20:100), Y(['a', 'b', 'c']))
    A2r = rand(Y(10:20:100), X(['a', 'b', 'c']))
    plot(A2)
    # Categorical wins: it's on x, even though its Y
    boxplot(A2)
    boxplot(A2r)
    violin(A2)
    rainclouds(A2)
    surface(A2)
    # Series also puts Categories in the legend no matter where they are
    series(A2)
    series(A2r)
    series(A2r; labeldim=Y)
    @test_throws ArgumentError plot(A2; y=:c)
    # x/y can be specified
    A2ab = DimArray(rand(5, 6), (:a, :b); name=:stuff)
    plot(A2ab)
    contourf(A2ab; x=:a)
    heatmap(A2ab; y=:b)
    series(A2ab)
    boxplot(A2ab)
    violin(A2ab)
    rainclouds(A2ab)
    surface(A2ab)
    series(A2ab)
    series(A2ab; labeldim=:b)
    # 3d
    A3 = rand(X(7), Z(10), Y(5))
    volume(A3)
    volumeslices(A3)
    # x/y/z can be specified
    A3abc = DimArray(rand(10, 10, 7), (:a, :b, :c); name=:stuff)
    volume(A3abc; x=:c)
    volumeslices(A3; z=:a)
rafaqz commented 12 months ago

Hmm forgot the series colors. Whats the default colormap for series? It would be good if it worked as much as possible like Makie by default. (And why doesn't makie do the resampling automatically?)

lazarusA commented 12 months ago

it's something like :Set1_5 or something.... and no idea about the resampling, I always do it manually. The issue here is that there are too many options. Is a mix of lines and scatters.

@rafaqz you should resample the default theme's colormap for this, IMO.

rafaqz commented 12 months ago

Ok above 7 series its now resampling the default :Set1_5 theme

lazarusA commented 12 months ago

nice, I tested again, it works. I don't have more feedback at the moment. You maybe should merge. And any issues should be addressed on different PRs :D

lazarusA commented 12 months ago

ok. Well, maybe some last one. Just when things are under a million points, maybe.

a = YAXArray(rand(3,3,3)) |> DimArray
meshscatter(a; markersize=0.1)
rafaqz commented 12 months ago

You shouldn't need to convert to DimArray, YAXArray should plot now too ;)

lazarusA commented 12 months ago
δx = 1
δy = 1
δz = 1
pnts3d = [Point3f(i,j,k) for i in 1:3 for j in 1:3 for k in 1:3]

meshscatter(pnts3d; markersize=Vec3f(δx/2, δy/2, δz/2))

meshscatter(pnts3d;
    markersize= Vec3f(0.9δx, 0.9δy, 0.9δz),
    marker = Rect3f(Vec3f(-0.5), Vec3f(1))
    )

meshscatter(pnts3d;
    markersize= Vec3f(0.5δx, 0.5δy, 0.5δz),
    #marker = Sphere(Point3f(0), 1)
    )

this one is just a convenient function to plot data cubes. Which might be helpful to have.

lazarusA commented 12 months ago

You shouldn't need to convert to DimArray, YAXArray should plot now too ;)

Not really, for all cases I get errors like this one: (maybe more a yax issue ?)

using GLMakie, DimensionalData
using YAXArrays

a = YAXArray(rand(3,3)) #|> DimArray
heatmap(a)
ERROR: MethodError: no method matching getindex(::Tuple{X{DimensionalData.Dimensions.LookupArrays.Sampled{Int64, Base.OneTo{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Int64}, DimensionalData.Dimensions.LookupArrays.Points, DimensionalData.Dimensions.LookupArrays.NoMetadata}}, Y{DimensionalData.Dimensions.LookupArrays.Sampled{Int64, Base.OneTo{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Int64}, DimensionalData.Dimensions.LookupArrays.Points, DimensionalData.Dimensions.LookupArrays.NoMetadata}}}, ::X{Colon})

Closest candidates are:
  getindex(::Tuple, ::Int64)
   @ Base tuple.jl:29
  getindex(::Tuple, ::Integer)
   @ Base tuple.jl:30
  getindex(::Tuple, ::Colon)
   @ Base tuple.jl:33
  ...

Stacktrace:
 [1] getindex
   @ ./tuple.jl:31 [inlined]
 [2] permutedims(c::YAXArray{Float64, 2, Matrix{Float64}, Tuple{X{DimensionalData.Dimensions.LookupArrays.Sampled{Int64, Base.OneTo{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Int64}, DimensionalData.Dimensions.LookupArrays.Points, DimensionalData.Dimensions.LookupArrays.NoMetadata}}, Y{DimensionalData.Dimensions.LookupArrays.Sampled{Int64, Base.OneTo{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Int64}, DimensionalData.Dimensions.LookupArrays.Points, DimensionalData.Dimensions.LookupArrays.NoMetadata}}}}, p::Tuple{X{Colon}, Y{Colon}})
   @ YAXArrays.Cubes ~/.julia/packages/YAXArrays/X0zci/src/Cubes/Cubes.jl:176
 [3] _permute_xyz(A::YAXArray{Float64, 2, Matrix{Float64}, Tuple{Dim{:Dim_1, DimensionalData.Dimensions.LookupArrays.Sampled{Int64, Base.OneTo{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Int64}, DimensionalData.Dimensions.LookupArrays.Points, DimensionalData.Dimensions.LookupArrays.NoMetadata}}, Dim{:Dim_2, DimensionalData.Dimensions.LookupArrays.Sampled{Int64, Base.OneTo{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Int64}, DimensionalData.Dimensions.LookupArrays.Points, DimensionalData.Dimensions.LookupArrays.NoMetadata}}}}, replacements::Tuple{})
   @ DimensionalDataMakie ~/Desktop/tmp/DimensionalData.jl/ext/DimensionalDataMakie.jl:442
 [4] _prepare_for_makie(A::YAXArray{Float64, 2, Matrix{Float64}, Tuple{Dim{:Dim_1, DimensionalData.Dimensions.LookupArrays.Sampled{Int64, Base.OneTo{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Int64}, DimensionalData.Dimensions.LookupArrays.Points, DimensionalData.Dimensions.LookupArrays.NoMetadata}}, Dim{:Dim_2, DimensionalData.Dimensions.LookupArrays.Sampled{Int64, Base.OneTo{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Int64}, DimensionalData.Dimensions.LookupArrays.Points, DimensionalData.Dimensions.LookupArrays.NoMetadata}}}}, replacements::Tuple{})
   @ DimensionalDataMakie ~/Desktop/tmp/DimensionalData.jl/ext/DimensionalDataMakie.jl:431
 [5] _surface2(A::YAXArray{Float64, 2, Matrix{Float64}, Tuple{Dim{:Dim_1, DimensionalData.Dimensions.LookupArrays.Sampled{Int64, Base.OneTo{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Int64}, DimensionalData.Dimensions.LookupArrays.Points, DimensionalData.Dimensions.LookupArrays.NoMetadata}}, Dim{:Dim_2, DimensionalData.Dimensions.LookupArrays.Sampled{Int64, Base.OneTo{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Int64}, DimensionalData.Dimensions.LookupArrays.Points, DimensionalData.Dimensions.LookupArrays.NoMetadata}}}}, attributes::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, replacements::Tuple{})
   @ DimensionalDataMakie ~/Desktop/tmp/DimensionalData.jl/ext/DimensionalDataMakie.jl:165
 [6] heatmap(A::YAXArray{Float64, 2, Matrix{Float64}, Tuple{Dim{:Dim_1, DimensionalData.Dimensions.LookupArrays.Sampled{Int64, Base.OneTo{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Int64}, DimensionalData.Dimensions.LookupArrays.Points, DimensionalData.Dimensions.LookupArrays.NoMetadata}}, Dim{:Dim_2, DimensionalData.Dimensions.LookupArrays.Sampled{Int64, Base.OneTo{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Int64}, DimensionalData.Dimensions.LookupArrays.Points, DimensionalData.Dimensions.LookupArrays.NoMetadata}}}}; x::Nothing, y::Nothing, colorbarkw::NamedTuple{(), Tuple{}}, attributes::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
   @ DimensionalDataMakie ~/Desktop/tmp/DimensionalData.jl/ext/DimensionalDataMakie.jl:134
 [7] heatmap(A::YAXArray{Float64, 2, Matrix{Float64}, Tuple{Dim{:Dim_1, DimensionalData.Dimensions.LookupArrays.Sampled{Int64, Base.OneTo{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Int64}, DimensionalData.Dimensions.LookupArrays.Points, DimensionalData.Dimensions.LookupArrays.NoMetadata}}, Dim{:Dim_2, DimensionalData.Dimensions.LookupArrays.Sampled{Int64, Base.OneTo{Int64}, DimensionalData.Dimensions.LookupArrays.ForwardOrdered, DimensionalData.Dimensions.LookupArrays.Regular{Int64}, DimensionalData.Dimensions.LookupArrays.Points, DimensionalData.Dimensions.LookupArrays.NoMetadata}}}})
   @ DimensionalDataMakie ~/Desktop/tmp/DimensionalData.jl/ext/DimensionalDataMakie.jl:130
 [8] top-level scope
   @ ~/Desktop/tmp/DD_test/test_yax.jl:5
rafaqz commented 12 months ago

Ahhh YAXArrays has a bad permutedims, it needs to copy the dispatch from DD if its adding methods.

(so it can detect the dimensions)

lazarusA commented 12 months ago

Ahhh YAXArrays has a bad permutedims, it needs to copy the dispatch from DD if its adding methods.

(so it can detect the dimensions)

this reads like a job for @felixcremer . I don't know where to start looking at. And for tonight, I'm off.

rafaqz commented 12 months ago

No worries, tried the meshscatter but its a bit weird converting a dimension to points, I'm also out for the day

(So maybe I'll merge without meshscatter, but we should keep adding things to this later as you say)

codecov-commenter commented 12 months ago

Codecov Report

Merging #528 (54e6ee1) into main (31d22ad) will decrease coverage by 6.91%. Report is 6 commits behind head on main. The diff coverage is 36.13%.

@@            Coverage Diff             @@
##             main     #528      +/-   ##
==========================================
- Coverage   89.68%   82.78%   -6.91%     
==========================================
  Files          39       40       +1     
  Lines        2909     3223     +314     
==========================================
+ Hits         2609     2668      +59     
- Misses        300      555     +255     
Files Changed Coverage Δ
ext/DimensionalDataMakie.jl 0.00% <0.00%> (ø)
src/Dimensions/set.jl 92.00% <0.00%> (-3.84%) :arrow_down:
src/Dimensions/primitives.jl 85.96% <62.82%> (-8.01%) :arrow_down:
src/array/methods.jl 87.50% <77.87%> (-7.31%) :arrow_down:
src/Dimensions/indexing.jl 93.93% <100.00%> (ø)
src/plotrecipes.jl 82.57% <100.00%> (ø)
src/precompile.jl 100.00% <100.00%> (ø)

... and 1 file with indirect coverage changes

:mega: We’re building smart automated test selection to slash your CI/CD build times. Learn more

tomchor commented 12 months ago

@rafaqz sorry I've been offline for a while so I didn't have a chance to interact more before it was merged. For the record though, everything I've tested so far today has worked perfectly. Beautiful work. Thanks so much :)

tomchor commented 12 months ago

I guess one question is: will the overlapping functionality need to be removed from Rasters?

rafaqz commented 12 months ago

No worries, thanks for trying it out.

When its tagged we can delete the methods in Rasters and set new DD lower bounds.