Skip to content

Commit

Permalink
Merge pull request #382 from noahrhodes:tooltip_array
Browse files Browse the repository at this point in the history
Add support for multi-data tooltips
  • Loading branch information
davidanthoff authored Jul 29, 2023
2 parents 1df7e4a + 5e6ad7c commit 1922f10
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 13 deletions.
8 changes: 3 additions & 5 deletions docs/src/examples/examples_table_based_plots.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ using VegaLite, VegaDatasets
dataset("seattle-temps") |>
@vlplot(
title="2010 Daily Max Temperature (F) in Seattle, WA",
:rect,
:rect,
x={
"date:o",
timeUnit=:date,
Expand Down Expand Up @@ -160,7 +160,7 @@ dataset("stocks") |>
color={
"price:q",
aggregate="sum",
title="Price"
title="Price"
}
)
```
Expand Down Expand Up @@ -226,7 +226,6 @@ dataset("cars") |>
{calculate="datum.x2 + (datum.rank_Origin - 1) * 0.01",as="nx2"},
{calculate="(datum.nx+datum.nx2)/2",as="xc"},
{calculate="(datum.ny+datum.ny2)/2",as="yc"},
{calculate="'Origin: '+datum.Origin+', '+'Cylinders: '+datum.Cylinders",as="tt"}, #How to add a line break?
]
) +
[
Expand Down Expand Up @@ -258,8 +257,7 @@ dataset("cars") |>
y2=:ny2,
color={"Origin:n",legend=nothing},
opacity={field="Cylinders",type="quantitative",legend=nothing},
#tooltip=[{field="Origin",type="nominal"},{field="Cylinders",type="quantitative"}] #array not supported
tooltip={"tt:n"} #see calculate above
tooltip=[{field="Origin",type="nominal"},{field="Cylinders",type="quantitative"}]
) +
@vlplot(
mark={:text,baseline="middle"},
Expand Down
21 changes: 13 additions & 8 deletions src/vlspec.jl
Original file line number Diff line number Diff line change
Expand Up @@ -17,33 +17,38 @@ end
function augment_encoding_type(x::AbstractDict, data::Vega.DataValuesNode)
if !haskey(x, "type") && !haskey(x, "aggregate") && haskey(x, "field") && haskey(data.columns, Symbol(x["field"]))
new_x = copy(x)

jl_type = eltype(data.columns[Symbol(x["field"])])

if jl_type <: DataValues.DataValue
jl_type = eltype(jl_type)
end

if jl_type <: Number
new_x["type"] = "quantitative"
elseif jl_type <: AbstractString
new_x["type"] = "nominal"
elseif jl_type <: Dates.AbstractTime
new_x["type"] = "temporal"
end

return new_x
else
return x
end
end

function augment_encoding_type(x::AbstractArray, data::Vega.DataValuesNode)
x = [augment_encoding_type(k,data) for k in x]
return x
end

function add_encoding_types(specdict, parentdata=nothing)
if (haskey(specdict, "data") && haskey(specdict["data"], "values") && specdict["data"]["values"] isa Vega.DataValuesNode) || parentdata !== nothing
if (haskey(specdict, "data") && haskey(specdict["data"], "values") && specdict["data"]["values"] isa Vega.DataValuesNode) || parentdata !== nothing
data = (haskey(specdict, "data") && haskey(specdict["data"], "values") && specdict["data"]["values"] isa Vega.DataValuesNode) ? specdict["data"]["values"] : parentdata

newspec = OrderedDict{String,Any}(
(k == "encoding" && v isa AbstractDict) ? k => OrderedDict{String,Any}(kk => augment_encoding_type(vv, data) for (kk, vv) in v) :
(k == "encoding" && v isa AbstractDict) ? k => OrderedDict{String,Any}(kk => augment_encoding_type(vv, data) for (kk, vv) in v) :
k == "spec" ? k => add_encoding_types(v, data) :
k in ("layer", "concat", "vconcat", "hconcat") ? k => [add_encoding_types(i, data) for i in v] : k => v for (k, v) in specdict
)
Expand All @@ -59,8 +64,8 @@ function our_json_print(io, spec::VLSpec)
end

function (p::VLSpec)(data)
TableTraits.isiterabletable(data) || throw(ArgumentError("'data' is not a table."))
TableTraits.isiterabletable(data) || throw(ArgumentError("'data' is not a table."))

it = IteratorInterfaceExtensions.getiterator(data)

datavaluesnode = Vega.DataValuesNode(it)
Expand Down
7 changes: 7 additions & 0 deletions test/test_spec.jl
Original file line number Diff line number Diff line change
Expand Up @@ -84,3 +84,10 @@

@test haskey(Vega.getparams(p5)["data"], "url")
end

@testitem "Array tooltip data" begin
using VegaDatasets

p10 = dataset("cars")|> @vlplot(:point,x=:Horsepower,y=:Miles_per_Gallon,tooltip=[:Horsepower,"Miles_per_Gallon:q"])
@test isa(p10.encoding.tooltip, Vector)
end

0 comments on commit 1922f10

Please sign in to comment.