From 8a40ac89911e86a066fd4c6ca2aee895dd57f8c5 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Thu, 25 Aug 2016 14:30:08 -0400 Subject: [PATCH] added Volume with recipe, conversion, expand_extrema, and :volume type --- src/args.jl | 2 +- src/axes.jl | 10 +++++++--- src/components.jl | 29 +++++++++++++++++++++++++++++ src/series.jl | 9 +++++++++ 4 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/args.jl b/src/args.jl index 1592bd5e..34b73b01 100644 --- a/src/args.jl +++ b/src/args.jl @@ -31,7 +31,7 @@ const _axesAliases = Dict{Symbol,Symbol}( ) const _3dTypes = [ - :path3d, :scatter3d, :surface, :wireframe, :contour3d + :path3d, :scatter3d, :surface, :wireframe, :contour3d, :volume ] const _allTypes = vcat([ :none, :line, :path, :steppre, :steppost, :sticks, :scatter, diff --git a/src/axes.jl b/src/axes.jl index 0ce290ee..2c6d8533 100644 --- a/src/axes.jl +++ b/src/axes.jl @@ -264,9 +264,13 @@ function expand_extrema!(sp::Subplot, d::KW) else letter == :x ? :y : letter == :y ? :x : :z end] - # data = d[letter] - axis = sp.attr[Symbol(letter, "axis")] - if eltype(data) <: Number || (isa(data, Surface) && all(di -> isa(di, Number), data.surf)) + axis = sp[Symbol(letter, "axis")] + + if isa(data, Volume) + expand_extrema!(sp[:xaxis], data.x_extents) + expand_extrema!(sp[:yaxis], data.y_extents) + expand_extrema!(sp[:zaxis], data.z_extents) + elseif eltype(data) <: Number || (isa(data, Surface) && all(di -> isa(di, Number), data.surf)) if !(eltype(data) <: Number) # huh... must have been a mis-typed surface? lets swap it out data = d[letter] = Surface(Matrix{Float64}(data.surf)) diff --git a/src/components.jl b/src/components.jl index d9cd13c2..9def1325 100644 --- a/src/components.jl +++ b/src/components.jl @@ -418,6 +418,35 @@ immutable SurfaceFunction <: AbstractSurface f::Function end + +# ----------------------------------------------------------------------- + +# # I don't want to clash with ValidatedNumerics, but this would be nice: +# ..(a::T, b::T) = (a,b) + +immutable Volume{T} + v::Array{T,3} + x_extents::Tuple{T,T} + y_extents::Tuple{T,T} + z_extents::Tuple{T,T} +end + +default_extents{T}(::Type{T}) = (zero(T), one(T)) + +function Volume{T}(v::Array{T,3}, + x_extents = default_extents(T), + y_extents = default_extents(T), + z_extents = default_extents(T)) + Volume(v, x_extents, y_extents, z_extents) +end + +Base.Array(vol::Volume) = vol.v +for f in (:length, :size) + @eval Base.$f(vol::Volume, args...) = $f(vol.v, args...) +end +Base.copy{T}(vol::Volume{T}) = Volume{T}(copy(vol.v), vol.x_extents, vol.y_extents, vol.z_extents) +Base.eltype{T}(vol::Volume{T}) = T + # ----------------------------------------------------------------------- # style is :open or :closed (for now) diff --git a/src/series.jl b/src/series.jl index 28c9d2e3..4d61985c 100644 --- a/src/series.jl +++ b/src/series.jl @@ -36,6 +36,9 @@ convertToAnyVector(f::Function, d::KW) = Any[f], nothing # surface convertToAnyVector(s::Surface, d::KW) = Any[s], nothing +# volume +convertToAnyVector(v::Volume, d::KW) = Any[v], nothing + # # vector of OHLC # convertToAnyVector(v::AVec{OHLC}, d::KW) = Any[v], nothing @@ -220,6 +223,12 @@ end end end +# assume this is a Volume, so construct one +@recipe function f{T<:Number}(vol::AbstractArray{T,3}, args...) + seriestype := :volume + SliceIt, nothing, Volume(vol, args...), nothing +end + # # images - grays