Merge pull request #2082 from yha/point-recipe-fix
Support arbitrary element type (esp. missing) in tuple/Point recipes
This commit is contained in:
commit
bb0e783c02
@ -553,33 +553,14 @@ end
|
|||||||
# # Lists of tuples and GeometryTypes.Points
|
# # Lists of tuples and GeometryTypes.Points
|
||||||
# # --------------------------------------------------------------------
|
# # --------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# # if we get an unhandled tuple, just splat it in
|
|
||||||
@recipe f(tup::Tuple) = tup
|
|
||||||
|
|
||||||
#
|
@recipe f(v::AVec{<:Tuple}) = unzip(v)
|
||||||
# # (x,y) tuples
|
@recipe f(v::AVec{<:GeometryTypes.Point}) = unzip(v)
|
||||||
@recipe f(xy::AVec{Tuple{R1,R2}}) where {R1<:Number,R2<:Number} = unzip(xy)
|
@recipe f(tup::Tuple) = [tup]
|
||||||
@recipe f(xy::Tuple{R1,R2}) where {R1<:Number,R2<:Number} = [xy[1]], [xy[2]]
|
@recipe f(p::GeometryTypes.Point) = [p]
|
||||||
|
|
||||||
#
|
# Special case for 4-tuples in :ohlc series
|
||||||
# # (x,y,z) tuples
|
@recipe f(xyuv::AVec{<:Tuple{R1,R2,R3,R4}}) where {R1,R2,R3,R4} = get(plotattributes,:seriestype,:path)==:ohlc ? OHLC[OHLC(t...) for t in xyuv] : unzip(xyuv)
|
||||||
@recipe f(xyz::AVec{Tuple{R1,R2,R3}}) where {R1<:Number,R2<:Number,R3<:Number} = unzip(xyz)
|
|
||||||
@recipe f(xyz::Tuple{R1,R2,R3}) where {R1<:Number,R2<:Number,R3<:Number} = [xyz[1]], [xyz[2]], [xyz[3]]
|
|
||||||
|
|
||||||
# these might be points+velocity, or OHLC or something else
|
|
||||||
@recipe f(xyuv::AVec{Tuple{R1,R2,R3,R4}}) where {R1<:Number,R2<:Number,R3<:Number,R4<:Number} = get(plotattributes,:seriestype,:path)==:ohlc ? OHLC[OHLC(t...) for t in xyuv] : unzip(xyuv)
|
|
||||||
@recipe f(xyuv::Tuple{R1,R2,R3,R4}) where {R1<:Number,R2<:Number,R3<:Number,R4<:Number} = [xyuv[1]], [xyuv[2]], [xyuv[3]], [xyuv[4]]
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# # 2D Points
|
|
||||||
@recipe f(xy::AVec{GeometryTypes.Point{2,T}}) where {T<:Number} = unzip(xy)
|
|
||||||
@recipe f(xy::GeometryTypes.Point{2,T}) where {T<:Number} = [xy[1]], [xy[2]]
|
|
||||||
|
|
||||||
#
|
|
||||||
# # 3D Points
|
|
||||||
@recipe f(xyz::AVec{GeometryTypes.Point{3,T}}) where {T<:Number} = unzip(xyz)
|
|
||||||
@recipe f(xyz::GeometryTypes.Point{3,T}) where {T<:Number} = [xyz[1]], [xyz[2]], [xyz[3]]
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# # --------------------------------------------------------------------
|
# # --------------------------------------------------------------------
|
||||||
|
|||||||
21
src/utils.jl
21
src/utils.jl
@ -271,18 +271,17 @@ maketuple(x::Tuple{T,S}) where {T,S} = x
|
|||||||
mapFuncOrFuncs(f::Function, u::AVec) = map(f, u)
|
mapFuncOrFuncs(f::Function, u::AVec) = map(f, u)
|
||||||
mapFuncOrFuncs(fs::AVec{F}, u::AVec) where {F<:Function} = [map(f, u) for f in fs]
|
mapFuncOrFuncs(fs::AVec{F}, u::AVec) where {F<:Function} = [map(f, u) for f in fs]
|
||||||
|
|
||||||
unzip(xy::AVec{Tuple{X,Y}}) where {X,Y} = [t[1] for t in xy], [t[2] for t in xy]
|
for i in 2:4
|
||||||
unzip(xyz::AVec{Tuple{X,Y,Z}}) where {X,Y,Z} = [t[1] for t in xyz], [t[2] for t in xyz], [t[3] for t in xyz]
|
@eval begin
|
||||||
unzip(xyuv::AVec{Tuple{X,Y,U,V}}) where {X,Y,U,V} = [t[1] for t in xyuv], [t[2] for t in xyuv], [t[3] for t in xyuv], [t[4] for t in xyuv]
|
unzip(v::Union{AVec{<:Tuple{Vararg{T,$i} where T}},
|
||||||
|
AVec{<:GeometryTypes.Point{$i}}}) = $(Expr(:tuple, (:([t[$j] for t in v]) for j=1:i)...))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
unzip(xy::AVec{GeometryTypes.Point{2,T}}) where {T} = T[t[1] for t in xy], T[t[2] for t in xy]
|
unzip(v::Union{AVec{<:GeometryTypes.Point{N}},
|
||||||
unzip(xy::GeometryTypes.Point{2,T}) where {T} = T[xy[1]], T[xy[2]]
|
AVec{<:Tuple{Vararg{T,N} where T}}}) where N = error("$N-dimensional unzip not implemented.")
|
||||||
|
unzip(v::Union{AVec{<:GeometryTypes.Point},
|
||||||
unzip(xyz::AVec{GeometryTypes.Point{3,T}}) where {T} = T[t[1] for t in xyz], T[t[2] for t in xyz], T[t[3] for t in xyz]
|
AVec{<:Tuple}}) = error("Can't unzip points of different dimensions.")
|
||||||
unzip(xyz::GeometryTypes.Point{3,T}) where {T} = T[xyz[1]], T[xyz[2]], T[xyz[3]]
|
|
||||||
|
|
||||||
unzip(xyuv::AVec{GeometryTypes.Point{4,T}}) where {T} = T[t[1] for t in xyuv], T[t[2] for t in xyuv], T[t[3] for t in xyuv], T[t[4] for t in xyuv]
|
|
||||||
unzip(xyuv::GeometryTypes.Point{4,T}) where {T} = T[xyuv[1]], T[xyuv[2]], T[xyuv[3]], T[xyuv[4]]
|
|
||||||
|
|
||||||
# given 2-element lims and a vector of data x, widen lims to account for the extrema of x
|
# given 2-element lims and a vector of data x, widen lims to account for the extrema of x
|
||||||
function _expand_limits(lims, x)
|
function _expand_limits(lims, x)
|
||||||
|
|||||||
@ -4,6 +4,7 @@ using Random
|
|||||||
using BinaryProvider
|
using BinaryProvider
|
||||||
using Test
|
using Test
|
||||||
using FileIO
|
using FileIO
|
||||||
|
using GeometryTypes
|
||||||
|
|
||||||
include("imgcomp.jl")
|
include("imgcomp.jl")
|
||||||
# don't actually show the plots
|
# don't actually show the plots
|
||||||
@ -81,3 +82,14 @@ end
|
|||||||
@test segments([NaN; 1], 1:10) == [2:2, 4:4, 6:6, 8:8, 10:10]
|
@test segments([NaN; 1], 1:10) == [2:2, 4:4, 6:6, 8:8, 10:10]
|
||||||
@test segments([nan10; 1:15], [1:15; nan10]) == [11:15]
|
@test segments([nan10; 1:15], [1:15; nan10]) == [11:15]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@testset "Utils" begin
|
||||||
|
zipped = ([(1,2)], [("a","b")], [(1,"a"),(2,"b")],
|
||||||
|
[(1,2),(3,4)], [(1,2,3),(3,4,5)], [(1,2,3,4),(3,4,5,6)],
|
||||||
|
[(1,2.0),(missing,missing)], [(1,missing),(missing,"a")],
|
||||||
|
[(missing,missing)], [(missing,missing,missing),("a","b","c")])
|
||||||
|
for z in zipped
|
||||||
|
@test isequal(collect(zip(Plots.unzip(z)...)), z)
|
||||||
|
@test isequal(collect(zip(Plots.unzip(Point.(z))...)), z)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user