From 9529246bfb20eaf8101fe7a9e7f671c04c0fc7be Mon Sep 17 00:00:00 2001 From: Pietro Vertechi Date: Mon, 21 Aug 2017 14:30:44 +0100 Subject: [PATCH 1/4] keywords arguments of same length as series get grouped --- src/args.jl | 2 +- src/series.jl | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/args.jl b/src/args.jl index 37dd250e..ef403a04 100644 --- a/src/args.jl +++ b/src/args.jl @@ -854,7 +854,7 @@ end # expecting a mapping of "group label" to "group indices" function extractGroupArgs{T, V<:AVec{Int}}(idxmap::Dict{T,V}, args...) groupLabels = sortedkeys(idxmap) - groupIds = VecI[collect(idxmap[k]) for k in groupLabels] + groupIds = Vector{Int}[collect(idxmap[k]) for k in groupLabels] GroupBy(groupLabels, groupIds) end diff --git a/src/series.jl b/src/series.jl index ca520168..746e206d 100644 --- a/src/series.jl +++ b/src/series.jl @@ -515,6 +515,13 @@ end @series begin label --> string(glab) idxfilter --> groupby.groupIds[i] + for (key,val) in d + length(args) == 0 && break + if key != :group && isa(val, AbstractArray) && size(val,1) == size(args[1],1) + n = ndims(val) + :($key) := val[groupby.groupIds[i], fill(Colon(), n-1)...] + end + end args end end From 6dba32bf9989fbb3713d4da661984b773af878d5 Mon Sep 17 00:00:00 2001 From: Pietro Vertechi Date: Mon, 21 Aug 2017 15:53:31 +0100 Subject: [PATCH 2/4] only check kw is at least as long as group --- src/series.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/series.jl b/src/series.jl index 746e206d..f4f277a8 100644 --- a/src/series.jl +++ b/src/series.jl @@ -511,13 +511,13 @@ end # split the group into 1 series per group, and set the label and idxfilter for each @recipe function f(groupby::GroupBy, args...) + lengthGroup = maximum(union(groupby.groupIds...)) for (i,glab) in enumerate(groupby.groupLabels) @series begin label --> string(glab) idxfilter --> groupby.groupIds[i] for (key,val) in d - length(args) == 0 && break - if key != :group && isa(val, AbstractArray) && size(val,1) == size(args[1],1) + if key != :group && isa(val, AbstractArray) && size(val,1) >= lengthGroup n = ndims(val) :($key) := val[groupby.groupIds[i], fill(Colon(), n-1)...] end From 5a7ed24078c23c12875007a767f1f5ecec3e6683 Mon Sep 17 00:00:00 2001 From: Pietro Vertechi Date: Fri, 25 Aug 2017 17:01:29 +0100 Subject: [PATCH 3/4] allow tuples --- src/series.jl | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/series.jl b/src/series.jl index f4f277a8..f3499e22 100644 --- a/src/series.jl +++ b/src/series.jl @@ -509,6 +509,13 @@ end # nothing # end +splittable_kw(key, val, lengthGroup) = false +splittable_kw(key, val::AbstractArray, lengthGroup) = (key != :group) && size(val,1) == lengthGroup +splittable_kw(key, val::Tuple, lengthGroup) = all(splittable_kw.(key, val, lengthGroup)) + +split_kw(key, val::AbstractArray, indices) = val[indices, fill(Colon(), ndims(val)-1)...] +split_kw(key, val::Tuple, indices) = Tuple(split_kw(key, v, indices) for v in val) + # split the group into 1 series per group, and set the label and idxfilter for each @recipe function f(groupby::GroupBy, args...) lengthGroup = maximum(union(groupby.groupIds...)) @@ -517,9 +524,8 @@ end label --> string(glab) idxfilter --> groupby.groupIds[i] for (key,val) in d - if key != :group && isa(val, AbstractArray) && size(val,1) >= lengthGroup - n = ndims(val) - :($key) := val[groupby.groupIds[i], fill(Colon(), n-1)...] + if splittable_kw(key, val, lengthGroup) + :($key) := split_kw(key, val, groupby.groupIds[i]) end end args From 5157089d876aab1f639a7e72d3e952687aaa21da Mon Sep 17 00:00:00 2001 From: Pietro Vertechi Date: Sun, 27 Aug 2017 18:56:10 +0100 Subject: [PATCH 4/4] group on a tuple of vectors --- src/args.jl | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/args.jl b/src/args.jl index ef403a04..3bd869f5 100644 --- a/src/args.jl +++ b/src/args.jl @@ -840,16 +840,24 @@ end # this is when given a vector-type of values to group by -function extractGroupArgs(v::AVec, args...) +function extractGroupArgs(v::AVec, args...; legendEntry = string) groupLabels = sort(collect(unique(v))) n = length(groupLabels) if n > 100 warn("You created n=$n groups... Is that intended?") end groupIds = Vector{Int}[filter(i -> v[i] == glab, 1:length(v)) for glab in groupLabels] - GroupBy(map(string, groupLabels), groupIds) + GroupBy(map(legendEntry, groupLabels), groupIds) end +legendEntryFromTuple(ns::Tuple) = string(("$n " for n in ns)...) + +# this is when given a tuple of vectors of values to group by +function extractGroupArgs(vs::Tuple, args...) + (vs == ()) && return GroupBy([""], [1:size(args[1],1)]) + v = collect(zip(vs...)) + extractGroupArgs(v, args...; legendEntry = legendEntryFromTuple) +end # expecting a mapping of "group label" to "group indices" function extractGroupArgs{T, V<:AVec{Int}}(idxmap::Dict{T,V}, args...)