diff --git a/src/args.jl b/src/args.jl index 6b106e8b..75577482 100644 --- a/src/args.jl +++ b/src/args.jl @@ -1098,7 +1098,7 @@ function extractGroupArgs(v::AVec, args...; legendEntry = string) if n > 100 @warn("You created n=$n groups... Is that intended?") end - groupIds = Vector{Int}[filter(i -> v[i] == glab, 1:length(v)) for glab in groupLabels] + groupIds = Vector{Int}[filter(i -> v[i] == glab, eachindex(v)) for glab in groupLabels] GroupBy(map(legendEntry, groupLabels), groupIds) end @@ -1106,7 +1106,7 @@ legendEntryFromTuple(ns::Tuple) = join(ns, ' ') # this is when given a tuple of vectors of values to group by function extractGroupArgs(vs::Tuple, args...) - isempty(vs) && return GroupBy([""], [1:size(args[1],1)]) + isempty(vs) && return GroupBy([""], [axes(args[1],1)]) v = map(tuple, vs...) extractGroupArgs(v, args...; legendEntry = legendEntryFromTuple) end @@ -1116,7 +1116,7 @@ legendEntryFromTuple(ns::NamedTuple) = join(["$k = $v" for (k, v) in pairs(ns)], ", ") function extractGroupArgs(vs::NamedTuple, args...) - isempty(vs) && return GroupBy([""], [1:size(args[1],1)]) + isempty(vs) && return GroupBy([""], [axes(args[1],1)]) v = map(NamedTuple{keys(vs)}∘tuple, values(vs)...) extractGroupArgs(v, args...; legendEntry = legendEntryFromTuple) end @@ -1225,7 +1225,8 @@ convertLegendValue(v::AbstractArray) = map(convertLegendValue, v) # anything else is returned as-is function slice_arg(v::AMat, idx::Int) c = mod1(idx, size(v,2)) - size(v,1) == 1 ? v[1,c] : v[:,c] + m,n = axes(v) + size(v,1) == 1 ? v[first(m),n[c]] : v[:,n[c]] end slice_arg(wrapper::InputWrapper, idx) = wrapper.obj slice_arg(v, idx) = v diff --git a/src/axes.jl b/src/axes.jl index 0bf6c2a7..1215ea24 100644 --- a/src/axes.jl +++ b/src/axes.jl @@ -577,10 +577,10 @@ end # add the discrete value for each item. return the continuous values and the indices function discrete_value!(axis::Axis, v::AVec) - n = length(v) - cvec = zeros(n) - discrete_indices = zeros(Int, n) - for i=1:n + n = eachindex(v) + cvec = zeros(axes(v)) + discrete_indices = similar(Array{Int}, axes(v)) + for i in n cvec[i], discrete_indices[i] = discrete_value!(axis, v[i]) end cvec, discrete_indices @@ -588,10 +588,10 @@ end # add the discrete value for each item. return the continuous values and the indices function discrete_value!(axis::Axis, v::AMat) - n,m = size(v) - cmat = zeros(n,m) - discrete_indices = zeros(Int, n, m) - for i=1:n, j=1:m + n,m = axes(v) + cmat = zeros(axes(v)) + discrete_indices = similar(Array{Int}, axes(v)) + for i in n, j in m cmat[i,j], discrete_indices[i,j] = discrete_value!(axis, v[i,j]) end cmat, discrete_indices diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 9c98be72..fe97c31b 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -197,7 +197,7 @@ function gr_polaraxes(rmin::Real, rmax::Real, sp::Subplot) if xaxis[:grid] gr_set_line(xaxis[:gridlinewidth], xaxis[:gridstyle], xaxis[:foreground_color_grid]) gr_set_transparency(xaxis[:foreground_color_grid], xaxis[:gridalpha]) - for i in 1:length(α) + for i in eachindex(α) GR.polyline([sinf[i], 0], [cosf[i], 0]) end end @@ -206,7 +206,7 @@ function gr_polaraxes(rmin::Real, rmax::Real, sp::Subplot) if yaxis[:grid] gr_set_line(yaxis[:gridlinewidth], yaxis[:gridstyle], yaxis[:foreground_color_grid]) gr_set_transparency(yaxis[:foreground_color_grid], yaxis[:gridalpha]) - for i in 1:length(rtick_values) + for i in eachindex(rtick_values) r = (rtick_values[i] - rmin) / (rmax - rmin) if r <= 1.0 && r >= 0.0 GR.drawarc(-r, r, -r, r, 0, 359) @@ -223,7 +223,7 @@ function gr_polaraxes(rmin::Real, rmax::Real, sp::Subplot) #draw angular ticks if xaxis[:showaxis] GR.drawarc(-1, 1, -1, 1, 0, 359) - for i in 1:length(α) + for i in eachindex(α) x, y = GR.wctondc(1.1 * sinf[i], 1.1 * cosf[i]) GR.textext(x, y, string((360-α[i])%360, "^o")) end @@ -231,7 +231,7 @@ function gr_polaraxes(rmin::Real, rmax::Real, sp::Subplot) #draw radial ticks if yaxis[:showaxis] - for i in 1:length(rtick_values) + for i in eachindex(rtick_values) r = (rtick_values[i] - rmin) / (rmax - rmin) if r <= 1.0 && r >= 0.0 x, y = GR.wctondc(0.05, r) @@ -305,7 +305,7 @@ function gr_draw_markers(series::Series, x, y, clims, msize = series[:markersize shapes = series[:markershape] if shapes != :none - for i=1:length(x) + for i=eachindex(x) msi = _cycle(msize, i) shape = _cycle(shapes, i) cfunc = isa(shape, Shape) ? gr_set_fillcolor : gr_set_markercolor diff --git a/src/backends/pgfplots.jl b/src/backends/pgfplots.jl index 65938d90..378473c5 100644 --- a/src/backends/pgfplots.jl +++ b/src/backends/pgfplots.jl @@ -180,11 +180,11 @@ function pgf_series(sp::Subplot, series::Series) end # PGFPlots can't handle non-Vector? - args = map(a -> if typeof(a) <: AbstractVector && typeof(a) != Vector - collect(a) - else - a - end, args) + # args = map(a -> if typeof(a) <: AbstractVector && typeof(a) != Vector + # collect(a) + # else + # a + # end, args) if st in (:contour, :histogram2d) style = [] diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index aad9aac1..03984fb2 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -351,7 +351,7 @@ end function plotly_colorscale(grad::ColorGradient, α) - [[grad.values[i], rgba_string(plot_color(grad.colors[i], α))] for i in 1:length(grad.colors)] + [[grad.values[i], rgba_string(plot_color(grad.colors[i], α))] for i in eachindex(grad.colors)] end plotly_colorscale(c::Colorant,α) = plotly_colorscale(_as_gradient(c),α) function plotly_colorscale(c::AbstractVector{<:RGBA}, α) @@ -392,7 +392,7 @@ end # we split by NaNs and then construct/destruct the shapes to get the closed coords function plotly_close_shapes(x, y) xs, ys = nansplit(x), nansplit(y) - for i=1:length(xs) + for i=eachindex(xs) shape = Shape(xs[i], ys[i]) xs[i], ys[i] = coords(shape) end @@ -415,6 +415,7 @@ function plotly_data(series::Series, letter::Symbol, data) end end plotly_data(v) = v !== nothing ? collect(v) : v +plotly_data(v::AbstractArray) = v plotly_data(surf::Surface) = surf.surf plotly_data(v::AbstractArray{R}) where {R<:Rational} = float(v) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index 0b36999b..19137b13 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -187,7 +187,7 @@ end # end function get_locator_and_formatter(vals::AVec) - pyticker."FixedLocator"(1:length(vals)), pyticker."FixedFormatter"(vals) + pyticker."FixedLocator"(eachindex(vals)), pyticker."FixedFormatter"(vals) end function add_pyfixedformatter(cbar, vals::AVec) @@ -535,7 +535,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) shapes = series[:markershape] msc = py_markerstrokecolor(series) lw = py_thickness_scale(plt, series[:markerstrokewidth]) - for i=1:length(y) + for i=eachindex(y) extrakw[:c] = _cycle(markercolor, i) push!(handle, ax."scatter"(_cycle(x,i), _cycle(y,i); @@ -564,7 +564,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) delete!(extrakw, :c) - for i=1:length(y) + for i=eachindex(y) cur_marker = py_marker(_cycle(shapes,i)) if ( cur_marker == prev_marker ) @@ -1013,7 +1013,7 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend}) kw = KW() if !isempty(sp[:zaxis][:discrete_values]) && colorbar_series[:seriestype] == :heatmap locator, formatter = get_locator_and_formatter(sp[:zaxis][:discrete_values]) - # kw[:values] = 1:length(sp[:zaxis][:discrete_values]) + # kw[:values] = eachindex(sp[:zaxis][:discrete_values]) kw[:values] = sp[:zaxis][:continuous_values] kw[:ticks] = locator kw[:format] = formatter diff --git a/src/components.jl b/src/components.jl index be82e5b9..de10f663 100644 --- a/src/components.jl +++ b/src/components.jl @@ -187,7 +187,7 @@ end function scale!(shape::Shape, x::Real, y::Real = x, c = center(shape)) sx, sy = coords(shape) cx, cy = c - for i=1:length(sx) + for i=eachindex(sx) sx[i] = (sx[i] - cx) * x + cx sy[i] = (sy[i] - cy) * y + cy end @@ -202,7 +202,7 @@ end "translate a Shape in space" function translate!(shape::Shape, x::Real, y::Real = x) sx, sy = coords(shape) - for i=1:length(sx) + for i=eachindex(sx) sx[i] += x sy[i] += y end @@ -230,7 +230,7 @@ end function rotate!(shape::Shape, Θ::Real, c = center(shape)) x, y = coords(shape) cx, cy = c - for i=1:length(x) + for i=eachindex(x) xi = rotate_x(x[i], y[i], Θ, cx, cy) yi = rotate_y(x[i], y[i], Θ, cx, cy) x[i], y[i] = xi, yi diff --git a/src/examples.jl b/src/examples.jl index 77e9ff04..c0ac5a38 100644 --- a/src/examples.jl +++ b/src/examples.jl @@ -545,7 +545,7 @@ function test_examples(pkgname::Symbol; debug = false, disp = true, sleep = noth skip = [], only = nothing) Plots._debugMode.on = debug plts = Dict() - for i in 1:length(_examples) + for i in eachindex(_examples) only !== nothing && !(i in only) && continue i in skip && continue try diff --git a/src/pipeline.jl b/src/pipeline.jl index 98f06bf9..4966b7f8 100644 --- a/src/pipeline.jl +++ b/src/pipeline.jl @@ -12,7 +12,7 @@ function _expand_seriestype_array(plotattributes::KW, args) if typeof(sts) <: AbstractArray delete!(plotattributes, :seriestype) rd = Vector{RecipeData}(undef, size(sts, 1)) - for r in 1:size(sts, 1) + for r in axes(sts, 1) dc = copy(plotattributes) dc[:seriestype] = sts[r:r,:] rd[r] = RecipeData(dc, args) diff --git a/src/recipes.jl b/src/recipes.jl index 75736fda..06215cd2 100644 --- a/src/recipes.jl +++ b/src/recipes.jl @@ -364,7 +364,7 @@ end 0.5 * _bar_width end else - Float64[0.5_cycle(bw,i) for i=1:length(procx)] + Float64[0.5_cycle(bw,i) for i=eachindex(procx)] end # make fillto a vector... default fills to 0 @@ -998,7 +998,7 @@ function get_xy(o::OHLC, x, xdiff) end # get the joined vector -function get_xy(v::AVec{OHLC}, x = 1:length(v)) +function get_xy(v::AVec{OHLC}, x = eachindex(v)) xdiff = 0.3ignorenan_mean(abs.(diff(x))) x_out, y_out = zeros(0), zeros(0) for (i,ohlc) in enumerate(v) @@ -1056,8 +1056,8 @@ end @assert length(g.args) == 1 && typeof(g.args[1]) <: AbstractMatrix seriestype := :spy mat = g.args[1] - n,m = size(mat) - Plots.SliceIt, 1:m, 1:n, Surface(mat) + n,m = axes(mat) + Plots.SliceIt, m, n, Surface(mat) end @recipe function f(::Type{Val{:spy}}, x,y,z) @@ -1185,7 +1185,7 @@ end seriestype := :shape # create a filled polygon for each item - for c=1:size(weights,2) + for c=axes(weights,2) sx = vcat(weights[:,c], c==1 ? zeros(n) : reverse(weights[:,c-1])) sy = vcat(returns, reverse(returns)) @series Plots.isvertical(plotattributes) ? (sx, sy) : (sy, sx) @@ -1206,9 +1206,9 @@ julia> areaplot(1:3, [1 2 3; 7 8 9; 4 5 6], seriescolor = [:red :green :blue], f @recipe function f(a::AreaPlot) data = cumsum(a.args[end], dims=2) - x = length(a.args) == 1 ? (1:size(data, 1)) : a.args[1] + x = length(a.args) == 1 ? (axes(data, 1)) : a.args[1] seriestype := :line - for i in 1:size(data, 2) + for i in axes(data, 2) @series begin fillrange := i > 1 ? data[:,i-1] : 0 x, data[:,i] diff --git a/src/series.jl b/src/series.jl index 9d63aaeb..be5fc439 100644 --- a/src/series.jl +++ b/src/series.jl @@ -47,7 +47,7 @@ function convertToAnyVector(v::AMat{<:DataPoint}, plotattributes) if all3D(plotattributes) Any[prepareSeriesData(Surface(v))] else - Any[prepareSeriesData(v[:, i]) for i in 1:size(v, 2)] + Any[prepareSeriesData(v[:, i]) for i in axes(v, 2)] end end @@ -70,13 +70,13 @@ process_ribbon(ribbon::Tuple{Any,Any}, plotattributes) = collect(zip(convertToAn # TODO: can we avoid the copy here? one error that crops up is that mapping functions over the same array # result in that array being shared. push!, etc will add too many items to that array -compute_x(x::Nothing, y::Nothing, z) = 1:size(z,1) -compute_x(x::Nothing, y, z) = 1:size(y,1) +compute_x(x::Nothing, y::Nothing, z) = axes(z,1) +compute_x(x::Nothing, y, z) = axes(y,1) compute_x(x::Function, y, z) = map(x, y) compute_x(x, y, z) = copy(x) # compute_y(x::Void, y::Function, z) = error() -compute_y(x::Nothing, y::Nothing, z) = 1:size(z,2) +compute_y(x::Nothing, y::Nothing, z) = axes(z,2) compute_y(x, y::Function, z) = map(y, x) compute_y(x, y, z) = copy(y) @@ -282,9 +282,9 @@ all3D(plotattributes::KW) = trueOrAllTrue(st -> st in (:contour, :contourf, :hea # return a surface if this is a 3d plot, otherwise let it be sliced up @recipe function f(mat::AMat{T}) where T<:Union{Integer,AbstractFloat,Missing} if all3D(plotattributes) - n,m = size(mat) + n,m = axes(mat) wrap_surfaces(plotattributes) - SliceIt, 1:m, 1:n, Surface(mat) + SliceIt, m, n, Surface(mat) else SliceIt, nothing, mat, nothing end @@ -294,9 +294,9 @@ end @recipe function f(fmt::Formatted{T}) where T<:AbstractMatrix if all3D(plotattributes) mat = fmt.data - n,m = size(mat) + n,m = axes(mat) wrap_surfaces(plotattributes) - SliceIt, 1:m, 1:n, Formatted(Surface(mat), fmt.formatter) + SliceIt, m, n, Formatted(Surface(mat), fmt.formatter) else SliceIt, nothing, fmt, nothing end @@ -319,35 +319,35 @@ function clamp_greys!(mat::AMat{T}) where T<:Gray end @recipe function f(mat::AMat{T}) where T<:Gray - n, m = size(mat) + n, m = axes(mat) if is_seriestype_supported(:image) seriestype := :image yflip --> true - SliceIt, 1:m, 1:n, Surface(clamp_greys!(mat)) + SliceIt, m, n, Surface(clamp_greys!(mat)) else seriestype := :heatmap yflip --> true cbar --> false fillcolor --> ColorGradient([:black, :white]) - SliceIt, 1:m, 1:n, Surface(clamp!(convert(Matrix{Float64}, mat), 0., 1.)) + SliceIt, m, n, Surface(clamp!(convert(Matrix{Float64}, mat), 0., 1.)) end end # # images - colors @recipe function f(mat::AMat{T}) where T<:Colorant - n, m = size(mat) + n, m = axes(mat) if is_seriestype_supported(:image) seriestype := :image yflip --> true - SliceIt, 1:m, 1:n, Surface(mat) + SliceIt, m, n, Surface(mat) else seriestype := :heatmap yflip --> true cbar --> false z, plotattributes[:fillcolor] = replace_image_with_heatmap(mat) - SliceIt, 1:m, 1:n, Surface(z) + SliceIt, m, n, Surface(z) end end @@ -366,7 +366,7 @@ end @recipe function f(shapes::AMat{Shape}) seriestype --> :shape - for j in 1:size(shapes,2) + for j in axes(shapes,2) @series coords(vec(shapes[:,j])) end end @@ -583,7 +583,7 @@ end # end splittable_kw(key, val, lengthGroup) = false -splittable_kw(key, val::AbstractArray, lengthGroup) = !(key in (:group, :color_palette)) && size(val,1) == lengthGroup +splittable_kw(key, val::AbstractArray, lengthGroup) = !(key in (:group, :color_palette)) && length(axes(val,1)) == lengthGroup splittable_kw(key, val::Tuple, lengthGroup) = all(splittable_kw.(key, val, lengthGroup)) splittable_kw(key, val::SeriesAnnotations, lengthGroup) = splittable_kw(key, val.strs, lengthGroup) @@ -597,7 +597,7 @@ end function groupedvec2mat(x_ind, x, y::AbstractArray, groupby, def_val = y[1]) y_mat = Array{promote_type(eltype(y), typeof(def_val))}(undef, length(keys(x_ind)), length(groupby.groupLabels)) fill!(y_mat, def_val) - for i in 1:length(groupby.groupLabels) + for i in eachindex(groupby.groupLabels) xi = x[groupby.groupIds[i]] yi = y[groupby.groupIds[i]] y_mat[getindex.(Ref(x_ind), xi), i] = yi @@ -630,7 +630,7 @@ group_as_matrix(t) = false if length(g.args) == 1 x = zeros(Int, lengthGroup) for indexes in groupby.groupIds - x[indexes] = 1:length(indexes) + x[indexes] = eachindex(indexes) end last_args = g.args else @@ -638,7 +638,7 @@ group_as_matrix(t) = false last_args = g.args[2:end] end x_u = unique(sort(x)) - x_ind = Dict(zip(x_u, 1:length(x_u))) + x_ind = Dict(zip(x_u, eachindex(x_u))) for (key,val) in plotattributes if splittable_kw(key, val, lengthGroup) :($key) := groupedvec2mat(x_ind, x, val, groupby) diff --git a/src/utils.jl b/src/utils.jl index b54c094f..d6fbdee8 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -43,7 +43,7 @@ function barHack(; kw...) # estimate the edges dists = diff(midpoints) * 0.5 edges = zeros(length(midpoints)+1) - for i in 1:length(edges) + for i in eachindex(edges) if i == 1 edge = midpoints[1] - dists[1] elseif i == length(edges) @@ -56,7 +56,7 @@ function barHack(; kw...) x = Float64[] y = Float64[] - for i in 1:length(heights) + for i in eachindex(heights) e1, e2 = edges[i:i+1] append!(x, [e1, e1, e2, e2]) append!(y, [fillrange, heights[i], heights[i], fillrange]) @@ -182,13 +182,15 @@ end mutable struct SegmentsIterator args::Tuple - n::Int + n1::Int + n2::Int end function iter_segments(args...) tup = Plots.wraptuple(args) - n = maximum(map(length, tup)) - SegmentsIterator(tup, n) + n1 = minimum(map(firstindex, tup)) + n2 = maximum(map(lastindex, tup)) + SegmentsIterator(tup, n1, n2) end function iter_segments(series::Series) @@ -197,9 +199,9 @@ function iter_segments(series::Series) return UnitRange{Int}[] elseif has_attribute_segments(series) if series[:seriestype] in (:scatter, :scatter3d) - return [[i] for i in 1:length(y)] + return [[i] for i in eachindex(y)] else - return [i:(i + 1) for i in 1:(length(y) - 1)] + return [i:(i + 1) for i in firstindex(y):lastindex(y)-1] end else segs = UnitRange{Int}[] @@ -217,13 +219,13 @@ anynan(args::Tuple) = i -> anynan(i,args) anynan(istart::Int, iend::Int, args::Tuple) = any(anynan(args), istart:iend) allnan(istart::Int, iend::Int, args::Tuple) = all(anynan(args), istart:iend) -function Base.iterate(itr::SegmentsIterator, nextidx::Int = 1) - i = findfirst(!anynan(itr.args), nextidx:itr.n) +function Base.iterate(itr::SegmentsIterator, nextidx::Int = itr.n1) + i = findfirst(!anynan(itr.args), nextidx:itr.n2) i === nothing && return nothing nextval = nextidx + i - 1 - j = findfirst(anynan(itr.args), nextval:itr.n) - nextnan = j === nothing ? itr.n + 1 : nextval + j - 1 + j = findfirst(anynan(itr.args), nextval:itr.n2) + nextnan = j === nothing ? itr.n2 + 1 : nextval + j - 1 nextval:nextnan-1, nextnan end