MakieOrg / Makie.jl

Interactive data visualizations and plotting in Julia
https://docs.makie.org/stable
MIT License
2.37k stars 302 forks source link

Unable to pass attributes if re-directed by recipe #3904

Open Moelf opened 3 months ago

Moelf commented 3 months ago

Building on top of the examples: https://docs.makie.org/dev/tutorials/wrap-existing-recipe

The tutorial has this snippet:

function Makie.plot!(plot::Hist{<:Tuple{<:MyHist}})
    # Only forward valid attributes for BarPlot
    valid_attributes = Makie.shared_attributes(plot, BarPlot)
    barplot!(plot, valid_attributes, plot[1])
end

h = MyHist([1, 10, 100], 1:3)
hist(h; color=:red, direction=:x)

Now, let's say user wants to also customize Makie.hist(myhist; clamp_bincounts = ...), they can't get this to work.

In particular, it is not enough to register these:

Makie.used_attributes(::Type{<:Hist}, h::MyHist) = (:clamp_bincounts, )
Makie.used_attributes(::Type{<:BarPlot}, h::MyHist) = (:clamp_bincounts, )

because by the time we're inside our own function Makie.plot!(plot::Hist{<:Tuple{<:MyHist}}) method, the attributes no longer contain the keyword argument we need.

@asinghvi17

SimonDanisch commented 3 months ago

used_attributes is for passing arguments to convert_arguments, which is where clamp_bincounts should be implemented, since you can't add custom attributes to an existing recipe.

Moelf commented 3 months ago

as you may recall, that tutorial specifically deal with situation where it can't be implemented as convert_arguments -- in this case, I already have histograms made, I can't convert them back to inputs to Makie.hist(), it's conceptually impossible.

ffreyer commented 1 week ago

Shouldn't it be used_attributes(::Type{::MyHist}, ::InputType) = ...?

asinghvi17 commented 1 week ago

The problem is that used_attributes consumes those kwargs, I think...