From 5a251e570245706f97b55a9a660ee92a7d1fc595 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 6 Dec 2019 18:22:02 +0100 Subject: [PATCH 01/10] support asymmetric ribbons --- src/backends/pgfplotsx.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 367f181a..cd97d191 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -614,6 +614,7 @@ end function pgfx_add_ribbons!( axis, series, segment_plot, series_func, series_index ) ribbon_y = series[:ribbon] + @show ribbon_y opt = series.plotattributes if ribbon_y isa AVec ribbon_n = length(opt[:y]) ÷ length(ribbon_y) From 92e609876da96ebfaf772dca2f0ffc3d8ab993a7 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 6 Dec 2019 19:37:35 +0100 Subject: [PATCH 02/10] fix dimensions --- src/backends/pgfplotsx.jl | 1 - 1 file changed, 1 deletion(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index cd97d191..367f181a 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -614,7 +614,6 @@ end function pgfx_add_ribbons!( axis, series, segment_plot, series_func, series_index ) ribbon_y = series[:ribbon] - @show ribbon_y opt = series.plotattributes if ribbon_y isa AVec ribbon_n = length(opt[:y]) ÷ length(ribbon_y) From f20582e5281ca6b5495b13e3b3a5ad219c004ad2 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 3 Jan 2020 20:55:14 +0100 Subject: [PATCH 03/10] implement pgfx_preamble() --- src/backends/pgfplotsx.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 367f181a..a53edcc8 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -34,6 +34,7 @@ function pgfx_axes(pgfx_plot::PGFPlotsXPlot) return gp isa PGFPlotsX.GroupPlot ? gp.contents : gp end +pgfx_preamble() = pgfx_preamble(current()) function pgfx_preamble(pgfx_plot::Plot{PGFPlotsXBackend}) old_flag = pgfx_plot.attr[:tex_output_standalone] pgfx_plot.attr[:tex_output_standalone] = true From 7fb1a6a517881eb35dfe482dcbe044da2ece5bd5 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 3 Jan 2020 21:04:47 +0100 Subject: [PATCH 04/10] implement fill between functions --- src/backends/pgfplotsx.jl | 325 ++++++++++++++++++++------------------ 1 file changed, 171 insertions(+), 154 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index a53edcc8..99b52c8e 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -83,17 +83,16 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) if !any( sp -> ispolar(sp), plt.subplots ) pl_height, pl_width = plt.attr[:size] push!( the_plot, PGFPlotsX.GroupPlot( - PGFPlotsX.Options( - "group style" => PGFPlotsX.Options( - "group size" => string(cols)*" by "*string(rows), - "horizontal sep" => string(maximum(sp -> sp.minpad[1], plt.subplots)), - "vertical sep" => string(maximum(sp -> sp.minpad[2], plt.subplots)), - ), + PGFPlotsX.Options( + "group style" => PGFPlotsX.Options( + "group size" => string(cols)*" by "*string(rows), + "horizontal sep" => string(maximum(sp -> sp.minpad[1], plt.subplots)), + "vertical sep" => string(maximum(sp -> sp.minpad[2], plt.subplots)), + ), "height" => pl_height > 0 ? string(pl_height * px) : "{}", "width" => pl_width > 0 ? string(pl_width * px) : "{}", - ) ) - ) + )) end for sp in plt.subplots bb = bbox(sp) @@ -140,18 +139,18 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end end # Search series for any gradient. In case one series uses a gradient set - # the colorbar and colomap. - # The reasoning behind doing this on the axis level is that pgfplots - # colorbar seems to only works on axis level and needs the proper colormap for - # correctly displaying it. - # It's also possible to assign the colormap to the series itself but - # then the colormap needs to be added twice, once for the axis and once for the - # series. - # As it is likely that all series within the same axis use the same - # colormap this should not cause any problem. - for series in series_list(sp) - for col in (:markercolor, :fillcolor, :linecolor) - if typeof(series.plotattributes[col]) == ColorGradient + # the colorbar and colomap. + # The reasoning behind doing this on the axis level is that pgfplots + # colorbar seems to only works on axis level and needs the proper colormap for + # correctly displaying it. + # It's also possible to assign the colormap to the series itself but + # then the colormap needs to be added twice, once for the axis and once for the + # series. + # As it is likely that all series within the same axis use the same + # colormap this should not cause any problem. + for series in series_list(sp) + for col in (:markercolor, :fillcolor, :linecolor) + if typeof(series.plotattributes[col]) == ColorGradient PGFPlotsX.push_preamble!(pgfx_plot.the_plot, """\\pgfplotsset{ colormap={plots$(sp.attr[:subplot_index])}{$(pgfx_colormap(series.plotattributes[col]))}, }""") @@ -159,141 +158,157 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) "colorbar" => nothing, "colormap name" => "plots$(sp.attr[:subplot_index])", ) - # goto is needed to break out of col and series for - @goto colorbar_end - end - end - end - @label colorbar_end + # goto is needed to break out of col and series for + @goto colorbar_end + end + end + end + @label colorbar_end - push!(axis_opt, "colorbar style" => PGFPlotsX.Options( - "title" => sp[:colorbar_title], - "point meta max" => get_clims(sp)[2], - "point meta min" => get_clims(sp)[1] - ) - ) - if is3d(sp) - azim, elev = sp[:camera] - push!( axis_opt, "view" => (azim, elev) ) - end - axisf = if sp[:projection] == :polar - # push!(axis_opt, "xmin" => 90) - # push!(axis_opt, "xmax" => 450) - PGFPlotsX.PolarAxis - else - PGFPlotsX.Axis - end - axis = axisf( - axis_opt - ) - for (series_index, series) in enumerate(series_list(sp)) - opt = series.plotattributes - st = series[:seriestype] - series_opt = PGFPlotsX.Options( - "color" => single_color(opt[:linecolor]), - ) - if is3d(series) || st == :heatmap - series_func = PGFPlotsX.Plot3 - else - series_func = PGFPlotsX.Plot - end - if series[:fillrange] !== nothing && !isfilledcontour(series) && series[:ribbon] === nothing - push!(series_opt, "area legend" => nothing) - end - if st == :heatmap - push!(axis.options, - "view" => "{0}{90}", - ) - end - # treat segments - segments = if st in (:wireframe, :heatmap, :contour, :surface, :contour3d) - iter_segments(surface_to_vecs(series[:x], series[:y], series[:z])...) - else - iter_segments(series) - end - for (i, rng) in enumerate(segments) - segment_opt = PGFPlotsX.Options() - segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) - if opt[:markershape] != :none - marker = opt[:markershape] - if marker isa Shape - x = marker.x - y = marker.y - scale_factor = 0.025 - mark_size = opt[:markersize] * scale_factor - path = join(["($(x[i] * mark_size), $(y[i] * mark_size))" for i in eachindex(x)], " -- ") - c = get_markercolor(series, i) - a = get_markeralpha(series, i) - PGFPlotsX.push_preamble!(pgfx_plot.the_plot, - """ - \\pgfdeclareplotmark{PlotsShape$(series_index)}{ - \\filldraw - $path; - } - """ - ) - end - segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) - end - if st == :shape || - isfilledcontour(series) - segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) - end - # add fillrange - if series[:fillrange] !== nothing && !isfilledcontour(series) && series[:ribbon] === nothing - pgfx_fillrange_series!( axis, series, series_func, i, _cycle(series[:fillrange], rng), rng) - if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) - pgfx_filllegend!(series_opt, opt) - end - end - # series - # - coordinates = pgfx_series_coordinates!( sp, series, segment_opt, opt, rng ) - segment_plot = series_func( - merge(series_opt, segment_opt), - coordinates, - ) - push!(axis, segment_plot) - # add ribbons? - ribbon = series[:ribbon] - if ribbon !== nothing - pgfx_add_ribbons!( axis, series, segment_plot, series_func, series_index ) - end - # add to legend? - if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) - leg_opt = PGFPlotsX.Options() - if ribbon !== nothing - pgfx_filllegend!(axis.contents[end-3].options, opt) - end - legend = PGFPlotsX.LegendEntry(leg_opt, opt[:label], false) - push!( axis, legend ) - end - # add series annotations - anns = series[:series_annotations] - for (xi,yi,str,fnt) in EachAnn(anns, series[:x], series[:y]) - pgfx_add_annotation!(axis, xi, yi, PlotText(str, fnt), pgfx_thickness_scaling(series)) - end - end - # add subplot annotations - anns = sp.attr[:annotations] - for (xi,yi,txt) in anns - pgfx_add_annotation!(axis, xi, yi, txt, pgfx_thickness_scaling(sp)) - end - end - if ispolar(sp) - axes = the_plot - else - axes = the_plot.elements[1] - end - push!( axes, axis ) - if length(plt.o.the_plot.elements) > 0 - plt.o.the_plot.elements[1] = the_plot - else - push!(plt.o, the_plot) - end - end + push!(axis_opt, "colorbar style" => PGFPlotsX.Options( + "title" => sp[:colorbar_title], + "point meta max" => get_clims(sp)[2], + "point meta min" => get_clims(sp)[1] + ) + ) + if is3d(sp) + azim, elev = sp[:camera] + push!( axis_opt, "view" => (azim, elev) ) + end + axisf = if sp[:projection] == :polar + # push!(axis_opt, "xmin" => 90) + # push!(axis_opt, "xmax" => 450) + PGFPlotsX.PolarAxis + else + PGFPlotsX.Axis + end + axis = axisf( + axis_opt + ) + for (series_index, series) in enumerate(series_list(sp)) + # give each series a uuid for fillbetween + series_id = uuid4() + _pgfplotsx_series_ids[Symbol("$series_index")] = series_id + opt = series.plotattributes + st = series[:seriestype] + series_opt = PGFPlotsX.Options( + "color" => single_color(opt[:linecolor]), + "name path" => string(series_id) + ) + if is3d(series) || st == :heatmap + series_func = PGFPlotsX.Plot3 + else + series_func = PGFPlotsX.Plot + end + if series[:fillrange] !== nothing && !isfilledcontour(series) && series[:ribbon] === nothing + push!(series_opt, "area legend" => nothing) + end + if st == :heatmap + push!(axis.options, + "view" => "{0}{90}", + ) + end + # treat segments + segments = if st in (:wireframe, :heatmap, :contour, :surface, :contour3d) + iter_segments(surface_to_vecs(series[:x], series[:y], series[:z])...) + else + iter_segments(series) + end + for (i, rng) in enumerate(segments) + segment_opt = PGFPlotsX.Options() + segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) + if opt[:markershape] != :none + marker = opt[:markershape] + if marker isa Shape + x = marker.x + y = marker.y + scale_factor = 0.025 + mark_size = opt[:markersize] * scale_factor + path = join(["($(x[i] * mark_size), $(y[i] * mark_size))" for i in eachindex(x)], " -- ") + c = get_markercolor(series, i) + a = get_markeralpha(series, i) + PGFPlotsX.push_preamble!(pgfx_plot.the_plot, + """ + \\pgfdeclareplotmark{PlotsShape$(series_index)}{ + \\filldraw + $path; + } + """ + ) + end + segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) + end + if st == :shape || + isfilledcontour(series) + segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) + end + # add fillrange + if series[:fillrange] !== nothing && !isfilledcontour(series) && series[:ribbon] === nothing + if series[:fillrange] == 0 + pgfx_fillrange_series!( axis, series, series_func, i, _cycle(series[:fillrange], rng), rng) + end + if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) + pgfx_filllegend!(series_opt, opt) + end + end + # series + # + coordinates = pgfx_series_coordinates!( sp, series, segment_opt, opt, rng ) + segment_plot = series_func( + merge(series_opt, segment_opt), + coordinates, + ) + push!(axis, segment_plot) + # fill between functions + if series[:fillrange] !== nothing && series[:fillrange] != 0 + push!(axis, series_func( + merge(pgfx_fillstyle(opt, series_index), PGFPlotsX.Options("forget plot" => nothing)), + "fill between [of=$series_id and $(_pgfplotsx_series_ids[Symbol(string(series[:fillrange]))])]" + )) + end + # add ribbons? + ribbon = series[:ribbon] + if ribbon !== nothing + pgfx_add_ribbons!( axis, series, segment_plot, series_func, series_index ) + end + # add to legend? + if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) + leg_opt = PGFPlotsX.Options() + if ribbon !== nothing + pgfx_filllegend!(axis.contents[end-3].options, opt) + end + legend = PGFPlotsX.LegendEntry(leg_opt, opt[:label], false) + push!( axis, legend ) + end + # add series annotations + anns = series[:series_annotations] + for (xi,yi,str,fnt) in EachAnn(anns, series[:x], series[:y]) + pgfx_add_annotation!(axis, xi, yi, PlotText(str, fnt), pgfx_thickness_scaling(series)) + end + end + # add subplot annotations + for ann in sp[:annotations] + pgfx_add_annotation!(axis, locate_annotation(sp, ann...)..., pgfx_thickness_scaling(sp)) + end + # anns = sp.attr[:annotations] + # for (xi,yi,txt) in anns + # pgfx_add_annotation!(axis, xi, yi, txt, pgfx_thickness_scaling(sp)) + # end + end # for series + if ispolar(sp) + axes = the_plot + else + axes = the_plot.elements[1] + end + push!( axes, axis ) + if length(plt.o.the_plot.elements) > 0 + plt.o.the_plot.elements[1] = the_plot + else + push!(plt.o, the_plot) + end + end # for subplots pgfx_plot.is_created = true - end + end # if return pgfx_plot end ## seriestype specifics @@ -439,6 +454,8 @@ const _pgfplotsx_linestyles = KW( :dashdotdot => "dashdotdotted", ) +const _pgfplotsx_series_ids = KW() + const _pgfplotsx_markers = KW( :none => "none", :cross => "+", @@ -525,7 +542,7 @@ function pgfx_framestyle(style::Symbol) return style else default_style = get(_pgfx_framestyle_defaults, style, :axes) - @warn("Framestyle :$style is not (yet) supported by the PGFPlots backend. :$default_style was cosen instead.") + @warn("Framestyle :$style is not (yet) supported by the PGFPlotsX backend. :$default_style was cosen instead.") default_style end end From 7a521ef21fc0a4fcc968e0e5a092b6b7524ab3e3 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Wed, 8 Jan 2020 14:38:18 +0100 Subject: [PATCH 05/10] basic tuple implementation --- src/args.jl | 1 - src/backends/pgfplotsx.jl | 17 +++++++++++------ src/series.jl | 1 + 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/args.jl b/src/args.jl index 75577482..a6f0f41d 100644 --- a/src/args.jl +++ b/src/args.jl @@ -786,7 +786,6 @@ function processFillArg(plotattributes::KW, arg) plotattributes[:fillrange] = arg elseif !handleColors!(plotattributes, arg, :fillcolor) - plotattributes[:fillrange] = arg end # plotattributes[:fillrange] = fr diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 99b52c8e..4c060436 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -191,6 +191,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) _pgfplotsx_series_ids[Symbol("$series_index")] = series_id opt = series.plotattributes st = series[:seriestype] + sf = series[:fillrange] series_opt = PGFPlotsX.Options( "color" => single_color(opt[:linecolor]), "name path" => string(series_id) @@ -200,7 +201,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) else series_func = PGFPlotsX.Plot end - if series[:fillrange] !== nothing && !isfilledcontour(series) && series[:ribbon] === nothing + if sf !== nothing && !isfilledcontour(series) && series[:ribbon] === nothing push!(series_opt, "area legend" => nothing) end if st == :heatmap @@ -243,9 +244,9 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) end # add fillrange - if series[:fillrange] !== nothing && !isfilledcontour(series) && series[:ribbon] === nothing - if series[:fillrange] == 0 - pgfx_fillrange_series!( axis, series, series_func, i, _cycle(series[:fillrange], rng), rng) + if sf !== nothing && !isfilledcontour(series) && series[:ribbon] === nothing + if sf isa Number + pgfx_fillrange_series!( axis, series, series_func, i, _cycle(sf, rng), rng) end if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) pgfx_filllegend!(series_opt, opt) @@ -260,10 +261,14 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) ) push!(axis, segment_plot) # fill between functions - if series[:fillrange] !== nothing && series[:fillrange] != 0 + @show sf + @show series[:fillcolor] + if sf isa Tuple + sf1, sf2 = sf + @assert sf1 == series_index push!(axis, series_func( merge(pgfx_fillstyle(opt, series_index), PGFPlotsX.Options("forget plot" => nothing)), - "fill between [of=$series_id and $(_pgfplotsx_series_ids[Symbol(string(series[:fillrange]))])]" + "fill between [of=$series_id and $(_pgfplotsx_series_ids[Symbol(string(sf2))])]" )) end # add ribbons? diff --git a/src/series.jl b/src/series.jl index be5fc439..88e89b26 100644 --- a/src/series.jl +++ b/src/series.jl @@ -13,6 +13,7 @@ const DataPoint = Union{MaybeNumber, MaybeString} prepareSeriesData(x) = error("Cannot convert $(typeof(x)) to series data for plotting") prepareSeriesData(::Nothing) = nothing +prepareSeriesData(t::Tuple{T, T}) where {T<:Number} = t prepareSeriesData(f::Function) = f prepareSeriesData(a::AbstractArray{<:MaybeNumber}) = replace!( x -> ismissing(x) || isinf(x) ? NaN : x, From 11c86b2d30fe896560f55aac8758d32fe8b022ec Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Wed, 8 Jan 2020 14:39:10 +0100 Subject: [PATCH 06/10] remove shows --- src/backends/pgfplotsx.jl | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 4c060436..3c33c2ae 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -261,8 +261,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) ) push!(axis, segment_plot) # fill between functions - @show sf - @show series[:fillcolor] if sf isa Tuple sf1, sf2 = sf @assert sf1 == series_index From 3b7464e739dc27067d1179596e634ae9d8739a94 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Wed, 8 Jan 2020 15:10:00 +0100 Subject: [PATCH 07/10] allow vector fillranges --- src/backends/pgfplotsx.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 3c33c2ae..bc0bbedd 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -245,7 +245,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end # add fillrange if sf !== nothing && !isfilledcontour(series) && series[:ribbon] === nothing - if sf isa Number + if sf isa Number || sf isa AVec pgfx_fillrange_series!( axis, series, series_func, i, _cycle(sf, rng), rng) end if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) From 9bcab45cb8dab9d9233d799e986be0e967aa688c Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Wed, 8 Jan 2020 15:16:07 +0100 Subject: [PATCH 08/10] fix tests --- src/backends/pgfplotsx.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index bc0bbedd..8a1c6da0 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -261,7 +261,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) ) push!(axis, segment_plot) # fill between functions - if sf isa Tuple + if sf isa Tuple && series[:ribbon] === nothing sf1, sf2 = sf @assert sf1 == series_index push!(axis, series_func( From 2c6f54579d4d33601f3515766e2e3f16290c9a50 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Wed, 8 Jan 2020 15:33:49 +0100 Subject: [PATCH 09/10] informative assertion message --- src/backends/pgfplotsx.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 8a1c6da0..c6fac7c5 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -263,7 +263,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) # fill between functions if sf isa Tuple && series[:ribbon] === nothing sf1, sf2 = sf - @assert sf1 == series_index + @assert sf1 == series_index "First index of the tuple has to match the current series index." push!(axis, series_func( merge(pgfx_fillstyle(opt, series_index), PGFPlotsX.Options("forget plot" => nothing)), "fill between [of=$series_id and $(_pgfplotsx_series_ids[Symbol(string(sf2))])]" From 5fc2f6cf3b081cd326eb8b5c365f1b03a7351c88 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 10 Jan 2020 22:25:05 +0100 Subject: [PATCH 10/10] bump version --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index bc1fc4e5..1b76d41b 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "Plots" uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" author = ["Tom Breloff (@tbreloff)"] -version = "0.28.4" +version = "0.28.5" [deps] Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"