From 4be19ba6d85d0f4a85f12b24f6eff94ecb0bc573 Mon Sep 17 00:00:00 2001 From: "Michael K. Borregaard" Date: Tue, 29 Aug 2017 14:15:39 +0200 Subject: [PATCH 1/3] Make wand edges possible in statplots --- src/recipes.jl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/recipes.jl b/src/recipes.jl index d4d1b201..86b4da00 100644 --- a/src/recipes.jl +++ b/src/recipes.jl @@ -497,6 +497,7 @@ end end Plots.@deps stepbins path +wand_edges(x...) = error("Load the StatPlots package in order to use :wand bins") function _auto_binning_nbins{N}(vs::NTuple{N,AbstractVector}, dim::Integer; mode::Symbol = :auto) _cl(x) = ceil(Int, NaNMath.max(x, one(x))) @@ -529,8 +530,11 @@ function _auto_binning_nbins{N}(vs::NTuple{N,AbstractVector}, dim::Integer; mode end _hist_edge{N}(vs::NTuple{N,AbstractVector}, dim::Integer, binning::Integer) = StatsBase.histrange(vs[dim], binning, :left) -_hist_edge{N}(vs::NTuple{N,AbstractVector}, dim::Integer, binning::Symbol) = _hist_edge(vs, dim, _auto_binning_nbins(vs, dim, mode = binning)) _hist_edge{N}(vs::NTuple{N,AbstractVector}, dim::Integer, binning::AbstractVector) = binning +function _hist_edge{N}(vs::NTuple{N,AbstractVector}, dim::Integer, binning::Symbol) + binning == :wand && return(wand_edges(vs[dim])) + _hist_edge(vs, dim, _auto_binning_nbins(vs, dim, mode = binning)) +end _hist_edges{N}(vs::NTuple{N,AbstractVector}, binning::NTuple{N}) = map(dim -> _hist_edge(vs, dim, binning[dim]), (1:N...)) From e47dde9f41f6d6056dc72b80ea0aea6f79fd02dd Mon Sep 17 00:00:00 2001 From: "Michael K. Borregaard" Date: Fri, 1 Sep 2017 16:14:29 +0200 Subject: [PATCH 2/3] simplify but creates type instability --- src/recipes.jl | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/recipes.jl b/src/recipes.jl index 86b4da00..6de497e1 100644 --- a/src/recipes.jl +++ b/src/recipes.jl @@ -497,7 +497,7 @@ end end Plots.@deps stepbins path -wand_edges(x...) = error("Load the StatPlots package in order to use :wand bins") +wand_edges(x...) = (warn("Load the StatPlots package in order to use :wand bins. Defaulting to :auto", once = true); :auto) function _auto_binning_nbins{N}(vs::NTuple{N,AbstractVector}, dim::Integer; mode::Symbol = :auto) _cl(x) = ceil(Int, NaNMath.max(x, one(x))) @@ -524,17 +524,16 @@ function _auto_binning_nbins{N}(vs::NTuple{N,AbstractVector}, dim::Integer; mode _cl(_span(v) / (3.5 * std(v) / n^(1/3))) elseif mode == :fd # Freedman–Diaconis rule _cl(_span(v) / (2 * _iqr(v) / n^(1/3))) + elseif mode == :wand + wand_edges(v) # this makes this function not type stable, but the type instability does not propagate else error("Unknown auto-binning mode $mode") - end::Int + end end _hist_edge{N}(vs::NTuple{N,AbstractVector}, dim::Integer, binning::Integer) = StatsBase.histrange(vs[dim], binning, :left) _hist_edge{N}(vs::NTuple{N,AbstractVector}, dim::Integer, binning::AbstractVector) = binning -function _hist_edge{N}(vs::NTuple{N,AbstractVector}, dim::Integer, binning::Symbol) - binning == :wand && return(wand_edges(vs[dim])) - _hist_edge(vs, dim, _auto_binning_nbins(vs, dim, mode = binning)) -end +_hist_edge{N}(vs::NTuple{N,AbstractVector}, dim::Integer, binning::Symbol) = _hist_edge(vs, dim, _auto_binning_nbins(vs, dim, mode = binning)) _hist_edges{N}(vs::NTuple{N,AbstractVector}, binning::NTuple{N}) = map(dim -> _hist_edge(vs, dim, binning[dim]), (1:N...)) From a1896d189c0d85432b9ee3391a5ece829d6f9ff0 Mon Sep 17 00:00:00 2001 From: "Michael K. Borregaard" Date: Fri, 1 Sep 2017 16:31:13 +0200 Subject: [PATCH 3/3] Revert ordering --- src/recipes.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/recipes.jl b/src/recipes.jl index 6de497e1..4724313e 100644 --- a/src/recipes.jl +++ b/src/recipes.jl @@ -532,8 +532,8 @@ function _auto_binning_nbins{N}(vs::NTuple{N,AbstractVector}, dim::Integer; mode end _hist_edge{N}(vs::NTuple{N,AbstractVector}, dim::Integer, binning::Integer) = StatsBase.histrange(vs[dim], binning, :left) -_hist_edge{N}(vs::NTuple{N,AbstractVector}, dim::Integer, binning::AbstractVector) = binning _hist_edge{N}(vs::NTuple{N,AbstractVector}, dim::Integer, binning::Symbol) = _hist_edge(vs, dim, _auto_binning_nbins(vs, dim, mode = binning)) +_hist_edge{N}(vs::NTuple{N,AbstractVector}, dim::Integer, binning::AbstractVector) = binning _hist_edges{N}(vs::NTuple{N,AbstractVector}, binning::NTuple{N}) = map(dim -> _hist_edge(vs, dim, binning[dim]), (1:N...))