Use NaNMath explicitly everywhere

This commit is contained in:
Michael K. Borregaard 2017-05-31 10:39:18 +02:00
parent 16ebc2b05b
commit 96181926d7
13 changed files with 55 additions and 63 deletions

View File

@ -10,6 +10,7 @@ using Base.Meta
@reexport using PlotThemes @reexport using PlotThemes
import Showoff import Showoff
import StatsBase import StatsBase
import NaNMath # define functions that ignores NaNs. To overcome the destructive effects of https://github.com/JuliaLang/julia/pull/12563
export export
grid, grid,
@ -106,15 +107,6 @@ export
# --------------------------------------------------------- # ---------------------------------------------------------
import NaNMath
# define functions (e.g. `_extrema`, that ignores NaNs, when the type is applicable. To overcome the destructive effects of https://github.com/JuliaLang/julia/pull/12563
for fun in (:extrema, :minimum, :maximum)
@eval $(Symbol(string("_",fun))){F<:AbstractFloat}(x::AbstractArray{F}) = NaNMath.$(fun)(x)
@eval $(Symbol(string("_",fun)))(x) = Base.$(fun)(x)
end
# ---------------------------------------------------------
import Measures import Measures
import Measures: Length, AbsoluteLength, Measure, BoundingBox, mm, cm, inch, pt, width, height, w, h import Measures: Length, AbsoluteLength, Measure, BoundingBox, mm, cm, inch, pt, width, height, w, h
const BBox = Measures.Absolute2DBox const BBox = Measures.Absolute2DBox

View File

@ -118,7 +118,7 @@ Base.show(io::IO, axis::Axis) = dumpdict(axis.d, "Axis", true)
# Base.getindex(axis::Axis, k::Symbol) = getindex(axis.d, k) # Base.getindex(axis::Axis, k::Symbol) = getindex(axis.d, k)
Base.setindex!(axis::Axis, v, ks::Symbol...) = setindex!(axis.d, v, ks...) Base.setindex!(axis::Axis, v, ks::Symbol...) = setindex!(axis.d, v, ks...)
Base.haskey(axis::Axis, k::Symbol) = haskey(axis.d, k) Base.haskey(axis::Axis, k::Symbol) = haskey(axis.d, k)
_extrema(axis::Axis) = (ex = axis[:extrema]; (ex.emin, ex.emax)) NaNMath.extrema(axis::Axis) = (ex = axis[:extrema]; (ex.emin, ex.emax))
const _scale_funcs = Dict{Symbol,Function}( const _scale_funcs = Dict{Symbol,Function}(
@ -349,11 +349,11 @@ function expand_extrema!(sp::Subplot, d::KW)
bw = d[:bar_width] bw = d[:bar_width]
if bw == nothing if bw == nothing
bw = d[:bar_width] = _mean(diff(data)) bw = d[:bar_width] = NaNMath.mean(diff(data))
end end
axis = sp.attr[Symbol(dsym, :axis)] axis = sp.attr[Symbol(dsym, :axis)]
expand_extrema!(axis, _maximum(data) + 0.5_maximum(bw)) expand_extrema!(axis, NaNMath.maximum(data) + 0.5maximum(bw))
expand_extrema!(axis, _minimum(data) - 0.5_minimum(bw)) expand_extrema!(axis, NaNMath.minimum(data) - 0.5minimum(bw))
end end
end end

View File

@ -75,7 +75,7 @@ function tick_padding(axis::Axis)
vals, labs = ticks vals, labs = ticks
isempty(labs) && return 0mm isempty(labs) && return 0mm
# ptsz = axis[:tickfont].pointsize * pt # ptsz = axis[:tickfont].pointsize * pt
longest_label = _maximum(length(lab) for lab in labs) longest_label = maximum(length(lab) for lab in labs)
# generalize by "rotating" y labels # generalize by "rotating" y labels
rot = axis[:rotation] + (axis[:letter] == :y ? 90 : 0) rot = axis[:rotation] + (axis[:letter] == :y ? 90 : 0)

View File

@ -175,7 +175,7 @@ end
function gl_marker(shape::Shape) function gl_marker(shape::Shape)
points = Point2f0[Vec{2,Float32}(p) for p in zip(shape.x, shape.y)] points = Point2f0[Vec{2,Float32}(p) for p in zip(shape.x, shape.y)]
bb = GeometryTypes.AABB(points) bb = GeometryTypes.AABB(points)
mini, maxi = _minimum(bb), _maximum(bb) mini, maxi = minimum(bb), maximum(bb)
w3 = maxi-mini w3 = maxi-mini
origin, width = Point2f0(mini[1], mini[2]), Point2f0(w3[1], w3[2]) origin, width = Point2f0(mini[1], mini[2]), Point2f0(w3[1], w3[2])
map!(p -> ((p - origin) ./ width) - 0.5f0, points) # normalize and center map!(p -> ((p - origin) ./ width) - 0.5f0, points) # normalize and center
@ -304,7 +304,7 @@ function extract_any_color(d, kw_args)
kw_args[:color_norm] = Vec2f0(clims) kw_args[:color_norm] = Vec2f0(clims)
end end
elseif clims == :auto elseif clims == :auto
kw_args[:color_norm] = Vec2f0(_extrema(d[:y])) kw_args[:color_norm] = Vec2f0(NaNMath.extrema(d[:y]))
end end
end end
else else
@ -315,7 +315,7 @@ function extract_any_color(d, kw_args)
kw_args[:color_norm] = Vec2f0(clims) kw_args[:color_norm] = Vec2f0(clims)
end end
elseif clims == :auto elseif clims == :auto
kw_args[:color_norm] = Vec2f0(_extrema(d[:y])) kw_args[:color_norm] = Vec2f0(NaNMath.extrema(d[:y]))
else else
error("Unsupported limits: $clims") error("Unsupported limits: $clims")
end end
@ -470,7 +470,7 @@ function hover(to_hover, to_display, window)
end end
GLVisualize._view(robj, popup, camera = cam) GLVisualize._view(robj, popup, camera = cam)
bb = GLAbstraction.boundingbox(robj).value bb = GLAbstraction.boundingbox(robj).value
mini = _minimum(bb) mini = minimum(bb)
w = GeometryTypes.widths(bb) w = GeometryTypes.widths(bb)
wborder = w * 0.08f0 #8 percent border wborder = w * 0.08f0 #8 percent border
bb = GeometryTypes.AABB{Float32}(mini - wborder, w + 2 * wborder) bb = GeometryTypes.AABB{Float32}(mini - wborder, w + 2 * wborder)
@ -482,7 +482,7 @@ function hover(to_hover, to_display, window)
end end
function extract_extrema(d, kw_args) function extract_extrema(d, kw_args)
xmin, xmax = _extrema(d[:x]); ymin, ymax = _extrema(d[:y]) xmin, xmax = NaNMath.extrema(d[:x]); ymin, ymax = NaNMath.extrema(d[:y])
kw_args[:primitive] = GeometryTypes.SimpleRectangle{Float32}(xmin, ymin, xmax-xmin, ymax-ymin) kw_args[:primitive] = GeometryTypes.SimpleRectangle{Float32}(xmin, ymin, xmax-xmin, ymax-ymin)
nothing nothing
end end
@ -509,7 +509,7 @@ function extract_colornorm(d, kw_args)
else else
d[:y] d[:y]
end end
kw_args[:color_norm] = Vec2f0(_extrema(z)) kw_args[:color_norm] = Vec2f0(NaNMath.extrema(z))
kw_args[:intensity] = map(Float32, collect(z)) kw_args[:intensity] = map(Float32, collect(z))
end end
end end
@ -781,7 +781,7 @@ function gl_bar(d, kw_args)
# compute half-width of bars # compute half-width of bars
bw = nothing bw = nothing
hw = if bw == nothing hw = if bw == nothing
_mean(diff(x)) NaNMath.mean(diff(x))
else else
Float64[cycle(bw,i)*0.5 for i=1:length(x)] Float64[cycle(bw,i)*0.5 for i=1:length(x)]
end end
@ -864,7 +864,7 @@ function gl_boxplot(d, kw_args)
end end
# change q1 and q5 to show outliers # change q1 and q5 to show outliers
# using maximum and minimum values inside the limits # using maximum and minimum values inside the limits
q1, q5 = _extrema(inside) q1, q5 = NaNMath.extrema(inside)
end end
# Box # Box
if notch if notch
@ -1318,7 +1318,7 @@ function gl_contour(x, y, z, kw_args)
T = eltype(z) T = eltype(z)
levels = Contour.contours(map(T, x), map(T, y), z, h) levels = Contour.contours(map(T, x), map(T, y), z, h)
result = Point2f0[] result = Point2f0[]
zmin, zmax = get(kw_args, :limits, Vec2f0(_extrema(z))) zmin, zmax = get(kw_args, :limits, Vec2f0(NaNMath.extrema(z)))
cmap = get(kw_args, :color_map, get(kw_args, :color, RGBA{Float32}(0,0,0,1))) cmap = get(kw_args, :color_map, get(kw_args, :color, RGBA{Float32}(0,0,0,1)))
colors = RGBA{Float32}[] colors = RGBA{Float32}[]
for c in levels.contours for c in levels.contours
@ -1339,7 +1339,7 @@ end
function gl_heatmap(x,y,z, kw_args) function gl_heatmap(x,y,z, kw_args)
get!(kw_args, :color_norm, Vec2f0(_extrema(z))) get!(kw_args, :color_norm, Vec2f0(NaNMath.extrema(z)))
get!(kw_args, :color_map, Plots.make_gradient(cgrad())) get!(kw_args, :color_map, Plots.make_gradient(cgrad()))
delete!(kw_args, :intensity) delete!(kw_args, :intensity)
I = GLVisualize.Intensity{1, Float32} I = GLVisualize.Intensity{1, Float32}
@ -1382,7 +1382,7 @@ function label_scatter(d, w, ho)
if isapprox(bbw[3], 0) if isapprox(bbw[3], 0)
bbw = Vec3f0(bbw[1], bbw[2], 1) bbw = Vec3f0(bbw[1], bbw[2], 1)
end end
mini = _minimum(bb) mini = NaNMath.minimum(bb)
m = GLAbstraction.translationmatrix(-mini) m = GLAbstraction.translationmatrix(-mini)
m *= GLAbstraction.scalematrix(1 ./ bbw) m *= GLAbstraction.scalematrix(1 ./ bbw)
kw[:primitive] = m * p kw[:primitive] = m * p

View File

@ -264,7 +264,7 @@ end
normalize_zvals(zv::Void) = zv normalize_zvals(zv::Void) = zv
function normalize_zvals(zv::AVec) function normalize_zvals(zv::AVec)
vmin, vmax = _extrema(zv) vmin, vmax = NaNMath.extrema(zv)
if vmin == vmax if vmin == vmax
zeros(length(zv)) zeros(length(zv))
else else
@ -639,7 +639,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas)
elseif ispolar(sp) elseif ispolar(sp)
r = gr_set_viewport_polar() r = gr_set_viewport_polar()
rmin, rmax = GR.adjustrange(_minimum(r), _maximum(r)) rmin, rmax = GR.adjustrange(minimum(r), maximum(r))
# rmin, rmax = axis_limits(sp[:yaxis]) # rmin, rmax = axis_limits(sp[:yaxis])
gr_polaraxes(rmin, rmax) gr_polaraxes(rmin, rmax)
@ -824,7 +824,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas)
# create the colorbar of contour levels # create the colorbar of contour levels
if sp[:colorbar] != :none if sp[:colorbar] != :none
gr_set_viewport_cmap(sp) gr_set_viewport_cmap(sp)
l = round(Int32, 1000 + (h - _minimum(h)) / (_maximum(h) - _minimum(h)) * 255) l = round(Int32, 1000 + (h - NaNMath.minimum(h)) / (NaNMath.maximum(h) - NaNMath.minimum(h)) * 255) #much in doubt whether to use the NaNMath minimum here
GR.setwindow(xmin, xmax, zmin, zmax) GR.setwindow(xmin, xmax, zmin, zmax)
GR.cellarray(xmin, xmax, zmax, zmin, 1, length(l), l) GR.cellarray(xmin, xmax, zmax, zmin, 1, length(l), l)
ztick = 0.5 * GR.tick(zmin, zmax) ztick = 0.5 * GR.tick(zmin, zmax)

View File

@ -546,7 +546,7 @@ function plotly_series(plt::Plot, series::Series)
else else
# grad = ColorGradient(series[:markercolor], alpha=series[:markeralpha]) # grad = ColorGradient(series[:markercolor], alpha=series[:markeralpha])
grad = as_gradient(series[:markercolor], series[:markeralpha]) grad = as_gradient(series[:markercolor], series[:markeralpha])
zmin, zmax = _extrema(series[:marker_z]) zmin, zmax = NaNMath.extrema(series[:marker_z])
zrange = zmax == zmin ? 1 : zmax - zmin # if all marker_z values are the same, plot all markers same color (avoids division by zero in next line) zrange = zmax == zmin ? 1 : zmax - zmin # if all marker_z values are the same, plot all markers same color (avoids division by zero in next line)
[rgba_string(grad[(zi - zmin) / zrange]) for zi in series[:marker_z]] [rgba_string(grad[(zi - zmin) / zrange]) for zi in series[:marker_z]]
end end

View File

@ -778,7 +778,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series)
end end
clims = sp[:clims] clims = sp[:clims]
zmin, zmax = _extrema(z) zmin, zmax = NaNMath.extrema(z)
extrakw[:vmin] = (is_2tuple(clims) && isfinite(clims[1])) ? clims[1] : zmin extrakw[:vmin] = (is_2tuple(clims) && isfinite(clims[1])) ? clims[1] : zmin
extrakw[:vmax] = (is_2tuple(clims) && isfinite(clims[2])) ? clims[2] : zmax extrakw[:vmax] = (is_2tuple(clims) && isfinite(clims[2])) ? clims[2] : zmax
@ -926,7 +926,7 @@ function py_compute_axis_minval(axis::Axis)
for series in series_list(sp) for series in series_list(sp)
v = series.d[axis[:letter]] v = series.d[axis[:letter]]
if !isempty(v) if !isempty(v)
minval = NaNMath.min(minval, _minimum(abs(v))) minval = NaNMath.min(minval, NaNMath.minimum(abs(v)))
end end
end end
end end

View File

@ -501,7 +501,7 @@ immutable ZValues
zrange::Tuple{Float64,Float64} zrange::Tuple{Float64,Float64}
end end
function zvalues{T<:Real}(values::AVec{T}, zrange::Tuple{T,T} = (_minimum(values), _maximum(values))) function zvalues{T<:Real}(values::AVec{T}, zrange::Tuple{T,T} = (NaNMath.minimum(values), NaNMath.maximum(values)))
ZValues(collect(float(values)), map(Float64, zrange)) ZValues(collect(float(values)), map(Float64, zrange))
end end
@ -645,8 +645,8 @@ function (bc::BezierCurve)(t::Real)
p p
end end
_mean(x::Real, y::Real) = 0.5*(x+y) # mean(x::Real, y::Real) = 0.5*(x+y) #commented out as I cannot see this used anywhere and it overwrites a Base method with different functionality
_mean{N,T<:Real}(ps::FixedSizeArrays.Vec{N,T}...) = sum(ps) / length(ps) NaNMath.mean{N,T<:Real}(ps::FixedSizeArrays.Vec{N,T}...) = NaNMath.sum(ps) / length(ps)
@deprecate curve_points coords @deprecate curve_points coords
@ -659,7 +659,7 @@ function directed_curve(args...; kw...)
end end
function extrema_plus_buffer(v, buffmult = 0.2) function extrema_plus_buffer(v, buffmult = 0.2)
vmin,vmax = _extrema(v) vmin,vmax = NaNMath.extrema(v)
vdiff = vmax-vmin vdiff = vmax-vmin
buffer = vdiff * buffmult buffer = vdiff * buffmult
vmin - buffer, vmax + buffer vmin - buffer, vmax + buffer

View File

@ -642,7 +642,7 @@ end
function create_grid_vcat(expr::Expr) function create_grid_vcat(expr::Expr)
rowsizes = map(rowsize, expr.args) rowsizes = map(rowsize, expr.args)
rmin, rmax = _extrema(rowsizes) rmin, rmax = extrema(rowsizes)
if rmin > 0 && rmin == rmax if rmin > 0 && rmin == rmax
# we have a grid... build the whole thing # we have a grid... build the whole thing
# note: rmin is the number of columns # note: rmin is the number of columns
@ -704,7 +704,7 @@ function link_axes!(axes::Axis...)
a1 = axes[1] a1 = axes[1]
for i=2:length(axes) for i=2:length(axes)
a2 = axes[i] a2 = axes[i]
expand_extrema!(a1, _extrema(a2)) expand_extrema!(a1, NaNMath.extrema(a2))
for k in (:extrema, :discrete_values, :continuous_values, :discrete_map) for k in (:extrema, :discrete_values, :continuous_values, :discrete_map)
a2[k] = a1[k] a2[k] = a1[k]
end end

View File

@ -153,7 +153,7 @@ function _add_smooth_kw(kw_list::Vector{KW}, kw::KW)
if get(kw, :smooth, false) if get(kw, :smooth, false)
x, y = kw[:x], kw[:y] x, y = kw[:x], kw[:y]
β, α = convert(Matrix{Float64}, [x ones(length(x))]) \ convert(Vector{Float64}, y) β, α = convert(Matrix{Float64}, [x ones(length(x))]) \ convert(Vector{Float64}, y)
sx = [_minimum(x), _maximum(x)] sx = [NaNMath.minimum(x), NaNMath.maximum(x)]
sy = β * sx + α sy = β * sx + α
push!(kw_list, merge(copy(kw), KW( push!(kw_list, merge(copy(kw), KW(
:seriestype => :path, :seriestype => :path,

View File

@ -225,7 +225,7 @@ end
fr = if yaxis[:scale] == :identity fr = if yaxis[:scale] == :identity
0.0 0.0
else else
NaNMath.min(axis_limits(yaxis)[1], _minimum(y)) NaNMath.min(axis_limits(yaxis)[1], NaNMath.minimum(y))
end end
end end
newx, newy = zeros(3n), zeros(3n) newx, newy = zeros(3n), zeros(3n)
@ -338,7 +338,7 @@ end
# compute half-width of bars # compute half-width of bars
bw = d[:bar_width] bw = d[:bar_width]
hw = if bw == nothing hw = if bw == nothing
0.5_mean(diff(procx)) 0.5NaNMath.mean(diff(procx))
else else
Float64[0.5cycle(bw,i) for i=1:length(procx)] Float64[0.5cycle(bw,i) for i=1:length(procx)]
end end
@ -366,7 +366,7 @@ end
end end
# widen limits out a bit # widen limits out a bit
expand_extrema!(axis, widen(_extrema(xseg.pts)...)) expand_extrema!(axis, widen(NaNMath.extrema(xseg.pts)...))
# switch back # switch back
if !isvertical(d) if !isvertical(d)
@ -414,8 +414,8 @@ end
function _preprocess_binbarlike_weights{T<:AbstractFloat}(::Type{T}, w, wscale::Symbol) function _preprocess_binbarlike_weights{T<:AbstractFloat}(::Type{T}, w, wscale::Symbol)
w_adj = _scale_adjusted_values(T, w, wscale) w_adj = _scale_adjusted_values(T, w, wscale)
w_min = _minimum(w_adj) w_min = NaNMath.minimum(w_adj)
w_max = _maximum(w_adj) w_max = NaNMath.maximum(w_adj)
baseline = _binbarlike_baseline(w_min, wscale) baseline = _binbarlike_baseline(w_min, wscale)
w_adj, baseline w_adj, baseline
end end
@ -550,7 +550,7 @@ Plots.@deps stepbins path
function _auto_binning_nbins{N}(vs::NTuple{N,AbstractVector}, dim::Integer; mode::Symbol = :auto) function _auto_binning_nbins{N}(vs::NTuple{N,AbstractVector}, dim::Integer; mode::Symbol = :auto)
_cl(x) = NaNMath.max(ceil(Int, x), 1) _cl(x) = NaNMath.max(ceil(Int, x), 1)
_iqr(v) = quantile(v, 0.75) - quantile(v, 0.25) _iqr(v) = quantile(v, 0.75) - quantile(v, 0.25)
_span(v) = _maximum(v) - _minimum(v) _span(v) = NaNMath.maximum(v) - NaNMath.minimum(v)
n_samples = length(linearindices(first(vs))) n_samples = length(linearindices(first(vs)))
# Estimator for number of samples in one row/column of bins along each axis: # Estimator for number of samples in one row/column of bins along each axis:
@ -919,7 +919,7 @@ end
# get the joined vector # get the joined vector
function get_xy(v::AVec{OHLC}, x = 1:length(v)) function get_xy(v::AVec{OHLC}, x = 1:length(v))
xdiff = 0.3_mean(abs(diff(x))) xdiff = 0.3NaNMath.mean(abs(diff(x)))
x_out, y_out = zeros(0), zeros(0) x_out, y_out = zeros(0), zeros(0)
for (i,ohlc) in enumerate(v) for (i,ohlc) in enumerate(v)
ox,oy = get_xy(ohlc, x[i], xdiff) ox,oy = get_xy(ohlc, x[i], xdiff)
@ -984,8 +984,8 @@ end
yflip := true yflip := true
aspect_ratio := 1 aspect_ratio := 1
rs, cs, zs = findnz(z.surf) rs, cs, zs = findnz(z.surf)
xlim := _extrema(cs) xlim := NaNMath.extrema(cs)
ylim := _extrema(rs) ylim := NaNMath.extrema(rs)
if d[:markershape] == :none if d[:markershape] == :none
markershape := :circle markershape := :circle
end end
@ -1006,7 +1006,7 @@ end
"Adds a+bx... straight line over the current plot" "Adds a+bx... straight line over the current plot"
function abline!(plt::Plot, a, b; kw...) function abline!(plt::Plot, a, b; kw...)
plot!(plt, [_extrema(plt)...], x -> b + a*x; kw...) plot!(plt, [NaNMath.extrema(plt)...], x -> b + a*x; kw...)
end end
abline!(args...; kw...) = abline!(current(), args...; kw...) abline!(args...; kw...) = abline!(current(), args...; kw...)

View File

@ -3,7 +3,7 @@ calcMidpoints(edges::AbstractVector) = Float64[0.5 * (edges[i] + edges[i+1]) for
"Make histogram-like bins of data" "Make histogram-like bins of data"
function binData(data, nbins) function binData(data, nbins)
lo, hi = _extrema(data) lo, hi = NaNMath.extrema(data)
edges = collect(linspace(lo, hi, nbins+1)) edges = collect(linspace(lo, hi, nbins+1))
midpoints = calcMidpoints(edges) midpoints = calcMidpoints(edges)
buckets = Int[NaNMath.max(2, NaNMath.min(searchsortedfirst(edges, x), length(edges)))-1 for x in data] buckets = Int[NaNMath.max(2, NaNMath.min(searchsortedfirst(edges, x), length(edges)))-1 for x in data]
@ -109,7 +109,7 @@ function regressionXY(x, y)
β, α = convert(Matrix{Float64}, [x ones(length(x))]) \ convert(Vector{Float64}, y) β, α = convert(Matrix{Float64}, [x ones(length(x))]) \ convert(Vector{Float64}, y)
# make a line segment # make a line segment
regx = [_minimum(x), _maximum(x)] regx = [NaNMath.minimum(x), NaNMath.maximum(x)]
regy = β * regx + α regy = β * regx + α
regx, regy regx, regy
end end
@ -187,7 +187,7 @@ type SegmentsIterator
end end
function iter_segments(args...) function iter_segments(args...)
tup = Plots.wraptuple(args) tup = Plots.wraptuple(args)
n = _maximum(map(length, tup)) n = maximum(map(length, tup))
SegmentsIterator(tup, n) SegmentsIterator(tup, n)
end end
@ -283,7 +283,7 @@ unzip{T}(xyuv::FixedSizeArrays.Vec{4,T}) = T[xyuv[1]], T[xyuv[2]], T[xyuv[
# 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)
try try
e1, e2 = _extrema(x) e1, e2 = NaNMath.extrema(x)
lims[1] = NaNMath.min(lims[1], e1) lims[1] = NaNMath.min(lims[1], e1)
lims[2] = NaNMath.max(lims[2], e2) lims[2] = NaNMath.max(lims[2], e2)
# catch err # catch err
@ -334,17 +334,17 @@ sortedkeys(d::Dict) = sort(collect(keys(d)))
"create an (n+1) list of the outsides of heatmap rectangles" "create an (n+1) list of the outsides of heatmap rectangles"
function heatmap_edges(v::AVec) function heatmap_edges(v::AVec)
vmin, vmax = _extrema(v) vmin, vmax = NaNMath.extrema(v)
extra = 0.5 * (vmax-vmin) / (length(v)-1) extra = 0.5 * (vmax-vmin) / (length(v)-1)
vcat(vmin-extra, 0.5 * (v[1:end-1] + v[2:end]), vmax+extra) vcat(vmin-extra, 0.5 * (v[1:end-1] + v[2:end]), vmax+extra)
end end
function calc_r_extrema(x, y) function calc_r_extrema(x, y)
xmin, xmax = _extrema(x) xmin, xmax = NaNMath.extrema(x)
ymin, ymax = _extrema(y) ymin, ymax = NaNMath.extrema(y)
r = 0.5 * NaNMath.min(xmax - xmin, ymax - ymin) r = 0.5 * NaNMath.min(xmax - xmin, ymax - ymin)
_extrema(r) NaNMath.extrema(r)
end end
function convert_to_polar(x, y, r_extrema = calc_r_extrema(x, y)) function convert_to_polar(x, y, r_extrema = calc_r_extrema(x, y))
@ -644,8 +644,8 @@ end
# --------------------------------------------------------------- # ---------------------------------------------------------------
# used in updating an existing series # used in updating an existing series
extendSeriesByOne(v::UnitRange{Int}, n::Int = 1) = isempty(v) ? (1:n) : (_minimum(v):_maximum(v)+n) extendSeriesByOne(v::UnitRange{Int}, n::Int = 1) = isempty(v) ? (1:n) : (minimum(v):maximum(v)+n)
extendSeriesByOne(v::AVec, n::Integer = 1) = isempty(v) ? (1:n) : vcat(v, (1:n) + _maximum(v)) extendSeriesByOne(v::AVec, n::Integer = 1) = isempty(v) ? (1:n) : vcat(v, (1:n) + NaNMath.maximum(v))
extendSeriesData{T}(v::Range{T}, z::Real) = extendSeriesData(float(collect(v)), z) extendSeriesData{T}(v::Range{T}, z::Real) = extendSeriesData(float(collect(v)), z)
extendSeriesData{T}(v::Range{T}, z::AVec) = extendSeriesData(float(collect(v)), z) extendSeriesData{T}(v::Range{T}, z::AVec) = extendSeriesData(float(collect(v)), z)
extendSeriesData{T}(v::AVec{T}, z::Real) = (push!(v, convert(T, z)); v) extendSeriesData{T}(v::AVec{T}, z::Real) = (push!(v, convert(T, z)); v)
@ -871,9 +871,9 @@ mm2px(mm::Real) = float(px / MM_PER_PX)
"Smallest x in plot" "Smallest x in plot"
xmin(plt::Plot) = _minimum([_minimum(series.d[:x]) for series in plt.series_list]) xmin(plt::Plot) = NaNMath.minimum([NaNMath.minimum(series.d[:x]) for series in plt.series_list])
"Largest x in plot" "Largest x in plot"
xmax(plt::Plot) = _maximum([_maximum(series.d[:x]) for series in plt.series_list]) xmax(plt::Plot) = NaNMath.maximum([NaNMath.maximum(series.d[:x]) for series in plt.series_list])
"Extrema of x-values in plot" "Extrema of x-values in plot"
_extrema(plt::Plot) = (xmin(plt), xmax(plt)) NaNMath.extrema(plt::Plot) = (xmin(plt), xmax(plt))

View File

@ -78,12 +78,12 @@ facts("Axes") do
@fact typeof(axis) --> Plots.Axis @fact typeof(axis) --> Plots.Axis
@fact Plots.discrete_value!(axis, "HI") --> (0.5, 1) @fact Plots.discrete_value!(axis, "HI") --> (0.5, 1)
@fact Plots.discrete_value!(axis, :yo) --> (1.5, 2) @fact Plots.discrete_value!(axis, :yo) --> (1.5, 2)
@fact Plots._extrema(axis) --> (0.5,1.5) @fact Plots.NaNMath.extrema(axis) --> (0.5,1.5)
@fact axis[:discrete_map] --> Dict{Any,Any}(:yo => 2, "HI" => 1) @fact axis[:discrete_map] --> Dict{Any,Any}(:yo => 2, "HI" => 1)
Plots.discrete_value!(axis, ["x$i" for i=1:5]) Plots.discrete_value!(axis, ["x$i" for i=1:5])
Plots.discrete_value!(axis, ["x$i" for i=0:2]) Plots.discrete_value!(axis, ["x$i" for i=0:2])
@fact Plots._extrema(axis) --> (0.5, 7.5) @fact Plots.NaNMath.extrema(axis) --> (0.5, 7.5)
end end