From c9a9541d0edc6aa67f81e5a56fc6a0ad57bedf2b Mon Sep 17 00:00:00 2001 From: yha Date: Mon, 4 Nov 2019 03:27:47 +0200 Subject: [PATCH] Avoid second copy of data. Inf handling for surfaces and volumes. --- src/series.jl | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/series.jl b/src/series.jl index 5c0ffeac..d8c182df 100644 --- a/src/series.jl +++ b/src/series.jl @@ -10,20 +10,19 @@ const FuncOrFuncs{F} = Union{F, Vector{F}, Matrix{F}} const MaybeNumber = Union{Number, Missing} const MaybeString = Union{AbstractString, Missing} const DataPoint = Union{MaybeNumber, MaybeString} -const SeriesData = Union{AVec{<:DataPoint}, Function, Surface, Volume} prepareSeriesData(x) = error("Cannot convert $(typeof(x)) to series data for plotting") prepareSeriesData(::Nothing) = nothing -prepareSeriesData(s::SeriesData) = handleinfinites(handlemissings(s)) +prepareSeriesData(f::Function) = f +prepareSeriesData(a::AbstractArray{<:MaybeNumber}) = replace!( + x -> ismissing(x) || isinf(x) ? NaN : x, + map(float,a)) +prepareSeriesData(a::AbstractArray{<:MaybeString}) = replace(x -> ismissing(x) ? "" : x, a) +prepareSeriesData(s::Surface{<:AMat{<:MaybeNumber}}) = Surface(prepareSeriesData(s.surf)) +prepareSeriesData(s::Surface) = s # non-numeric Surface, such as an image +prepareSeriesData(v::Volume) = Volume(prepareSeriesData(v.v), v.x_extents, v.y_extents, v.z_extents) -handleinfinites(s) = s -handleinfinites(s::AbstractArray{<:MaybeNumber}) = [isinf(x) ? NaN : x for x in s] - -handlemissings(v) = v -handlemissings(v::AbstractArray{<:MaybeNumber}) = replace(v, missing => NaN) -handlemissings(v::AbstractArray{<:MaybeString}) = replace(v, missing => "") -handlemissings(s::Surface) = Surface(handlemissings(s.surf)) -handlemissings(v::Volume) = Volume(handlemissings(v.v), v.x_extents, v.y_extents, v.z_extents) +prepareSeriesArray(a::AbstractArray{<:MaybeNumber}) = [ismissing(x) || isinf(x) ? NaN : x for x in a] # default: assume x represents a single series convertToAnyVector(x, plotattributes) = Any[prepareSeriesData(x)]