From f75ae01c16aa025064f182dfdfffe17ae5812e4e Mon Sep 17 00:00:00 2001 From: yha Date: Thu, 13 Jun 2019 16:30:21 +0300 Subject: [PATCH 001/357] Series attribute to show empty bins as 0. --- src/arg_desc.jl | 1 + src/args.jl | 2 ++ src/backends.jl | 2 +- src/examples.jl | 10 ++++++++++ src/recipes.jl | 14 ++++++++------ 5 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/arg_desc.jl b/src/arg_desc.jl index 13e42645..7d501762 100644 --- a/src/arg_desc.jl +++ b/src/arg_desc.jl @@ -42,6 +42,7 @@ const _arg_desc = KW( :arrow => "nothing (no arrows), Bool (if true, default arrows), Arrow object, or arg(s) that could be style or head length/widths. Defines arrowheads that should be displayed at the end of path line segments (just before a NaN and the last non-NaN point). Used in quiverplot, streamplot, or similar.", :normalize => "Bool or Symbol. Histogram normalization mode. Possible values are: false/:none (no normalization, default), true/:pdf (normalize to a discrete Probability Density Function, where the total area of the bins is 1), :probability (bin heights sum to 1) and :density (the area of each bin, rather than the height, is equal to the counts - useful for uneven bin sizes).", :weights => "AbstractVector. Used in histogram types for weighted counts.", +:show_empty_bins => "Bool. Whether empty bins in a 2D histogram are colored as 0 (true), or transparent (the default).", :contours => "Bool. Add contours to the side-grids of 3D plots? Used in surface/wireframe.", :contour_labels => "Bool. Show labels at the contour lines?", :match_dimensions => "Bool. For heatmap types... should the first dimension of a matrix (rows) correspond to the first dimension of the plot (x-axis)? The default is false, which matches the behavior of Matplotlib, Plotly, and others. Note: when passing a function for z, the function should still map `(x,y) -> z`.", diff --git a/src/args.jl b/src/args.jl index 6f719bae..769bf76d 100644 --- a/src/args.jl +++ b/src/args.jl @@ -272,6 +272,7 @@ const _series_defaults = KW( :arrow => nothing, # allows for adding arrows to line/path... call `arrow(args...)` :normalize => false, # do we want a normalized histogram? :weights => nothing, # optional weights for histograms (1D and 2D) + :show_empty_bins => false, # should empty bins in 2D histogram be colored as zero (otherwise they are transparent) :contours => false, # add contours to 3d surface and wireframe plots :contour_labels => false, :match_dimensions => false, # do rows match x (true) or y (false) for heatmap/image/spy? see issue 196 @@ -574,6 +575,7 @@ add_aliases(:xerror, :xerr, :xerrorbar) add_aliases(:yerror, :yerr, :yerrorbar, :err, :errorbar) add_aliases(:quiver, :velocity, :quiver2d, :gradient, :vectorfield) add_aliases(:normalize, :norm, :normed, :normalized) +add_aliases(:show_empty_bins, :showemptybins, :showempty, :show_empty, :show_zeros, :showzeros) add_aliases(:aspect_ratio, :aspectratio, :axis_ratio, :axisratio, :ratio) add_aliases(:match_dimensions, :transpose, :transpose_z) add_aliases(:subplot, :sp, :subplt, :splt) diff --git a/src/backends.jl b/src/backends.jl index 8cb4c0ce..80953dd0 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -234,7 +234,7 @@ const _base_supported_args = [ :subplot_index, :discrete_values, :projection, - + :show_empty_bins ] function merge_with_base_supported(v::AVec) diff --git a/src/examples.jl b/src/examples.jl index 6dd1b7f4..f328f7df 100644 --- a/src/examples.jl +++ b/src/examples.jl @@ -129,6 +129,16 @@ PlotExample("Histogram2D", end)] ), +PlotExample("Histogram2D (complex values)", + "", + [:(begin + n = 10_000 + x = exp.(0.1randn(n) .+ randn(n).*(im)) + histogram2d(x, nbins=(20,40), show_empty_bins=true, + normed=true, aspect_ratio=1) + end)] +), + PlotExample("Line types", "", [:(begin diff --git a/src/recipes.jl b/src/recipes.jl index ca2468e1..fa29f0c4 100644 --- a/src/recipes.jl +++ b/src/recipes.jl @@ -755,12 +755,14 @@ end edge_x, edge_y, weights = x, y, z.surf float_weights = float(weights) - if float_weights === weights - float_weights = deepcopy(float_weights) - end - for (i, c) in enumerate(float_weights) - if c == 0 - float_weights[i] = NaN + if !plotattributes[:show_empty_bins] + if float_weights === weights + float_weights = deepcopy(float_weights) + end + for (i, c) in enumerate(float_weights) + if c == 0 + float_weights[i] = NaN + end end end From 9a6e0b3a5449df77fb276a67d61289b2b2e108e2 Mon Sep 17 00:00:00 2001 From: yha Date: Thu, 13 Jun 2019 17:01:39 +0300 Subject: [PATCH 002/357] remove aliases :showzeros, :show_zeros --- src/args.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/args.jl b/src/args.jl index 769bf76d..dc547f36 100644 --- a/src/args.jl +++ b/src/args.jl @@ -575,7 +575,7 @@ add_aliases(:xerror, :xerr, :xerrorbar) add_aliases(:yerror, :yerr, :yerrorbar, :err, :errorbar) add_aliases(:quiver, :velocity, :quiver2d, :gradient, :vectorfield) add_aliases(:normalize, :norm, :normed, :normalized) -add_aliases(:show_empty_bins, :showemptybins, :showempty, :show_empty, :show_zeros, :showzeros) +add_aliases(:show_empty_bins, :showemptybins, :showempty, :show_empty) add_aliases(:aspect_ratio, :aspectratio, :axis_ratio, :axisratio, :ratio) add_aliases(:match_dimensions, :transpose, :transpose_z) add_aliases(:subplot, :sp, :subplt, :splt) From 3614966241fcd3120463f763647c804f748d1e82 Mon Sep 17 00:00:00 2001 From: yha Date: Mon, 17 Jun 2019 00:10:53 +0300 Subject: [PATCH 003/357] Moved new example to end to allow PlotsReferenceImages update --- src/examples.jl | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/examples.jl b/src/examples.jl index f328f7df..c5100863 100644 --- a/src/examples.jl +++ b/src/examples.jl @@ -129,16 +129,6 @@ PlotExample("Histogram2D", end)] ), -PlotExample("Histogram2D (complex values)", - "", - [:(begin - n = 10_000 - x = exp.(0.1randn(n) .+ randn(n).*(im)) - histogram2d(x, nbins=(20,40), show_empty_bins=true, - normed=true, aspect_ratio=1) - end)] -), - PlotExample("Line types", "", [:(begin @@ -464,6 +454,16 @@ see: http://stackoverflow.com/a/37732384/5075246 end)] ), +PlotExample("Histogram2D (complex values)", + "", + [:(begin + n = 10_000 + x = exp.(0.1randn(n) .+ randn(n).*(im)) + histogram2d(x, nbins=(20,40), show_empty_bins=true, + normed=true, aspect_ratio=1) + end)] +), + ] # Some constants for PlotDocs and PlotReferenceImages From 5619feb6c0a918906322aa45b2a71504ad40cb4c Mon Sep 17 00:00:00 2001 From: JackDevine Date: Tue, 6 Aug 2019 20:40:09 +1200 Subject: [PATCH 004/357] Expand paths beginning with ~ on unix systems. --- src/animation.jl | 2 +- src/output.jl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/animation.jl b/src/animation.jl index b6d45f36..828cdb47 100644 --- a/src/animation.jl +++ b/src/animation.jl @@ -70,7 +70,7 @@ function buildanimation(animdir::AbstractString, fn::AbstractString, fps::Integer = 20, loop::Integer = 0, variable_palette::Bool=false, show_msg::Bool=true) - fn = abspath(fn) + fn = abspath(expanduser(fn)) if is_animated_gif if variable_palette diff --git a/src/output.jl b/src/output.jl index 95a9c158..bbc7b80e 100644 --- a/src/output.jl +++ b/src/output.jl @@ -103,7 +103,7 @@ type is inferred from the file extension. All backends support png and pdf file types, some also support svg, ps, eps, html and tex. """ function savefig(plt::Plot, fn::AbstractString) - + fn = abspath(expanduser(fn)) # get the extension local ext try From a63a9248d6d9aafce6beb426178aa808086ba46d Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Tue, 6 Aug 2019 14:05:35 +0200 Subject: [PATCH 005/357] handle chars --- src/series.jl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/series.jl b/src/series.jl index 023c7c4b..d494a342 100644 --- a/src/series.jl +++ b/src/series.jl @@ -7,12 +7,12 @@ # note: returns meta information... mainly for use with automatic labeling from DataFrames for now const FuncOrFuncs{F} = Union{F, Vector{F}, Matrix{F}} -const DataPoint = Union{Number, AbstractString, Missing} +const DataPoint = Union{Number, AbstractString, AbstractChar, Missing} 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) = handlemissings(s) +prepareSeriesData(s::SeriesData) = handlemissings(handlechars(s)) handlemissings(v) = v handlemissings(v::AbstractArray{Union{T,Missing}}) where T <: Number = replace(v, missing => NaN) @@ -20,6 +20,9 @@ handlemissings(v::AbstractArray{Union{T,Missing}}) where T <: AbstractString = r handlemissings(s::Surface) = Surface(handlemissings(s.surf)) handlemissings(v::Volume) = Volume(handlemissings(v.v), v.x_extents, v.y_extents, v.z_extents) +handlechars(x) = x +handlechars(c::AVec{<:AbstractChar}) = string.(c) + # default: assume x represents a single series convertToAnyVector(x) = Any[prepareSeriesData(x)] From 89d02b1d673452ef8e347b0aaa8620aa66ddf8f6 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Tue, 6 Aug 2019 15:02:04 +0200 Subject: [PATCH 006/357] allow plotly plotting in ijulia --- src/backends/plotly.jl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index b9c6c7cf..ae109ab8 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -822,8 +822,6 @@ function html_head(plt::Plot{PlotlyBackend}) """) ijulia_initialized[] = true end - # IJulia just needs one initialization - isijulia() && return "" return "" end @@ -863,6 +861,11 @@ function _show(io::IO, ::MIME"application/vnd.plotly.v1+json", plot::Plot{Plotly end +function _show(io::IO, ::MIME"text/html", plt::Plot{PlotlyBackend}) + write(io, standalone_html(plt)) +end + + function _display(plt::Plot{PlotlyBackend}) standalone_html_window(plt) end From 9228c0b9ec66f2895ec7cc30e44a38b76938b251 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Tue, 6 Aug 2019 16:08:49 +0200 Subject: [PATCH 007/357] improve plotly html formatting --- src/backends/plotly.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index ae109ab8..007c3d05 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -347,7 +347,7 @@ function plotly_layout(plt::Plot) end function plotly_layout_json(plt::Plot) - JSON.json(plotly_layout(plt)) + JSON.json(plotly_layout(plt), 4) end @@ -800,7 +800,7 @@ function plotly_series(plt::Plot) end # get json string for a list of dictionaries, each representing the series params -plotly_series_json(plt::Plot) = JSON.json(plotly_series(plt)) +plotly_series_json(plt::Plot) = JSON.json(plotly_series(plt), 4) # ---------------------------------------------------------------- From 59da5d5debae8424f075e088dbb015f086ab2172 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 7 Aug 2019 09:27:05 +0200 Subject: [PATCH 008/357] prepare release --- NEWS.md | 7 +++++++ Project.toml | 2 +- src/Plots.jl | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index 08a760c3..0d3cfdba 100644 --- a/NEWS.md +++ b/NEWS.md @@ -11,6 +11,13 @@ --- ## (current master) +## 0.26.1 +- handle `Char`s as input data +- fix html saving for Plotly +- expand ~ in paths on UNIX systems +- convertToAnyVector clean-up +- fix color_palette grouping issue + ## 0.26.0 - use FFMPEG.jl - add missing method for convertToAnyVector diff --git a/Project.toml b/Project.toml index d61e259e..0b5fdd88 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.26.0" +version = "0.26.1" [deps] Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" diff --git a/src/Plots.jl b/src/Plots.jl index 4fd536b5..54d34615 100644 --- a/src/Plots.jl +++ b/src/Plots.jl @@ -1,6 +1,6 @@ module Plots -_current_plots_version = v"0.25.0" +_current_plots_version = v"0.26.1" using Reexport From 0e79070ad81d926b28fc52da32e7edba82b4c777 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 7 Aug 2019 16:39:39 +0200 Subject: [PATCH 009/357] create syncplot at show/display --- src/backends/plotlyjs.jl | 146 ++++++++++++++++++++++++--------------- 1 file changed, 90 insertions(+), 56 deletions(-) diff --git a/src/backends/plotlyjs.jl b/src/backends/plotlyjs.jl index 83952c71..ede8cbf6 100644 --- a/src/backends/plotlyjs.jl +++ b/src/backends/plotlyjs.jl @@ -2,77 +2,111 @@ # -------------------------------------------------------------------------------------- - -function _create_backend_figure(plt::Plot{PlotlyJSBackend}) - if !isplotnull() && plt[:overwrite_figure] && isa(current().o, PlotlyJS.SyncPlot) - PlotlyJS.SyncPlot(PlotlyJS.Plot(), options = current().o.options) - else - PlotlyJS.plot() +function plotlyjs_syncplot(plt::Plot{PlotlyJSBackend}) + plt[:overwrite_figure] && closeall() + plt.o = PlotlyJS.plot() + traces = PlotlyJS.GenericTrace[] + for series_dict in plotly_series(plt) + plotly_type = pop!(series_dict, :type) + push!(traces, PlotlyJS.GenericTrace(plotly_type; series_dict...)) end + PlotlyJS.addtraces!(plt.o, traces...) + layout = plotly_layout(plt) + w, h = plt[:size] + PlotlyJS.relayout!(plt.o, layout, width = w, height = h) + return plt.o end -function _series_added(plt::Plot{PlotlyJSBackend}, series::Series) - syncplot = plt.o - pdicts = plotly_series(plt, series) - for pdict in pdicts - typ = pop!(pdict, :type) - gt = PlotlyJS.GenericTrace(typ; pdict...) - PlotlyJS.addtraces!(syncplot, gt) - end -end - -function _series_updated(plt::Plot{PlotlyJSBackend}, series::Series) - xsym, ysym = (ispolar(series) ? (:t,:r) : (:x,:y)) - kw = KW(xsym => (series.plotattributes[:x],), ysym => (series.plotattributes[:y],)) - z = series[:z] - if z != nothing - kw[:z] = (isa(z,Surface) ? transpose_z(series, series[:z].surf, false) : z,) - end - PlotlyJS.restyle!( - plt.o, - findfirst(isequal(series), plt.series_list), - kw - ) -end +# function _create_backend_figure(plt::Plot{PlotlyJSBackend}) +# if !isplotnull() && plt[:overwrite_figure] && isa(current().o, PlotlyJS.SyncPlot) +# PlotlyJS.SyncPlot(PlotlyJS.Plot(), options = current().o.options) +# else +# PlotlyJS.plot() +# end +# end +# +# +# function _series_added(plt::Plot{PlotlyJSBackend}, series::Series) +# syncplot = plt.o +# pdicts = plotly_series(plt, series) +# for pdict in pdicts +# typ = pop!(pdict, :type) +# gt = PlotlyJS.GenericTrace(typ; pdict...) +# PlotlyJS.addtraces!(syncplot, gt) +# end +# end +# +# function _series_updated(plt::Plot{PlotlyJSBackend}, series::Series) +# xsym, ysym = (ispolar(series) ? (:t,:r) : (:x,:y)) +# kw = KW(xsym => (series.plotattributes[:x],), ysym => (series.plotattributes[:y],)) +# z = series[:z] +# if z != nothing +# kw[:z] = (isa(z,Surface) ? transpose_z(series, series[:z].surf, false) : z,) +# end +# PlotlyJS.restyle!( +# plt.o, +# findfirst(isequal(series), plt.series_list), +# kw +# ) +# end +# +# +# # ---------------------------------------------------------------- +# +# function _update_plot_object(plt::Plot{PlotlyJSBackend}) +# pdict = plotly_layout(plt) +# syncplot = plt.o +# w,h = plt[:size] +# PlotlyJS.relayout!(syncplot, pdict, width = w, height = h) +# end # ---------------------------------------------------------------- -function _update_plot_object(plt::Plot{PlotlyJSBackend}) - pdict = plotly_layout(plt) - syncplot = plt.o - w,h = plt[:size] - PlotlyJS.relayout!(syncplot, pdict, width = w, height = h) +const _plotlyjs_mimeformats = Dict( + "application/pdf" => "pdf", + "image/png" => "png", + "image/svg+xml" => "svg", + "image/eps" => "eps", +) + +for (mime, fmt) in _plotlyjs_mimeformats + @eval _show(io::IO, ::MIME{Symbol($mime)}, plt::Plot{PlotlyJSBackend}) = PlotlyJS.savefig(io, plotlyjs_syncplot(plt), format = $fmt) end +const _plotlyjs_showformats = ["text/html", "application/vnd.plotly.v1+json"] -# ---------------------------------------------------------------- - -_show(io::IO, ::MIME"text/html", plt::Plot{PlotlyJSBackend}) = show(io, MIME("text/html"), plt.o) -_show(io::IO, ::MIME"image/svg+xml", plt::Plot{PlotlyJSBackend}) = PlotlyJS.savefig(io, plt.o, format="svg") -_show(io::IO, ::MIME"image/png", plt::Plot{PlotlyJSBackend}) = PlotlyJS.savefig(io, plt.o, format="png") -_show(io::IO, ::MIME"application/pdf", plt::Plot{PlotlyJSBackend}) = PlotlyJS.savefig(io, plt.o, format="pdf") -_show(io::IO, ::MIME"image/eps", plt::Plot{PlotlyJSBackend}) = PlotlyJS.savefig(io, plt.o, format="eps") - -function _show(io::IO, m::MIME"application/vnd.plotly.v1+json", plt::Plot{PlotlyJSBackend}) - show(io, m, plt.o) +for mime in ["text/html", "application/vnd.plotly.v1+json"] + @eval _show(io::IO, mime::MIME{Symbol($mime)}, plt::Plot{PlotlyJSBackend}) = show(io, mime, plotlyjs_syncplot(plt)) end +# _show(io::IO, ::MIME"text/html", plt::Plot{PlotlyJSBackend}) = show(io, ::MIME"text/html", plt.o) +# _show(io::IO, ::MIME"image/svg+xml", plt::Plot{PlotlyJSBackend}) = PlotlyJS.savefig(io, plt.o, format="svg") +# _show(io::IO, ::MIME"image/png", plt::Plot{PlotlyJSBackend}) = PlotlyJS.savefig(io, plt.o, format="png") +# _show(io::IO, ::MIME"application/pdf", plt::Plot{PlotlyJSBackend}) = PlotlyJS.savefig(io, plt.o, format="pdf") +# _show(io::IO, ::MIME"image/eps", plt::Plot{PlotlyJSBackend}) = PlotlyJS.savefig(io, plt.o, format="eps") -function write_temp_html(plt::Plot{PlotlyJSBackend}) - filename = string(tempname(), ".html") - savefig(plt, filename) - filename -end +# function _show(io::IO, m::MIME"application/vnd.plotly.v1+json", plt::Plot{PlotlyJSBackend}) +# show(io, m, plt.o) +# end -function _display(plt::Plot{PlotlyJSBackend}) - if get(ENV, "PLOTS_USE_ATOM_PLOTPANE", true) in (true, 1, "1", "true", "yes") - display(plt.o) - else - standalone_html_window(plt) - end -end + +# function write_temp_html(plt::Plot{PlotlyJSBackend}) +# filename = string(tempname(), ".html") +# savefig(plt, filename) +# filename +# end + +_display(plt::Plot{PlotlyJSBackend}) = display(plotlyjs_syncplot(plt)) + +# function _display(plt::Plot{PlotlyJSBackend}) +# if get(ENV, "PLOTS_USE_ATOM_PLOTPANE", true) in (true, 1, "1", "true", "yes") +# display(plt.o) +# else +# standalone_html_window(plt) +# end +# end @require WebIO = "0f1e0344-ec1d-5b48-a673-e5cf874b6c29" begin function WebIO.render(plt::Plot{PlotlyJSBackend}) From 7ae43ee9f6a437adec17dfa47c35df044791c808 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 7 Aug 2019 16:40:52 +0200 Subject: [PATCH 010/357] use plotly implementation for html/js/ijulia --- src/backends/plotly.jl | 20 +++++++++++++------- src/backends/plotlyjs.jl | 14 +++++++++++--- src/ijulia.jl | 5 ++++- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index 007c3d05..1896d37a 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -804,9 +804,12 @@ plotly_series_json(plt::Plot) = JSON.json(plotly_series(plt), 4) # ---------------------------------------------------------------- +html_head(plt::Plot{PlotlyBackend}) = plotly_html_head(plt) +html_body(plt::Plot{PlotlyBackend}) = plotly_html_body(plt) + const ijulia_initialized = Ref(false) -function html_head(plt::Plot{PlotlyBackend}) +function plotly_html_head(plt::Plot) local_file = ("file://" * plotly_local_file_path) plotly = use_local_dependencies[] ? local_file : plotly_remote_file_path if isijulia() && !ijulia_initialized[] @@ -825,7 +828,7 @@ function html_head(plt::Plot{PlotlyBackend}) return "" end -function html_body(plt::Plot{PlotlyBackend}, style = nothing) +function plotly_html_body(plt, style = nothing) if style == nothing w, h = plt[:size] style = "width:$(w)px;height:$(h)px;" @@ -841,17 +844,14 @@ function html_body(plt::Plot{PlotlyBackend}, style = nothing) html end -function js_body(plt::Plot{PlotlyBackend}, uuid) +function js_body(plt::Plot, uuid) js = """ PLOT = document.getElementById('$(uuid)'); Plotly.plot(PLOT, $(plotly_series_json(plt)), $(plotly_layout_json(plt))); """ end - -# ---------------------------------------------------------------- - -function _show(io::IO, ::MIME"application/vnd.plotly.v1+json", plot::Plot{PlotlyBackend}) +function plotly_show_js(io::IO, plot::Plot) data = [] for series in plot.series_list append!(data, plotly_series(plot, series)) @@ -860,6 +860,12 @@ function _show(io::IO, ::MIME"application/vnd.plotly.v1+json", plot::Plot{Plotly JSON.print(io, Dict(:data => data, :layout => layout)) end +# ---------------------------------------------------------------- + +function _show(io::IO, ::MIME"application/vnd.plotly.v1+json", plot::Plot{PlotlyBackend}) + plotly_show_js(io, plot) +end + function _show(io::IO, ::MIME"text/html", plt::Plot{PlotlyBackend}) write(io, standalone_html(plt)) diff --git a/src/backends/plotlyjs.jl b/src/backends/plotlyjs.jl index ede8cbf6..8e742e4f 100644 --- a/src/backends/plotlyjs.jl +++ b/src/backends/plotlyjs.jl @@ -77,9 +77,17 @@ end const _plotlyjs_showformats = ["text/html", "application/vnd.plotly.v1+json"] -for mime in ["text/html", "application/vnd.plotly.v1+json"] - @eval _show(io::IO, mime::MIME{Symbol($mime)}, plt::Plot{PlotlyJSBackend}) = show(io, mime, plotlyjs_syncplot(plt)) -end +# for mime in ["text/html", "application/vnd.plotly.v1+json"] +# @eval _show(io::IO, mime::MIME{Symbol($mime)}, plt::Plot{PlotlyJSBackend}) = show(io, mime, plotlyjs_syncplot(plt)) +# end + +# Use the Plotly implementation for json and html: +_show(io::IO, mime::MIME"application/vnd.plotly.v1+json", plt::Plot{PlotlyJSBackend}) = plotly_show_js(io, plot) + +html_head(plt::Plot{PlotlyJSBackend}) = plotly_html_head(plt) +html_body(plt::Plot{PlotlyJSBackend}) = plotly_html_body(plt) + +_show(io::IO, ::MIME"text/html", plt::Plot{PlotlyJSBackend}) = write(io, standalone_html(plt)) # _show(io::IO, ::MIME"text/html", plt::Plot{PlotlyJSBackend}) = show(io, ::MIME"text/html", plt.o) # _show(io::IO, ::MIME"image/svg+xml", plt::Plot{PlotlyJSBackend}) = PlotlyJS.savefig(io, plt.o, format="svg") diff --git a/src/ijulia.jl b/src/ijulia.jl index a54c0ca9..1f0ef219 100644 --- a/src/ijulia.jl +++ b/src/ijulia.jl @@ -20,7 +20,10 @@ frontends like jupyterlab and nteract. _ijulia__extra_mime_info!(plt::Plot, out::Dict) = out function _ijulia__extra_mime_info!(plt::Plot{PlotlyJSBackend}, out::Dict) - out["application/vnd.plotly.v1+json"] = JSON.lower(plt.o) + out["application/vnd.plotly.v1+json"] = Dict( + :data => plotly_series(plt), + :layout => plotly_layout(plt) + ) out end From ac24a4ae19cf4efd562c51d33d9bccbc01789967 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 7 Aug 2019 16:50:09 +0200 Subject: [PATCH 011/357] cleanup --- src/backends/plotlyjs.jl | 78 +--------------------------------------- 1 file changed, 1 insertion(+), 77 deletions(-) diff --git a/src/backends/plotlyjs.jl b/src/backends/plotlyjs.jl index 8e742e4f..34585d31 100644 --- a/src/backends/plotlyjs.jl +++ b/src/backends/plotlyjs.jl @@ -17,51 +17,6 @@ function plotlyjs_syncplot(plt::Plot{PlotlyJSBackend}) return plt.o end - -# function _create_backend_figure(plt::Plot{PlotlyJSBackend}) -# if !isplotnull() && plt[:overwrite_figure] && isa(current().o, PlotlyJS.SyncPlot) -# PlotlyJS.SyncPlot(PlotlyJS.Plot(), options = current().o.options) -# else -# PlotlyJS.plot() -# end -# end -# -# -# function _series_added(plt::Plot{PlotlyJSBackend}, series::Series) -# syncplot = plt.o -# pdicts = plotly_series(plt, series) -# for pdict in pdicts -# typ = pop!(pdict, :type) -# gt = PlotlyJS.GenericTrace(typ; pdict...) -# PlotlyJS.addtraces!(syncplot, gt) -# end -# end -# -# function _series_updated(plt::Plot{PlotlyJSBackend}, series::Series) -# xsym, ysym = (ispolar(series) ? (:t,:r) : (:x,:y)) -# kw = KW(xsym => (series.plotattributes[:x],), ysym => (series.plotattributes[:y],)) -# z = series[:z] -# if z != nothing -# kw[:z] = (isa(z,Surface) ? transpose_z(series, series[:z].surf, false) : z,) -# end -# PlotlyJS.restyle!( -# plt.o, -# findfirst(isequal(series), plt.series_list), -# kw -# ) -# end -# -# -# # ---------------------------------------------------------------- -# -# function _update_plot_object(plt::Plot{PlotlyJSBackend}) -# pdict = plotly_layout(plt) -# syncplot = plt.o -# w,h = plt[:size] -# PlotlyJS.relayout!(syncplot, pdict, width = w, height = h) -# end - - # ---------------------------------------------------------------- const _plotlyjs_mimeformats = Dict( @@ -75,47 +30,16 @@ for (mime, fmt) in _plotlyjs_mimeformats @eval _show(io::IO, ::MIME{Symbol($mime)}, plt::Plot{PlotlyJSBackend}) = PlotlyJS.savefig(io, plotlyjs_syncplot(plt), format = $fmt) end -const _plotlyjs_showformats = ["text/html", "application/vnd.plotly.v1+json"] - -# for mime in ["text/html", "application/vnd.plotly.v1+json"] -# @eval _show(io::IO, mime::MIME{Symbol($mime)}, plt::Plot{PlotlyJSBackend}) = show(io, mime, plotlyjs_syncplot(plt)) -# end - # Use the Plotly implementation for json and html: -_show(io::IO, mime::MIME"application/vnd.plotly.v1+json", plt::Plot{PlotlyJSBackend}) = plotly_show_js(io, plot) +_show(io::IO, mime::MIME"application/vnd.plotly.v1+json", plt::Plot{PlotlyJSBackend}) = plotly_show_js(io, plt) html_head(plt::Plot{PlotlyJSBackend}) = plotly_html_head(plt) html_body(plt::Plot{PlotlyJSBackend}) = plotly_html_body(plt) _show(io::IO, ::MIME"text/html", plt::Plot{PlotlyJSBackend}) = write(io, standalone_html(plt)) -# _show(io::IO, ::MIME"text/html", plt::Plot{PlotlyJSBackend}) = show(io, ::MIME"text/html", plt.o) -# _show(io::IO, ::MIME"image/svg+xml", plt::Plot{PlotlyJSBackend}) = PlotlyJS.savefig(io, plt.o, format="svg") -# _show(io::IO, ::MIME"image/png", plt::Plot{PlotlyJSBackend}) = PlotlyJS.savefig(io, plt.o, format="png") -# _show(io::IO, ::MIME"application/pdf", plt::Plot{PlotlyJSBackend}) = PlotlyJS.savefig(io, plt.o, format="pdf") -# _show(io::IO, ::MIME"image/eps", plt::Plot{PlotlyJSBackend}) = PlotlyJS.savefig(io, plt.o, format="eps") - -# function _show(io::IO, m::MIME"application/vnd.plotly.v1+json", plt::Plot{PlotlyJSBackend}) -# show(io, m, plt.o) -# end - - -# function write_temp_html(plt::Plot{PlotlyJSBackend}) -# filename = string(tempname(), ".html") -# savefig(plt, filename) -# filename -# end - _display(plt::Plot{PlotlyJSBackend}) = display(plotlyjs_syncplot(plt)) -# function _display(plt::Plot{PlotlyJSBackend}) -# if get(ENV, "PLOTS_USE_ATOM_PLOTPANE", true) in (true, 1, "1", "true", "yes") -# display(plt.o) -# else -# standalone_html_window(plt) -# end -# end - @require WebIO = "0f1e0344-ec1d-5b48-a673-e5cf874b6c29" begin function WebIO.render(plt::Plot{PlotlyJSBackend}) prepare_output(plt) From ad051f21c10e6ce1bbe534c6008e7cc0399c2136 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 7 Aug 2019 21:45:55 +0200 Subject: [PATCH 012/357] small cosmetics --- src/backends/plotlyjs.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backends/plotlyjs.jl b/src/backends/plotlyjs.jl index 34585d31..5893ece3 100644 --- a/src/backends/plotlyjs.jl +++ b/src/backends/plotlyjs.jl @@ -1,6 +1,6 @@ # https://github.com/sglyon/PlotlyJS.jl -# -------------------------------------------------------------------------------------- +# ------------------------------------------------------------------------------ function plotlyjs_syncplot(plt::Plot{PlotlyJSBackend}) plt[:overwrite_figure] && closeall() @@ -17,7 +17,7 @@ function plotlyjs_syncplot(plt::Plot{PlotlyJSBackend}) return plt.o end -# ---------------------------------------------------------------- +# ------------------------------------------------------------------------------ const _plotlyjs_mimeformats = Dict( "application/pdf" => "pdf", From fe80e486aaf63ba33afd40f93670dd75e6953bc4 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Thu, 8 Aug 2019 12:58:29 +0200 Subject: [PATCH 013/357] don't return undef dict --- src/backends/plotly.jl | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index 007c3d05..9241fc8d 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -631,11 +631,9 @@ function plotly_series_segments(series::Series, plotattributes_base::KW, x, y, z (isa(series[:fillrange], AbstractVector) || isa(series[:fillrange], Tuple)) segments = iter_segments(series) - plotattributes_outs = Vector{KW}(undef, (hasfillrange ? 2 : 1 ) * length(segments)) + plotattributes_outs = fill(KW(), (hasfillrange ? 2 : 1 ) * length(segments)) for (i,rng) in enumerate(segments) - !isscatter && length(rng) < 2 && continue - plotattributes_out = deepcopy(plotattributes_base) plotattributes_out[:showlegend] = i==1 ? should_add_to_legend(series) : false plotattributes_out[:legendgroup] = series[:label] From 9e35cc3fe1ee7cf32b37cd755035492385ea8d3f Mon Sep 17 00:00:00 2001 From: yha Date: Thu, 8 Aug 2019 19:05:53 +0300 Subject: [PATCH 014/357] Recipe for plotting dicts as bars. --- src/series.jl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/series.jl b/src/series.jl index d494a342..b20f045e 100644 --- a/src/series.jl +++ b/src/series.jl @@ -352,7 +352,12 @@ end end end +# Dicts with Real values are plotted as bars +@recipe function f(d::AbstractDict{T,<:Real}) where T + seriestype --> :bar + x, y = collect(keys(d)), collect(values(d)) +end # function without range... use the current range of the x-axis From 57ebeae1add75604e773b9e0dc9d758e63784541 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 9 Aug 2019 01:12:39 +0300 Subject: [PATCH 015/357] Replace low-level Char handling with a type recipe. --- src/recipes.jl | 5 +++++ src/series.jl | 7 ++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/recipes.jl b/src/recipes.jl index 9be74970..9227f189 100644 --- a/src/recipes.jl +++ b/src/recipes.jl @@ -1101,6 +1101,11 @@ timeformatter(t) = string(Dates.Time(Dates.Nanosecond(t))) @recipe f(::Type{Dates.Time}, t::Dates.Time) = (t -> Dates.value(t), timeformatter) @recipe f(::Type{P}, t::P) where P <: Dates.Period = (t -> Dates.value(t), t -> string(P(t))) +# ------------------------------------------------- +# Characters + +@recipe f(::Type{<:AbstractChar}, ::AbstractChar) = (string, string) + # ------------------------------------------------- # Complex Numbers diff --git a/src/series.jl b/src/series.jl index d494a342..023c7c4b 100644 --- a/src/series.jl +++ b/src/series.jl @@ -7,12 +7,12 @@ # note: returns meta information... mainly for use with automatic labeling from DataFrames for now const FuncOrFuncs{F} = Union{F, Vector{F}, Matrix{F}} -const DataPoint = Union{Number, AbstractString, AbstractChar, Missing} +const DataPoint = Union{Number, AbstractString, Missing} 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) = handlemissings(handlechars(s)) +prepareSeriesData(s::SeriesData) = handlemissings(s) handlemissings(v) = v handlemissings(v::AbstractArray{Union{T,Missing}}) where T <: Number = replace(v, missing => NaN) @@ -20,9 +20,6 @@ handlemissings(v::AbstractArray{Union{T,Missing}}) where T <: AbstractString = r handlemissings(s::Surface) = Surface(handlemissings(s.surf)) handlemissings(v::Volume) = Volume(handlemissings(v.v), v.x_extents, v.y_extents, v.z_extents) -handlechars(x) = x -handlechars(c::AVec{<:AbstractChar}) = string.(c) - # default: assume x represents a single series convertToAnyVector(x) = Any[prepareSeriesData(x)] From 0fd24e5210c4592ccf557ca1e4f8531619689271 Mon Sep 17 00:00:00 2001 From: yha Date: Mon, 12 Aug 2019 14:12:00 +0300 Subject: [PATCH 016/357] Generalize dict recipe for any element type. Do not default to :bar seriestype. --- src/series.jl | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/series.jl b/src/series.jl index b20f045e..20acc391 100644 --- a/src/series.jl +++ b/src/series.jl @@ -352,12 +352,9 @@ end end end -# Dicts with Real values are plotted as bars +# Dicts: each entry is a data point (x,y)=(key,value) -@recipe function f(d::AbstractDict{T,<:Real}) where T - seriestype --> :bar - x, y = collect(keys(d)), collect(values(d)) -end +@recipe f(d::AbstractDict) = collect(keys(d)), collect(values(d)) # function without range... use the current range of the x-axis From b2707f5c8a0f5f4842bccced1d9529554f22cf5b Mon Sep 17 00:00:00 2001 From: yha Date: Tue, 13 Aug 2019 15:27:01 +0300 Subject: [PATCH 017/357] Fix ribbons specified as two-tuples. --- src/series.jl | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/series.jl b/src/series.jl index 023c7c4b..7928ba53 100644 --- a/src/series.jl +++ b/src/series.jl @@ -35,6 +35,20 @@ convertToAnyVector(v::AVec) = vcat((convertToAnyVector(vi) for vi in v)...) # Matrix is split into columns convertToAnyVector(v::AMat{<:DataPoint}) = Any[prepareSeriesData(v[:,i]) for i in 1:size(v,2)] +# -------------------------------------------------------------------- +# Fillrane & ribbons + + +process_fillrange(range::Number) = [range] +process_fillrange(range) = convertToAnyVector(range) + +process_ribbon(ribbon::Number) = [ribbon] +process_ribbon(ribbon) = convertToAnyVector(ribbon) +# ribbon as a tuple: (lower_ribbons, upper_ribbons) +process_ribbon(ribbon::Tuple{Any,Any}) = collect(zip(convertToAnyVector(ribbon[1]), + convertToAnyVector(ribbon[2]))) + + # -------------------------------------------------------------------- # TODO: can we avoid the copy here? one error that crops up is that mapping functions over the same array @@ -102,19 +116,11 @@ struct SliceIt end fr = pop!(plotattributes, :fillrange, nothing) - fillranges = if typeof(fr) <: Number - [fr] - else - convertToAnyVector(fr) - end + fillranges = process_fillrange(fr) mf = length(fillranges) rib = pop!(plotattributes, :ribbon, nothing) - ribbons = if typeof(rib) <: Number - [rib] - else - convertToAnyVector(rib) - end + ribbons = process_ribbon(rib) mr = length(ribbons) # @show zs From 69e83ef89fe4ef855402e020fe950a6d82cef39f Mon Sep 17 00:00:00 2001 From: yha Date: Tue, 13 Aug 2019 17:05:36 +0300 Subject: [PATCH 018/357] Typo fix --- src/series.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/series.jl b/src/series.jl index 7928ba53..f3731fc9 100644 --- a/src/series.jl +++ b/src/series.jl @@ -36,7 +36,7 @@ convertToAnyVector(v::AVec) = vcat((convertToAnyVector(vi) for vi in v)...) convertToAnyVector(v::AMat{<:DataPoint}) = Any[prepareSeriesData(v[:,i]) for i in 1:size(v,2)] # -------------------------------------------------------------------- -# Fillrane & ribbons +# Fillranges & ribbons process_fillrange(range::Number) = [range] From 6e1ed63005a636f019566635936b6f77cf104d8f Mon Sep 17 00:00:00 2001 From: yha Date: Tue, 13 Aug 2019 17:46:22 +0300 Subject: [PATCH 019/357] Fix GR axis flip for heatmap & image by removing "manual" axis flip --- src/backends/gr.jl | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 0fa3d210..691daa83 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -1337,9 +1337,6 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) if !ispolar(sp) xmin, xmax, ymin, ymax = xy_lims m, n = length(x), length(y) - xinds = sort(1:m, rev = xaxis[:flip]) - yinds = sort(1:n, rev = yaxis[:flip]) - z = reshape(reshape(z, m, n)[xinds, yinds], m*n) GR.setspace(zmin, zmax, 0, 90) grad = isa(series[:fillcolor], ColorGradient) ? series[:fillcolor] : cgrad() colors = [plot_color(grad[clamp((zi-zmin) / (zmax-zmin), 0, 1)], series[:fillalpha]) for zi=z] @@ -1454,9 +1451,6 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) elseif st == :image z = transpose_z(series, series[:z].surf, true)' w, h = size(z) - xinds = sort(1:w, rev = xaxis[:flip]) - yinds = sort(1:h, rev = yaxis[:flip]) - z = z[xinds, yinds] xmin, xmax = ignorenan_extrema(series[:x]); ymin, ymax = ignorenan_extrema(series[:y]) if eltype(z) <: Colors.AbstractGray grey = round.(UInt8, clamp.(float(z) * 255, 0, 255)) From 2072c54c53158c7f693bf7ee9988caee9dac6ef0 Mon Sep 17 00:00:00 2001 From: benchislett Date: Wed, 14 Aug 2019 00:03:19 +0900 Subject: [PATCH 020/357] Add handling for animation build with 0 frames --- src/animation.jl | 13 +++++++++---- test/runtests.jl | 7 +++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/animation.jl b/src/animation.jl index 828cdb47..7d55b567 100644 --- a/src/animation.jl +++ b/src/animation.jl @@ -60,17 +60,22 @@ end file_extension(fn) = Base.Filesystem.splitext(fn)[2][2:end] -gif(anim::Animation, fn = giffn(); kw...) = buildanimation(anim.dir, fn; kw...) -mov(anim::Animation, fn = movfn(); kw...) = buildanimation(anim.dir, fn, false; kw...) -mp4(anim::Animation, fn = mp4fn(); kw...) = buildanimation(anim.dir, fn, false; kw...) +gif(anim::Animation, fn = giffn(); kw...) = buildanimation(anim, fn; kw...) +mov(anim::Animation, fn = movfn(); kw...) = buildanimation(anim, fn, false; kw...) +mp4(anim::Animation, fn = mp4fn(); kw...) = buildanimation(anim, fn, false; kw...) -function buildanimation(animdir::AbstractString, fn::AbstractString, +function buildanimation(anim::Animation, fn::AbstractString, is_animated_gif::Bool=true; fps::Integer = 20, loop::Integer = 0, variable_palette::Bool=false, show_msg::Bool=true) + if length(anim.frames) == 0 + throw(ArgumentError("Cannot build empty animations")) + end + fn = abspath(expanduser(fn)) + animdir = anim.dir if is_animated_gif if variable_palette diff --git a/test/runtests.jl b/test/runtests.jl index 0b73b148..b0515c58 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -63,6 +63,13 @@ end end end +@testset "EmptyAnim" begin + anim = @animate for i in [] + end + + @test_throws ArgumentError gif(anim) +end + @testset "Segments" begin function segments(args...) segs = UnitRange{Int}[] From 0a97b08c7225d3c17f6252b5756549e6f25c01a8 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 14 Aug 2019 12:31:56 +0200 Subject: [PATCH 021/357] prepare release --- NEWS.md | 8 ++++++++ Project.toml | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index 0d3cfdba..2295b891 100644 --- a/NEWS.md +++ b/NEWS.md @@ -11,6 +11,14 @@ --- ## (current master) +## 0.26.2 +- improve empty animation build error +- fix GR axis flip for heatmaps and images +- fix ribbons specified as tuples +- add Char recipe +- fix Plotly plots with single-element series +- rewrite PlotlyJS backend + ## 0.26.1 - handle `Char`s as input data - fix html saving for Plotly diff --git a/Project.toml b/Project.toml index 0b5fdd88..6de366a5 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.26.1" +version = "0.26.2" [deps] Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" From f12f6db3100a2a6150de6ba118f56dc998a74c43 Mon Sep 17 00:00:00 2001 From: Chris Rackauckas Date: Sat, 17 Aug 2019 14:17:27 -0400 Subject: [PATCH 022/357] use === nothing Should decrease compile times --- src/args.jl | 58 +++++++++++++++++++++--------------------- src/axes.jl | 10 ++++---- src/backends.jl | 2 +- src/backends/gr.jl | 6 ++--- src/backends/plotly.jl | 2 +- src/backends/pyplot.jl | 8 +++--- src/components.jl | 2 +- src/plot.jl | 2 +- src/recipes.jl | 12 ++++----- src/utils.jl | 20 +++++++-------- test/imgcomp.jl | 4 +-- 11 files changed, 63 insertions(+), 63 deletions(-) diff --git a/src/args.jl b/src/args.jl index 6f719bae..68c72455 100644 --- a/src/args.jl +++ b/src/args.jl @@ -685,15 +685,15 @@ function processLineArg(plotattributes::KW, arg) plotattributes[:linestyle] = arg elseif typeof(arg) <: Stroke - arg.width == nothing || (plotattributes[:linewidth] = arg.width) - arg.color == nothing || (plotattributes[:linecolor] = arg.color == :auto ? :auto : plot_color(arg.color)) - arg.alpha == nothing || (plotattributes[:linealpha] = arg.alpha) - arg.style == nothing || (plotattributes[:linestyle] = arg.style) + arg.width === nothing || (plotattributes[:linewidth] = arg.width) + arg.color === nothing || (plotattributes[:linecolor] = arg.color == :auto ? :auto : plot_color(arg.color)) + arg.alpha === nothing || (plotattributes[:linealpha] = arg.alpha) + arg.style === nothing || (plotattributes[:linestyle] = arg.style) elseif typeof(arg) <: Brush - arg.size == nothing || (plotattributes[:fillrange] = arg.size) - arg.color == nothing || (plotattributes[:fillcolor] = arg.color == :auto ? :auto : plot_color(arg.color)) - arg.alpha == nothing || (plotattributes[:fillalpha] = arg.alpha) + arg.size === nothing || (plotattributes[:fillrange] = arg.size) + arg.color === nothing || (plotattributes[:fillcolor] = arg.color == :auto ? :auto : plot_color(arg.color)) + arg.alpha === nothing || (plotattributes[:fillalpha] = arg.alpha) elseif typeof(arg) <: Arrow || arg in (:arrow, :arrows) plotattributes[:arrow] = arg @@ -724,15 +724,15 @@ function processMarkerArg(plotattributes::KW, arg) plotattributes[:markerstrokestyle] = arg elseif typeof(arg) <: Stroke - arg.width == nothing || (plotattributes[:markerstrokewidth] = arg.width) - arg.color == nothing || (plotattributes[:markerstrokecolor] = arg.color == :auto ? :auto : plot_color(arg.color)) - arg.alpha == nothing || (plotattributes[:markerstrokealpha] = arg.alpha) - arg.style == nothing || (plotattributes[:markerstrokestyle] = arg.style) + arg.width === nothing || (plotattributes[:markerstrokewidth] = arg.width) + arg.color === nothing || (plotattributes[:markerstrokecolor] = arg.color == :auto ? :auto : plot_color(arg.color)) + arg.alpha === nothing || (plotattributes[:markerstrokealpha] = arg.alpha) + arg.style === nothing || (plotattributes[:markerstrokestyle] = arg.style) elseif typeof(arg) <: Brush - arg.size == nothing || (plotattributes[:markersize] = arg.size) - arg.color == nothing || (plotattributes[:markercolor] = arg.color == :auto ? :auto : plot_color(arg.color)) - arg.alpha == nothing || (plotattributes[:markeralpha] = arg.alpha) + arg.size === nothing || (plotattributes[:markersize] = arg.size) + arg.color === nothing || (plotattributes[:markercolor] = arg.color == :auto ? :auto : plot_color(arg.color)) + arg.alpha === nothing || (plotattributes[:markeralpha] = arg.alpha) # linealpha elseif allAlphas(arg) @@ -757,9 +757,9 @@ end function processFillArg(plotattributes::KW, arg) # fr = get(plotattributes, :fillrange, 0) if typeof(arg) <: Brush - arg.size == nothing || (plotattributes[:fillrange] = arg.size) - arg.color == nothing || (plotattributes[:fillcolor] = arg.color == :auto ? :auto : plot_color(arg.color)) - arg.alpha == nothing || (plotattributes[:fillalpha] = arg.alpha) + arg.size === nothing || (plotattributes[:fillrange] = arg.size) + arg.color === nothing || (plotattributes[:fillcolor] = arg.color == :auto ? :auto : plot_color(arg.color)) + arg.alpha === nothing || (plotattributes[:fillalpha] = arg.alpha) elseif typeof(arg) <: Bool plotattributes[:fillrange] = arg ? 0 : nothing @@ -793,10 +793,10 @@ function processGridArg!(plotattributes::KW, arg, letter) plotattributes[Symbol(letter, :gridstyle)] = arg elseif typeof(arg) <: Stroke - arg.width == nothing || (plotattributes[Symbol(letter, :gridlinewidth)] = arg.width) - arg.color == nothing || (plotattributes[Symbol(letter, :foreground_color_grid)] = arg.color in (:auto, :match) ? :match : plot_color(arg.color)) - arg.alpha == nothing || (plotattributes[Symbol(letter, :gridalpha)] = arg.alpha) - arg.style == nothing || (plotattributes[Symbol(letter, :gridstyle)] = arg.style) + arg.width === nothing || (plotattributes[Symbol(letter, :gridlinewidth)] = arg.width) + arg.color === nothing || (plotattributes[Symbol(letter, :foreground_color_grid)] = arg.color in (:auto, :match) ? :match : plot_color(arg.color)) + arg.alpha === nothing || (plotattributes[Symbol(letter, :gridalpha)] = arg.alpha) + arg.style === nothing || (plotattributes[Symbol(letter, :gridstyle)] = arg.style) # linealpha elseif allAlphas(arg) @@ -822,10 +822,10 @@ function processMinorGridArg!(plotattributes::KW, arg, letter) plotattributes[Symbol(letter, :minorgrid)] = true elseif typeof(arg) <: Stroke - arg.width == nothing || (plotattributes[Symbol(letter, :minorgridlinewidth)] = arg.width) - arg.color == nothing || (plotattributes[Symbol(letter, :foreground_color_minor_grid)] = arg.color in (:auto, :match) ? :match : plot_color(arg.color)) - arg.alpha == nothing || (plotattributes[Symbol(letter, :minorgridalpha)] = arg.alpha) - arg.style == nothing || (plotattributes[Symbol(letter, :minorgridstyle)] = arg.style) + arg.width === nothing || (plotattributes[Symbol(letter, :minorgridlinewidth)] = arg.width) + arg.color === nothing || (plotattributes[Symbol(letter, :foreground_color_minor_grid)] = arg.color in (:auto, :match) ? :match : plot_color(arg.color)) + arg.alpha === nothing || (plotattributes[Symbol(letter, :minorgridalpha)] = arg.alpha) + arg.style === nothing || (plotattributes[Symbol(letter, :minorgridstyle)] = arg.style) plotattributes[Symbol(letter, :minorgrid)] = true # linealpha @@ -1237,7 +1237,7 @@ end # v = plotattributes[k] # plotattributes[k] = if v == :match # match_color -# elseif v == nothing +# elseif v === nothing # plot_color(RGBA(0,0,0,0)) # else # v @@ -1246,7 +1246,7 @@ end function color_or_nothing!(plotattributes::KW, k::Symbol) v = plotattributes[k] - plotattributes[k] = if v == nothing || v == false + plotattributes[k] = if v === nothing || v == false RGBA{Float64}(0,0,0,0) elseif v != :match plot_color(v) @@ -1563,11 +1563,11 @@ function _update_series_attributes!(plotattributes::KW, plt::Plot, sp::Subplot) # update alphas for asym in (:linealpha, :markeralpha, :fillalpha) - if plotattributes[asym] == nothing + if plotattributes[asym] === nothing plotattributes[asym] = plotattributes[:seriesalpha] end end - if plotattributes[:markerstrokealpha] == nothing + if plotattributes[:markerstrokealpha] === nothing plotattributes[:markerstrokealpha] = plotattributes[:markeralpha] end diff --git a/src/axes.jl b/src/axes.jl index 8ef97f7e..66a42793 100644 --- a/src/axes.jl +++ b/src/axes.jl @@ -67,7 +67,7 @@ function process_axis_arg!(plotattributes::KW, arg, letter = "") elseif T <: AVec plotattributes[Symbol(letter,:ticks)] = arg - elseif arg == nothing + elseif arg === nothing plotattributes[Symbol(letter,:ticks)] = [] elseif T <: Bool || arg in _allShowaxisArgs @@ -166,7 +166,7 @@ function optimal_ticks_and_labels(sp::Subplot, axis::Axis, ticks = nothing) # or DateTime) is chosen based on the time span between amin and amax # rather than on the input format # TODO: maybe: non-trivial scale (:ln, :log2, :log10) for date/datetime - if ticks == nothing && scale == :identity + if ticks === nothing && scale == :identity if axis[:formatter] == dateformatter # optimize_datetime_ticks returns ticks and labels(!) based on # integers/floats corresponding to the DateTime type. Thus, the axes @@ -184,7 +184,7 @@ function optimal_ticks_and_labels(sp::Subplot, axis::Axis, ticks = nothing) end # get a list of well-laid-out ticks - if ticks == nothing + if ticks === nothing scaled_ticks = optimize_ticks( sf(amin), sf(amax); @@ -399,7 +399,7 @@ function expand_extrema!(sp::Subplot, plotattributes::KW) # expand for fillrange fr = plotattributes[:fillrange] - if fr == nothing && plotattributes[:seriestype] == :bar + if fr === nothing && plotattributes[:seriestype] == :bar fr = 0.0 end if fr != nothing && !all3D(plotattributes) @@ -419,7 +419,7 @@ function expand_extrema!(sp::Subplot, plotattributes::KW) data = plotattributes[dsym] bw = plotattributes[:bar_width] - if bw == nothing + if bw === nothing bw = plotattributes[:bar_width] = _bar_width * ignorenan_minimum(filter(x->x>0,diff(sort(data)))) end axis = sp.attr[Symbol(dsym, :axis)] diff --git a/src/backends.jl b/src/backends.jl index a95b2dd2..01226e78 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -77,7 +77,7 @@ text_size(lab::AbstractString, sz::Number, rot::Number = 0) = text_size(length(l # account for the size/length/rotation of tick labels function tick_padding(sp::Subplot, axis::Axis) ticks = get_ticks(sp, axis) - if ticks == nothing + if ticks === nothing 0mm else vals, labs = ticks diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 691daa83..dd21e3a6 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -620,7 +620,7 @@ end function gr_set_gradient(series::Series) color = gr_get_color(series) - color !== nothing && gr_set_gradient(color) + color !=== nothing && gr_set_gradient(color) end function gr_get_color(series::Series) @@ -1509,7 +1509,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) lc = get_linecolor(series, clims) gr_set_line(get_linewidth(series), get_linestyle(series), lc) #, series[:linealpha]) - if (st == :shape || series[:fillrange] != nothing) && series[:ribbon] == nothing + if (st == :shape || series[:fillrange] != nothing) && series[:ribbon] === nothing fc = get_fillcolor(series, clims) gr_set_fill(fc) #, series[:fillalpha]) l, r = xpos-0.07, xpos-0.01 @@ -1526,7 +1526,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) if st in (:path, :straightline) gr_set_transparency(lc, get_linealpha(series)) - if series[:fillrange] == nothing || series[:ribbon] != nothing + if series[:fillrange] === nothing || series[:ribbon] != nothing GR.polyline([xpos - 0.07, xpos - 0.01], [ypos, ypos]) else GR.polyline([xpos - 0.07, xpos - 0.01], [ypos+0.4dy, ypos+0.4dy]) diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index bdad392a..78df1a84 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -827,7 +827,7 @@ function plotly_html_head(plt::Plot) end function plotly_html_body(plt, style = nothing) - if style == nothing + if style === nothing w, h = plt[:size] style = "width:$(w)px;height:$(h)px;" end diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index eec1e6ca..5751a43f 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -871,7 +871,7 @@ end function py_set_ticks(ax, ticks, letter) ticks == :auto && return axis = getproperty(ax, Symbol(letter,"axis")) - if ticks == :none || ticks == nothing || ticks == false + if ticks == :none || ticks === nothing || ticks == false kw = KW() for dir in (:top,:bottom,:left,:right) kw[dir] = kw[Symbol(:label,dir)] = false @@ -978,7 +978,7 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend}) # update subplots for sp in plt.subplots ax = sp.o - if ax == nothing + if ax === nothing continue end @@ -1186,7 +1186,7 @@ end # to fit ticks, tick labels, guides, colorbars, etc. function _update_min_padding!(sp::Subplot{PyPlotBackend}) ax = sp.o - ax == nothing && return sp.minpad + ax === nothing && return sp.minpad plotbb = py_bbox(ax) # TODO: this should initialize to the margin from sp.attr @@ -1352,7 +1352,7 @@ end function _update_plot_object(plt::Plot{PyPlotBackend}) for sp in plt.subplots ax = sp.o - ax == nothing && return + ax === nothing && return figw, figh = sp.plt[:size] figw, figh = figw*px, figh*px pcts = bbox_to_pcts(sp.plotarea, figw, figh) diff --git a/src/components.jl b/src/components.jl index 097aee19..4aa27043 100644 --- a/src/components.jl +++ b/src/components.jl @@ -568,7 +568,7 @@ mutable struct EachAnn end function Base.iterate(ea::EachAnn, i = 1) - if ea.anns == nothing || isempty(ea.anns.strs) || i > length(ea.y) + if ea.anns === nothing || isempty(ea.anns.strs) || i > length(ea.y) return nothing end diff --git a/src/plot.jl b/src/plot.jl index 2c2ecd48..4352403a 100644 --- a/src/plot.jl +++ b/src/plot.jl @@ -4,7 +4,7 @@ mutable struct CurrentPlot end const CURRENT_PLOT = CurrentPlot(nothing) -isplotnull() = CURRENT_PLOT.nullableplot == nothing +isplotnull() = CURRENT_PLOT.nullableplot === nothing """ current() diff --git a/src/recipes.jl b/src/recipes.jl index 9227f189..1424c6e5 100644 --- a/src/recipes.jl +++ b/src/recipes.jl @@ -239,7 +239,7 @@ end @recipe function f(::Type{Val{:sticks}}, x, y, z) n = length(x) fr = plotattributes[:fillrange] - if fr == nothing + if fr === nothing sp = plotattributes[:subplot] yaxis = sp[:yaxis] fr = if yaxis[:scale] == :identity @@ -321,7 +321,7 @@ end x := newx y := newy - if z == nothing + if z === nothing seriestype := :path else seriestype := :path3d @@ -357,7 +357,7 @@ end # compute half-width of bars bw = plotattributes[:bar_width] - hw = if bw == nothing + hw = if bw === nothing if nx > 1 0.5*_bar_width*ignorenan_minimum(filter(x->x>0, diff(procx))) else @@ -369,7 +369,7 @@ end # make fillto a vector... default fills to 0 fillto = plotattributes[:fillrange] - if fillto == nothing + if fillto === nothing fillto = 0 end if (yscale in _logScales) && !all(_is_positive, fillto) @@ -491,7 +491,7 @@ end @recipe function f(::Type{Val{:barbins}}, x, y, z) edge, weights, xscale, yscale, baseline = _preprocess_binlike(plotattributes, x, y) - if (plotattributes[:bar_width] == nothing) + if (plotattributes[:bar_width] === nothing) bar_width := diff(edge) end x := _bin_centers(edge) @@ -667,7 +667,7 @@ end function _make_hist(vs::NTuple{N,AbstractVector}, binning; normed = false, weights = nothing) where N localvs = _filternans(vs) edges = _hist_edges(localvs, binning) - h = float( weights == nothing ? + h = float( weights === nothing ? StatsBase.fit(StatsBase.Histogram, localvs, edges, closed = :left) : StatsBase.fit(StatsBase.Histogram, localvs, StatsBase.Weights(weights), edges, closed = :left) ) diff --git a/src/utils.jl b/src/utils.jl index 666c878d..0415664c 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -26,7 +26,7 @@ function histogramHack(; kw...) plotattributes[:x] = midpoints plotattributes[:y] = float(counts) plotattributes[:seriestype] = :bar - plotattributes[:fillrange] = plotattributes[:fillrange] == nothing ? 0.0 : plotattributes[:fillrange] + plotattributes[:fillrange] = plotattributes[:fillrange] === nothing ? 0.0 : plotattributes[:fillrange] plotattributes end @@ -38,7 +38,7 @@ function barHack(; kw...) plotattributes = KW(kw) midpoints = plotattributes[:x] heights = plotattributes[:y] - fillrange = plotattributes[:fillrange] == nothing ? 0.0 : plotattributes[:fillrange] + fillrange = plotattributes[:fillrange] === nothing ? 0.0 : plotattributes[:fillrange] # estimate the edges dists = diff(midpoints) * 0.5 @@ -81,7 +81,7 @@ function sticksHack(; kw...) # these are the line vertices x = Float64[] y = Float64[] - fillrange = plotattributesLine[:fillrange] == nothing ? 0.0 : plotattributesLine[:fillrange] + fillrange = plotattributesLine[:fillrange] === nothing ? 0.0 : plotattributesLine[:fillrange] # calculate the vertices yScatter = plotattributesScatter[:y] @@ -194,7 +194,7 @@ end function iter_segments(series::Series) x, y, z = series[:x], series[:y], series[:z] - if x == nothing + if x === nothing return UnitRange{Int}[] elseif has_attribute_segments(series) if series[:seriestype] in (:scatter, :scatter3d) @@ -478,7 +478,7 @@ function make_fillrange_from_ribbon(kw::KW) rib1, rib2 = -first(rib), last(rib) # kw[:ribbon] = nothing kw[:fillrange] = make_fillrange_side(y, rib1), make_fillrange_side(y, rib2) - (get(kw, :fillalpha, nothing) == nothing) && (kw[:fillalpha] = 0.5) + (get(kw, :fillalpha, nothing) === nothing) && (kw[:fillalpha] = 0.5) end #turn tuple of fillranges to one path @@ -560,18 +560,18 @@ function colorbar_style(series::Series) elseif iscontour(series) cbar_lines elseif series[:seriestype] ∈ (:heatmap,:surface) || - any(series[z] !== nothing for z ∈ [:marker_z,:line_z,:fill_z]) + any(series[z] !=== nothing for z ∈ [:marker_z,:line_z,:fill_z]) cbar_gradient else nothing end end -hascolorbar(series::Series) = colorbar_style(series) !== nothing +hascolorbar(series::Series) = colorbar_style(series) !=== nothing hascolorbar(sp::Subplot) = sp[:colorbar] != :none && any(hascolorbar(s) for s in series_list(sp)) iscontour(series::Series) = series[:seriestype] == :contour -isfilledcontour(series::Series) = iscontour(series) && series[:fillrange] !== nothing +isfilledcontour(series::Series) = iscontour(series) && series[:fillrange] !=== nothing function contour_levels(series::Series, clims) iscontour(series) || error("Not a contour series") @@ -602,7 +602,7 @@ for comp in (:line, :fill, :marker) function $get_compcolor(series, cmin::Real, cmax::Real, i::Int = 1) c = series[$Symbol($compcolor)] z = series[$Symbol($comp_z)] - if z == nothing + if z === nothing isa(c, ColorGradient) ? c : plot_color(_cycle(c, i)) else grad = isa(c, ColorGradient) ? c : cgrad() @@ -613,7 +613,7 @@ for comp in (:line, :fill, :marker) $get_compcolor(series, clims, i::Int = 1) = $get_compcolor(series, clims[1], clims[2], i) function $get_compcolor(series, i::Int = 1) - if series[$Symbol($comp_z)] == nothing + if series[$Symbol($comp_z)] === nothing $get_compcolor(series, 0, 1, i) else $get_compcolor(series, get_clims(series[:subplot]), i) diff --git a/test/imgcomp.jl b/test/imgcomp.jl index 206b8d50..1aa4ceee 100644 --- a/test/imgcomp.jl +++ b/test/imgcomp.jl @@ -64,7 +64,7 @@ function image_comparison_tests(pkg::Symbol, idx::Int; debug = false, popup = is # now we have the fn (if any)... do the comparison # @show reffn - if reffn == nothing + if reffn === nothing reffn = newfn end # @show reffn @@ -98,7 +98,7 @@ function image_comparison_facts(pkg::Symbol; tol = 1e-2) # acceptable error (percent) for i in 1:length(Plots._examples) i in skip && continue - if only == nothing || i in only + if only === nothing || i in only @test image_comparison_tests(pkg, i, debug=debug, sigma=sigma, tol=tol) |> success == true end end From 0950c738e3f046092840f52d73b66faf98bb9714 Mon Sep 17 00:00:00 2001 From: Chris Rackauckas Date: Sat, 17 Aug 2019 14:20:23 -0400 Subject: [PATCH 023/357] fix !== --- src/backends/gr.jl | 2 +- src/utils.jl | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index dd21e3a6..ad0d0bb4 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -620,7 +620,7 @@ end function gr_set_gradient(series::Series) color = gr_get_color(series) - color !=== nothing && gr_set_gradient(color) + color !== nothing && gr_set_gradient(color) end function gr_get_color(series::Series) diff --git a/src/utils.jl b/src/utils.jl index 0415664c..29ccd211 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -560,18 +560,18 @@ function colorbar_style(series::Series) elseif iscontour(series) cbar_lines elseif series[:seriestype] ∈ (:heatmap,:surface) || - any(series[z] !=== nothing for z ∈ [:marker_z,:line_z,:fill_z]) + any(series[z] !== nothing for z ∈ [:marker_z,:line_z,:fill_z]) cbar_gradient else nothing end end -hascolorbar(series::Series) = colorbar_style(series) !=== nothing +hascolorbar(series::Series) = colorbar_style(series) !== nothing hascolorbar(sp::Subplot) = sp[:colorbar] != :none && any(hascolorbar(s) for s in series_list(sp)) iscontour(series::Series) = series[:seriestype] == :contour -isfilledcontour(series::Series) = iscontour(series) && series[:fillrange] !=== nothing +isfilledcontour(series::Series) = iscontour(series) && series[:fillrange] !== nothing function contour_levels(series::Series, clims) iscontour(series) || error("Not a contour series") From 82dd5bf3eb5aeca728865f5e1fc87bb113ddf461 Mon Sep 17 00:00:00 2001 From: Chris Rackauckas Date: Sat, 17 Aug 2019 14:45:43 -0400 Subject: [PATCH 024/357] != nothing -> !== nothing --- src/args.jl | 8 ++++---- src/axes.jl | 4 ++-- src/backends/gr.jl | 26 +++++++++++++------------- src/backends/inspectdr.jl | 4 ++-- src/backends/pgfplots.jl | 8 ++++---- src/backends/plotly.jl | 20 ++++++++++---------- src/backends/pyplot.jl | 24 ++++++++++++------------ src/components.jl | 2 +- src/examples.jl | 4 ++-- src/pipeline.jl | 6 +++--- src/recipes.jl | 20 ++++++++++---------- src/themes.jl | 2 +- src/utils.jl | 4 ++-- 13 files changed, 66 insertions(+), 66 deletions(-) diff --git a/src/args.jl b/src/args.jl index 68c72455..06bb27e7 100644 --- a/src/args.jl +++ b/src/args.jl @@ -1121,7 +1121,7 @@ end function _filter_input_data!(plotattributes::KW) idxfilter = pop!(plotattributes, :idxfilter, nothing) - if idxfilter != nothing + if idxfilter !== nothing filter_data!(plotattributes, idxfilter) end end @@ -1602,13 +1602,13 @@ function _update_series_attributes!(plotattributes::KW, plt::Plot, sp::Subplot) end # if marker_z, fill_z or line_z are set, ensure we have a gradient - if plotattributes[:marker_z] != nothing + if plotattributes[:marker_z] !== nothing ensure_gradient!(plotattributes, :markercolor, :markeralpha) end - if plotattributes[:line_z] != nothing + if plotattributes[:line_z] !== nothing ensure_gradient!(plotattributes, :linecolor, :linealpha) end - if plotattributes[:fill_z] != nothing + if plotattributes[:fill_z] !== nothing ensure_gradient!(plotattributes, :fillcolor, :fillalpha) end diff --git a/src/axes.jl b/src/axes.jl index 66a42793..6eb23422 100644 --- a/src/axes.jl +++ b/src/axes.jl @@ -382,7 +382,7 @@ function expand_extrema!(sp::Subplot, plotattributes::KW) data = plotattributes[letter] = Surface(Matrix{Float64}(data.surf)) end expand_extrema!(axis, data) - elseif data != nothing + elseif data !== nothing # TODO: need more here... gotta track the discrete reference value # as well as any coord offset (think of boxplot shape coords... they all # correspond to the same x-value) @@ -402,7 +402,7 @@ function expand_extrema!(sp::Subplot, plotattributes::KW) if fr === nothing && plotattributes[:seriestype] == :bar fr = 0.0 end - if fr != nothing && !all3D(plotattributes) + if fr !== nothing && !all3D(plotattributes) axis = sp.attr[vert ? :yaxis : :xaxis] if typeof(fr) <: Tuple for fri in fr diff --git a/src/backends/gr.jl b/src/backends/gr.jl index ad0d0bb4..e4b95d5b 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -147,7 +147,7 @@ gr_inqtext(x, y, s::Symbol) = gr_inqtext(x, y, string(s)) function gr_inqtext(x, y, s) if length(s) >= 2 && s[1] == '$' && s[end] == '$' GR.inqmathtex(x, y, s[2:end-1]) - elseif findfirst(isequal('\\'), s) != nothing || occursin("10^{", s) + elseif findfirst(isequal('\\'), s) !== nothing || occursin("10^{", s) GR.inqtextext(x, y, s) else GR.inqtext(x, y, s) @@ -159,7 +159,7 @@ gr_text(x, y, s::Symbol) = gr_text(x, y, string(s)) function gr_text(x, y, s) if length(s) >= 2 && s[1] == '$' && s[end] == '$' GR.mathtex(x, y, s[2:end-1]) - elseif findfirst(isequal('\\'), s) != nothing || occursin("10^{", s) + elseif findfirst(isequal('\\'), s) !== nothing || occursin("10^{", s) GR.textext(x, y, s) else GR.text(x, y, s) @@ -237,7 +237,7 @@ gr_z_axislims(sp::Subplot) = axis_limits(sp, :z) gr_xy_axislims(sp::Subplot) = gr_x_axislims(sp)..., gr_y_axislims(sp)... function gr_lims(sp::Subplot, axis::Axis, adjust::Bool, expand = nothing) - if expand != nothing + if expand !== nothing expand_extrema!(axis, expand) end lims = axis_limits(sp, axis[:letter]) @@ -629,11 +629,11 @@ function gr_get_color(series::Series) series[:fillcolor] elseif st in (:contour, :wireframe) series[:linecolor] - elseif series[:marker_z] != nothing + elseif series[:marker_z] !== nothing series[:markercolor] elseif series[:line_z] != nothing series[:linecolor] - elseif series[:fill_z] != nothing + elseif series[:fill_z] !== nothing series[:fillcolor] end end @@ -880,7 +880,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) GR.selntran(0) GR.setscale(0) gr_set_font(legendfont(sp)) - if sp[:legendtitle] != nothing + if sp[:legendtitle] !== nothing tbx, tby = gr_inqtext(0, 0, string(sp[:legendtitle])) legendw = tbx[3] - tbx[1] legendn += 1 @@ -1247,7 +1247,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) if typeof(z) <: Surface z = vec(transpose_z(series, z.surf, false)) elseif ispolar(sp) - if frng != nothing + if frng !== nothing _, frng = convert_to_polar(x, frng, (rmin, rmax)) end x, y = convert_to_polar(x, y, (rmin, rmax)) @@ -1258,11 +1258,11 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) end if st in (:path, :scatter, :straightline) - if x != nothing && length(x) > 1 + if x !== nothing && length(x) > 1 lz = series[:line_z] segments = iter_segments(series) # do area fill - if frng != nothing + if frng !== nothing GR.setfillintstyle(GR.INTSTYLE_SOLID) fr_from, fr_to = (is_2tuple(frng) ? frng : (y, frng)) for (i, rng) in enumerate(segments) @@ -1301,7 +1301,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) plot_color(series[:linecolor]) in (black,[black]) end h = gr_contour_levels(series, clims) - if series[:fillrange] != nothing + if series[:fillrange] !== nothing if series[:fillcolor] != series[:linecolor] && !is_lc_black @warn("GR: filled contour only supported with black contour lines") end @@ -1496,7 +1496,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) gr_set_line(1, :solid, sp[:foreground_color_legend]) GR.drawrect(xpos - 0.08, xpos + w + 0.02, ypos + dy, ypos - dy * n) i = 0 - if sp[:legendtitle] != nothing + if sp[:legendtitle] !== nothing GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_HALF) gr_set_textcolor(sp[:legendfontcolor]) gr_set_transparency(sp[:legendfontcolor]) @@ -1509,7 +1509,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) lc = get_linecolor(series, clims) gr_set_line(get_linewidth(series), get_linestyle(series), lc) #, series[:linealpha]) - if (st == :shape || series[:fillrange] != nothing) && series[:ribbon] === nothing + if (st == :shape || series[:fillrange] !== nothing) && series[:ribbon] === nothing fc = get_fillcolor(series, clims) gr_set_fill(fc) #, series[:fillalpha]) l, r = xpos-0.07, xpos-0.01 @@ -1526,7 +1526,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) if st in (:path, :straightline) gr_set_transparency(lc, get_linealpha(series)) - if series[:fillrange] === nothing || series[:ribbon] != nothing + if series[:fillrange] === nothing || series[:ribbon] !== nothing GR.polyline([xpos - 0.07, xpos - 0.01], [ypos, ypos]) else GR.polyline([xpos - 0.07, xpos - 0.01], [ypos+0.4dy, ypos+0.4dy]) diff --git a/src/backends/inspectdr.jl b/src/backends/inspectdr.jl index c1e5c5b8..e9ad4cc4 100644 --- a/src/backends/inspectdr.jl +++ b/src/backends/inspectdr.jl @@ -121,9 +121,9 @@ function _create_backend_figure(plt::Plot{InspectDRBackend}) gplot = _inspectdr_getgui(plt.o) #:overwrite_figure: want to reuse current figure - if plt[:overwrite_figure] && mplot != nothing + if plt[:overwrite_figure] && mplot !== nothing mplot.subplots = [] #Reset - if gplot != nothing #Ensure still references current plot + if gplot !== nothing #Ensure still references current plot gplot.src = mplot end else #want new one: diff --git a/src/backends/pgfplots.jl b/src/backends/pgfplots.jl index 8f849c07..2893fd65 100644 --- a/src/backends/pgfplots.jl +++ b/src/backends/pgfplots.jl @@ -96,7 +96,7 @@ pgf_thickness_scaling(series) = pgf_thickness_scaling(series[:subplot]) function pgf_fillstyle(plotattributes, i = 1) cstr,a = pgf_color(get_fillcolor(plotattributes, i)) fa = get_fillalpha(plotattributes, i) - if fa != nothing + if fa !== nothing a = fa end "fill = $cstr, fill opacity=$a" @@ -216,12 +216,12 @@ function pgf_series(sp::Subplot, series::Series) # add to legend? if i == 1 && sp[:legend] != :none && should_add_to_legend(series) - if plotattributes[:fillrange] != nothing + if plotattributes[:fillrange] !== nothing push!(style, "forget plot") push!(series_collection, pgf_fill_legend_hack(plotattributes, args)) else kw[:legendentry] = plotattributes[:label] - if st == :shape # || plotattributes[:fillrange] != nothing + if st == :shape # || plotattributes[:fillrange] !== nothing push!(style, "area legend") end end @@ -238,7 +238,7 @@ function pgf_series(sp::Subplot, series::Series) kw[:style] = join(style, ',') # add fillrange - if series[:fillrange] != nothing && st != :shape + if series[:fillrange] !== nothing && st != :shape push!(series_collection, pgf_fillrange_series(series, i, _cycle(series[:fillrange], rng), seg_args...)) end diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index 78df1a84..ead66956 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -403,7 +403,7 @@ end function plotly_data(series::Series, letter::Symbol, data) axis = series[:subplot][Symbol(letter, :axis)] - data = if axis[:ticks] == :native && data != nothing + data = if axis[:ticks] == :native && data !== nothing plotly_native_data(axis, data) else data @@ -415,7 +415,7 @@ function plotly_data(series::Series, letter::Symbol, data) plotly_data(data) end end -plotly_data(v) = v != nothing ? collect(v) : v +plotly_data(v) = v !== nothing ? collect(v) : v plotly_data(surf::Surface) = surf.surf plotly_data(v::AbstractArray{R}) where {R<:Rational} = float(v) @@ -529,7 +529,7 @@ function plotly_series(plt::Plot, series::Series) else plotattributes_out[:colorscale] = plotly_colorscale(series[:fillcolor], series[:fillalpha]) plotattributes_out[:opacity] = series[:fillalpha] - if series[:fill_z] != nothing + if series[:fill_z] !== nothing plotattributes_out[:surfacecolor] = plotly_surface_data(series, series[:fill_z]) end plotattributes_out[:showscale] = hascolorbar(sp) @@ -611,11 +611,11 @@ function plotly_series_shapes(plt::Plot, series::Series, clims) plotly_hover!(plotattributes_out, _cycle(series[:hover], i)) plotattributes_outs[i] = plotattributes_out end - if series[:fill_z] != nothing + if series[:fill_z] !== nothing push!(plotattributes_outs, plotly_colorbar_hack(series, plotattributes_base, :fill)) - elseif series[:line_z] != nothing + elseif series[:line_z] !== nothing push!(plotattributes_outs, plotly_colorbar_hack(series, plotattributes_base, :line)) - elseif series[:marker_z] != nothing + elseif series[:marker_z] !== nothing push!(plotattributes_outs, plotly_colorbar_hack(series, plotattributes_base, :marker)) end plotattributes_outs @@ -733,11 +733,11 @@ function plotly_series_segments(series::Series, plotattributes_base::KW, x, y, z end end - if series[:line_z] != nothing + if series[:line_z] !== nothing push!(plotattributes_outs, plotly_colorbar_hack(series, plotattributes_base, :line)) - elseif series[:fill_z] != nothing + elseif series[:fill_z] !== nothing push!(plotattributes_outs, plotly_colorbar_hack(series, plotattributes_base, :fill)) - elseif series[:marker_z] != nothing + elseif series[:marker_z] !== nothing push!(plotattributes_outs, plotly_colorbar_hack(series, plotattributes_base, :marker)) end @@ -782,7 +782,7 @@ function plotly_hover!(plotattributes_out::KW, hover) # hover text if hover in (:none, false) plotattributes_out[:hoverinfo] = "none" - elseif hover != nothing + elseif hover !== nothing plotattributes_out[:hoverinfo] = "text" plotattributes_out[:text] = hover end diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index 5751a43f..7b6be078 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -216,7 +216,7 @@ end # --------------------------------------------------------------------------- function fix_xy_lengths!(plt::Plot{PyPlotBackend}, series::Series) - if series[:x] != nothing + if series[:x] !== nothing x, y = series[:x], series[:y] nx, ny = length(x), length(y) if !isa(get(series.plotattributes, :z, nothing), Surface) && nx != ny @@ -434,7 +434,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) if maximum(series[:linewidth]) > 0 segments = iter_segments(series) # TODO: check LineCollection alternative for speed - # if length(segments) > 1 && (any(typeof(series[attr]) <: AbstractVector for attr in (:fillcolor, :fillalpha)) || series[:fill_z] != nothing) && !(typeof(series[:linestyle]) <: AbstractVector) + # if length(segments) > 1 && (any(typeof(series[attr]) <: AbstractVector for attr in (:fillcolor, :fillalpha)) || series[:fill_z] !== nothing) && !(typeof(series[:linestyle]) <: AbstractVector) # # multicolored line segments # n = length(segments) # # segments = Array(Any,n) @@ -478,7 +478,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) # end a = series[:arrow] - if a != nothing && !is3d(st) # TODO: handle 3d later + if a !== nothing && !is3d(st) # TODO: handle 3d later if typeof(a) != Arrow @warn("Unexpected type for arrow: $(typeof(a))") else @@ -508,7 +508,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) if series[:markershape] != :none && st in (:path, :scatter, :path3d, :scatter3d, :steppre, :steppost, :bar) - markercolor = if any(typeof(series[arg]) <: AVec for arg in (:markercolor, :markeralpha)) || series[:marker_z] != nothing + markercolor = if any(typeof(series[arg]) <: AVec for arg in (:markercolor, :markeralpha)) || series[:marker_z] !== nothing # py_color(plot_color.(get_markercolor.(series, clims, eachindex(x)), get_markeralpha.(series, eachindex(x)))) [py_color(plot_color(get_markercolor(series, clims, i), get_markeralpha(series, i))) for i in eachindex(x)] else @@ -672,7 +672,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) push!(handles, handle) # contour fills - if series[:fillrange] != nothing + if series[:fillrange] !== nothing handle = ax."contourf"(x, y, z, levelargs...; label = series[:label], zorder = series[:series_plotindex] + 0.5, @@ -691,7 +691,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) end z = transpose_z(series, z) if st == :surface - if series[:fill_z] != nothing + if series[:fill_z] !== nothing # the surface colors are different than z-value extrakw[:facecolors] = py_shading(series[:fillcolor], transpose_z(series, series[:fill_z].surf)) extrakw[:shade] = false @@ -830,7 +830,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) # handle area filling fillrange = series[:fillrange] - if fillrange != nothing && st != :contour + if fillrange !== nothing && st != :contour for (i, rng) in enumerate(iter_segments(series)) f, dim1, dim2 = if isvertical(series) :fill_between, x[rng], y[rng] @@ -1018,12 +1018,12 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend}) kw[:ticks] = locator kw[:format] = formatter kw[:boundaries] = vcat(0, kw[:values] + 0.5) - elseif any(colorbar_series[attr] != nothing for attr in (:line_z, :fill_z, :marker_z)) + elseif any(colorbar_series[attr] !== nothing for attr in (:line_z, :fill_z, :marker_z)) cmin, cmax = get_clims(sp) norm = pycolors."Normalize"(vmin = cmin, vmax = cmax) - f = if colorbar_series[:line_z] != nothing + f = if colorbar_series[:line_z] !== nothing py_linecolormap - elseif colorbar_series[:fill_z] != nothing + elseif colorbar_series[:fill_z] !== nothing py_fillcolormap else py_markercolormap @@ -1297,7 +1297,7 @@ function py_add_legend(plt::Plot, sp::Subplot, ax) for series in series_list(sp) if should_add_to_legend(series) # add a line/marker and a label - push!(handles, if series[:seriestype] == :shape || series[:fillrange] != nothing + push!(handles, if series[:seriestype] == :shape || series[:fillrange] !== nothing pypatches."Patch"( edgecolor = py_color(single_color(get_linecolor(series, clims)), get_linealpha(series)), facecolor = py_color(single_color(get_fillcolor(series, clims)), get_fillalpha(series)), @@ -1335,7 +1335,7 @@ function py_add_legend(plt::Plot, sp::Subplot, ax) frame = leg."get_frame"() frame."set_linewidth"(py_thickness_scale(plt, 1)) leg."set_zorder"(1000) - sp[:legendtitle] != nothing && leg."set_title"(sp[:legendtitle]) + sp[:legendtitle] !== nothing && leg."set_title"(sp[:legendtitle]) for txt in leg."get_texts"() PyPlot.plt."setp"(txt, color = py_color(sp[:legendfontcolor]), family = sp[:legendfontfamily]) diff --git a/src/components.jl b/src/components.jl index 4aa27043..3e7c312f 100644 --- a/src/components.jl +++ b/src/components.jl @@ -529,7 +529,7 @@ function series_annotations_shapes!(series::Series, scaletype::Symbol = :pixels) # end # @show msw msh - if anns != nothing && anns.baseshape != nothing + if anns !== nothing && anns.baseshape !== nothing # we use baseshape to overwrite the markershape attribute # with a list of custom shapes for each msw,msh = anns.scalefactor diff --git a/src/examples.jl b/src/examples.jl index 6dd1b7f4..d55d3b4c 100644 --- a/src/examples.jl +++ b/src/examples.jl @@ -496,7 +496,7 @@ function test_examples(pkgname::Symbol; debug = false, disp = true, sleep = noth Plots._debugMode.on = debug plts = Dict() for i in 1:length(_examples) - only != nothing && !(i in only) && continue + only !== nothing && !(i in only) && continue i in skip && continue try plt = test_examples(pkgname, i, debug=debug, disp=disp) @@ -505,7 +505,7 @@ function test_examples(pkgname::Symbol; debug = false, disp = true, sleep = noth # TODO: put error info into markdown? @warn("Example $pkgname:$i:$(_examples[i].header) failed with: $ex") end - if sleep != nothing + if sleep !== nothing Base.sleep(sleep) end end diff --git a/src/pipeline.jl b/src/pipeline.jl index 433997c2..98f06bf9 100644 --- a/src/pipeline.jl +++ b/src/pipeline.jl @@ -126,7 +126,7 @@ function _preprocess_userrecipe(kw::KW) end # convert a ribbon into a fillrange - if get(kw, :ribbon, nothing) != nothing + if get(kw, :ribbon, nothing) !== nothing make_fillrange_from_ribbon(kw) end return @@ -136,7 +136,7 @@ function _add_errorbar_kw(kw_list::Vector{KW}, kw::KW) # handle error bars by creating new recipedata data... these will have # the same recipedata index as the recipedata they are copied from for esym in (:xerror, :yerror) - if get(kw, esym, nothing) != nothing + if get(kw, esym, nothing) !== nothing # we make a copy of the KW and apply an errorbar recipe errkw = copy(kw) errkw[:seriestype] = esym @@ -227,7 +227,7 @@ function _plot_setup(plt::Plot, plotattributes::KW, kw_list::Vector{KW}) # handle inset subplots insets = plt[:inset_subplots] - if insets != nothing + if insets !== nothing if !(typeof(insets) <: AVec) insets = [insets] end diff --git a/src/recipes.jl b/src/recipes.jl index 1424c6e5..1c3528e8 100644 --- a/src/recipes.jl +++ b/src/recipes.jl @@ -291,13 +291,13 @@ end # create segmented bezier curves in place of line segments @recipe function f(::Type{Val{:curves}}, x, y, z; npoints = 30) - args = z != nothing ? (x,y,z) : (x,y) + args = z !== nothing ? (x,y,z) : (x,y) newx, newy = zeros(0), zeros(0) fr = plotattributes[:fillrange] - newfr = fr != nothing ? zeros(0) : nothing - newz = z != nothing ? zeros(0) : nothing + newfr = fr !== nothing ? zeros(0) : nothing + newz = z !== nothing ? zeros(0) : nothing # lz = plotattributes[:line_z] - # newlz = lz != nothing ? zeros(0) : nothing + # newlz = lz !== nothing ? zeros(0) : nothing # for each line segment (point series with no NaNs), convert it into a bezier curve # where the points are the control points of the curve @@ -306,13 +306,13 @@ end ts = range(0, stop = 1, length = npoints) nanappend!(newx, map(t -> bezier_value(_cycle(x,rng), t), ts)) nanappend!(newy, map(t -> bezier_value(_cycle(y,rng), t), ts)) - if z != nothing + if z !== nothing nanappend!(newz, map(t -> bezier_value(_cycle(z,rng), t), ts)) end - if fr != nothing + if fr !== nothing nanappend!(newfr, map(t -> bezier_value(_cycle(fr,rng), t), ts)) end - # if lz != nothing + # if lz !== nothing # lzrng = _cycle(lz, rng) # the line_z's for this segment # push!(newlz, 0.0) # append!(newlz, map(t -> lzrng[1+floor(Int, t * (length(rng)-1))], ts)) @@ -327,10 +327,10 @@ end seriestype := :path3d z := newz end - if fr != nothing + if fr !== nothing fillrange := newfr end - # if lz != nothing + # if lz !== nothing # # line_z := newlz # linecolor := (isa(plotattributes[:linecolor], ColorGradient) ? plotattributes[:linecolor] : cgrad()) # end @@ -533,7 +533,7 @@ function _stepbins_path(edge, weights, baseline::Real, xscale::Symbol, yscale::S last_w = eltype(weights)(NaN) - while it_tuple_e != nothing && it_tuple_w != nothing + while it_tuple_e !== nothing && it_tuple_w !== nothing b, it_state_e = it_tuple_e w, it_state_w = it_tuple_w diff --git a/src/themes.jl b/src/themes.jl index 592d0a78..e2d41e57 100644 --- a/src/themes.jl +++ b/src/themes.jl @@ -22,7 +22,7 @@ function _get_defaults(s::Symbol) :fglegend => thm.text, :palette => thm.palette, ) - if thm.gradient != nothing + if thm.gradient !== nothing push!(defaults, :gradient => thm.gradient) end return defaults diff --git a/src/utils.jl b/src/utils.jl index 29ccd211..c9bb3655 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -529,7 +529,7 @@ function get_clims(sp::Subplot) for vals in (series[:seriestype] in z_colored_series ? series[:z] : nothing, series[:line_z], series[:marker_z], series[:fill_z]) if (typeof(vals) <: AbstractSurface) && (eltype(vals.surf) <: Union{Missing, Real}) zmin, zmax = _update_clims(zmin, zmax, ignorenan_extrema(vals.surf)...) - elseif (vals != nothing) && (eltype(vals) <: Union{Missing, Real}) + elseif (vals !== nothing) && (eltype(vals) <: Union{Missing, Real}) zmin, zmax = _update_clims(zmin, zmax, ignorenan_extrema(vals)...) end end @@ -650,7 +650,7 @@ function has_attribute_segments(series::Series) for letter in (:x, :y, :z) # If we have NaNs in the data they define the segments and # SegmentsIterator is used - series[letter] != nothing && NaN in collect(series[letter]) && return false + series[letter] !== nothing && NaN in collect(series[letter]) && return false end series[:seriestype] == :shape && return false # ... else we check relevant attributes if they have multiple inputs From 808e20588eb98c7ab95eb0b6ed239bb1dd826a7a Mon Sep 17 00:00:00 2001 From: Yuval Date: Sun, 18 Aug 2019 23:31:34 +0300 Subject: [PATCH 025/357] one more != --> !== --- src/backends/gr.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index e4b95d5b..effe89bc 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -631,7 +631,7 @@ function gr_get_color(series::Series) series[:linecolor] elseif series[:marker_z] !== nothing series[:markercolor] - elseif series[:line_z] != nothing + elseif series[:line_z] !== nothing series[:linecolor] elseif series[:fill_z] !== nothing series[:fillcolor] From 48a245559ca7fc6e15c8f4e11a15f564faf829cc Mon Sep 17 00:00:00 2001 From: Patrick Kofod Mogensen Date: Tue, 20 Aug 2019 15:17:35 +0200 Subject: [PATCH 026/357] Delete pushtomaster.sh `dev` is dead --- pushtomaster.sh | 4 ---- 1 file changed, 4 deletions(-) delete mode 100755 pushtomaster.sh diff --git a/pushtomaster.sh b/pushtomaster.sh deleted file mode 100755 index 01d219c0..00000000 --- a/pushtomaster.sh +++ /dev/null @@ -1,4 +0,0 @@ -git checkout master -git merge --ff-only dev -git push origin master -git checkout dev From 3fdf87a9559eef4b56b074b00fb92a8f28bfd83d Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Mon, 26 Aug 2019 10:37:07 +0200 Subject: [PATCH 027/357] add legendtitlefont attributes --- src/arg_desc.jl | 9 ++++++++- src/args.jl | 11 ++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/arg_desc.jl b/src/arg_desc.jl index 120d1c36..69c40cd1 100644 --- a/src/arg_desc.jl +++ b/src/arg_desc.jl @@ -50,7 +50,7 @@ const _arg_desc = KW( :primary => "Bool. Does this count as a 'real series'? For example, you could have a path (primary), and a scatter (secondary) as 2 separate series, maybe with different data (see sticks recipe for an example). The secondary series will get the same color, etc as the primary.", :hover => "nothing or vector of strings. Text to display when hovering over each data point.", :colorbar_entry => "Bool. Include this series in the color bar? Set to `false` to exclude.", - + # plot args :plot_title => "String. Title for the whole plot (not the subplots) (Note: Not currently implemented)", :background_color => "Color Type. Base color for all backgrounds.", @@ -95,9 +95,16 @@ const _arg_desc = KW( :legendfontvalign => "Symbol. Font vertical alignment of legend entries: :vcenter, :top, :bottom or :center", :legendfontrotation => "Real. Font rotation of legend entries", :legendfontcolor => "Color Type. Font color of legend entries", +:legendtitlefontfamily => "String or Symbol. Font family of the legend title.", +:legendtitlefontsize => "Integer. Font pointsize the legend title.", +:legendtitlefonthalign => "Symbol. Font horizontal alignment of the legend title: :hcenter, :left, :right or :center", +:legendtitlefontvalign => "Symbol. Font vertical alignment of the legend title: :vcenter, :top, :bottom or :center", +:legendtitlefontrotation => "Real. Font rotation of the legend title", +:legendtitlefontcolor => "Color Type. Font color of the legend title", :colorbar => "Bool (show the colorbar?) or Symbol (colorbar position). Symbol values: `:none`, `:best`, `:right`, `:left`, `:top`, `:bottom`, `:legend` (matches legend value) (note: only some may be supported in each backend)", :clims => "`:auto` or NTuple{2,Number}. Fixes the limits of the colorbar.", :legendfont => "Font. Font of legend items.", +:legendtitlefont => "Font. Font of the legend title.", :annotations => "(x,y,text) tuple(s). Can be a single tuple or a list of them. Text can be String or PlotText (created with `text(args...)`) Add one-off text annotations at the x,y coordinates.", :projection => "Symbol or String. '3d' or 'polar'", :aspect_ratio => "Symbol (:equal) or Number. Plot area is resized so that 1 y-unit is the same size as `aspect_ratio` x-units.", diff --git a/src/args.jl b/src/args.jl index 06bb27e7..68ac3fd4 100644 --- a/src/args.jl +++ b/src/args.jl @@ -336,6 +336,12 @@ const _subplot_defaults = KW( :legendfontvalign => :vcenter, :legendfontrotation => 0.0, :legendfontcolor => :match, + :legendtitlefontfamily => :match, + :legendtitlefontsize => 11, + :legendtitlefonthalign => :hcenter, + :legendtitlefontvalign => :vcenter, + :legendtitlefontrotation => 0.0, + :legendtitlefontcolor => :match, :annotations => [], # annotation tuples... list of (x,y,annotation) :projection => :none, # can also be :polar or :3d :aspect_ratio => :none, # choose from :none or :equal @@ -450,6 +456,7 @@ const _initial_axis_defaults = deepcopy(_axis_defaults) # to be able to reset font sizes to initial values const _initial_fontsizes = Dict(:titlefontsize => _subplot_defaults[:titlefontsize], :legendfontsize => _subplot_defaults[:legendfontsize], + :legendtitlefontsize => _subplot_defaults[:legendtitlefontsize], :tickfontsize => _axis_defaults[:tickfontsize], :guidefontsize => _axis_defaults[:guidefontsize]) @@ -961,7 +968,7 @@ function preprocessArgs!(plotattributes::KW) end end # fonts - for fontname in (:titlefont, :legendfont) + for fontname in (:titlefont, :legendfont, :legendtitlefont) args = pop!(plotattributes, fontname, ()) for arg in wraptuple(args) processFontArg!(plotattributes, fontname, arg) @@ -1271,8 +1278,10 @@ const _match_map = KW( :bottom_margin => :margin, :titlefontfamily => :fontfamily_subplot, :legendfontfamily => :fontfamily_subplot, + :legendtitlefontfamily => :fontfamily_subplot, :titlefontcolor => :foreground_color_subplot, :legendfontcolor => :foreground_color_subplot, + :legendtitlefontcolor => :foreground_color_subplot, :tickfontcolor => :foreground_color_text, :guidefontcolor => :foreground_color_guide, ) From 89613bfee5de8b844664a06b523552cbc7455e4c Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Mon, 26 Aug 2019 10:45:13 +0200 Subject: [PATCH 028/357] add legendtitlefont function --- src/utils.jl | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/utils.jl b/src/utils.jl index c9bb3655..68fb6056 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -1060,6 +1060,15 @@ legendfont(sp::Subplot) = font( sp[:legendfontcolor], ) +legendtitlefont(sp::Subplot) = font( + sp[:legendtitlefontfamily], + sp[:legendtitlefontsize], + sp[:legendtitlefontvalign], + sp[:legendtitlefonthalign], + sp[:legendtitlefontrotation], + sp[:legendtitlefontcolor], +) + tickfont(ax::Axis) = font( ax[:tickfontfamily], ax[:tickfontsize], From e555f679c18351424ec402f4f5fc2f7cb9320a0c Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Mon, 26 Aug 2019 10:55:46 +0200 Subject: [PATCH 029/357] implementation for GR --- src/backends/gr.jl | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index effe89bc..ccaf914a 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -879,12 +879,13 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) GR.savestate() GR.selntran(0) GR.setscale(0) - gr_set_font(legendfont(sp)) if sp[:legendtitle] !== nothing + gr_set_font(legendtitlefont(sp)) tbx, tby = gr_inqtext(0, 0, string(sp[:legendtitle])) legendw = tbx[3] - tbx[1] legendn += 1 end + gr_set_font(legendfont(sp)) for series in series_list(sp) should_add_to_legend(series) || continue legendn += 1 @@ -1498,10 +1499,10 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) i = 0 if sp[:legendtitle] !== nothing GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_HALF) - gr_set_textcolor(sp[:legendfontcolor]) - gr_set_transparency(sp[:legendfontcolor]) + gr_set_font(legendtitlefont(sp)) gr_text(xpos - 0.03 + 0.5*w, ypos, string(sp[:legendtitle])) ypos -= dy + gr_set_font(legendfont(sp)) end for series in series_list(sp) should_add_to_legend(series) || continue From 9fd7a84b48d12e47896e5316f40b8ea99b718141 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Mon, 26 Aug 2019 11:59:47 +0200 Subject: [PATCH 030/357] legendtitlefont implementation for pyplot --- src/backends/pyplot.jl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index 7b6be078..8b9d0f9e 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -1335,10 +1335,13 @@ function py_add_legend(plt::Plot, sp::Subplot, ax) frame = leg."get_frame"() frame."set_linewidth"(py_thickness_scale(plt, 1)) leg."set_zorder"(1000) - sp[:legendtitle] !== nothing && leg."set_title"(sp[:legendtitle]) + if sp[:legendtitle] !== nothing + leg."set_title"(sp[:legendtitle]) + PyPlot.plt."setp"(leg."get_title"(), color = py_color(sp[:legendtitlefontcolor]), family = sp[:legendtitlefontfamily], fontsize = py_thickness_scale(plt, sp[:legendtitlefontsize])) + end for txt in leg."get_texts"() - PyPlot.plt."setp"(txt, color = py_color(sp[:legendfontcolor]), family = sp[:legendfontfamily]) + PyPlot.plt."setp"(txt, color = py_color(sp[:legendfontcolor]), family = sp[:legendfontfamily], fontsize = py_thickness_scale(plt, sp[:legendfontsize])) end end end From 844c3f7002c671ad2dcf6218a3c33a4ad7215332 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Tue, 27 Aug 2019 14:15:01 +0200 Subject: [PATCH 031/357] allow plotting of Any vectors --- src/series.jl | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/series.jl b/src/series.jl index f4bdb61d..1c6e56c6 100644 --- a/src/series.jl +++ b/src/series.jl @@ -30,7 +30,13 @@ convertToAnyVector(n::Integer) = Any[zeros(0) for i in 1:n] convertToAnyVector(v::AVec{<:DataPoint}) = Any[prepareSeriesData(v)] # list of things (maybe other vectors, functions, or something else) -convertToAnyVector(v::AVec) = vcat((convertToAnyVector(vi) for vi in v)...) +function convertToAnyVector(v::AVec) + if all(x -> isa(x, Number) || ismissing(x), v) || all(x -> isa(x, AbstractString) || ismissing(x), v) + convertToAnyVector(convert.(DataPoint, v)) + else + Any[prepareSeriesData(v)] : vcat((convertToAnyVector(vi) for vi in v)...) + end +end # Matrix is split into columns convertToAnyVector(v::AMat{<:DataPoint}) = Any[prepareSeriesData(v[:,i]) for i in 1:size(v,2)] From 4247584df23cb83d9d496ff3566dfc01031c5fa7 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Tue, 27 Aug 2019 16:43:41 +0200 Subject: [PATCH 032/357] delete left-over text --- src/series.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/series.jl b/src/series.jl index 1c6e56c6..e3960df2 100644 --- a/src/series.jl +++ b/src/series.jl @@ -34,7 +34,7 @@ function convertToAnyVector(v::AVec) if all(x -> isa(x, Number) || ismissing(x), v) || all(x -> isa(x, AbstractString) || ismissing(x), v) convertToAnyVector(convert.(DataPoint, v)) else - Any[prepareSeriesData(v)] : vcat((convertToAnyVector(vi) for vi in v)...) + vcat((convertToAnyVector(vi) for vi in v)...) end end From 03d57e690c0e5875f9eae93f50780a1c259b4708 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Tue, 27 Aug 2019 19:08:30 +0200 Subject: [PATCH 033/357] allow 3D plotting --- src/backends/pyplot.jl | 1 + src/series.jl | 42 ++++++++++++++++++++++++------------------ 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index 8b9d0f9e..c2b38edc 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -726,6 +726,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) elseif typeof(z) <: AbstractVector # tri-surface plot (http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#tri-surface-plots) + @show x, y, z handle = ax."plot_trisurf"(x, y, z; label = series[:label], zorder = series[:series_plotindex], diff --git a/src/series.jl b/src/series.jl index e3960df2..d803f693 100644 --- a/src/series.jl +++ b/src/series.jl @@ -21,38 +21,44 @@ handlemissings(s::Surface) = Surface(handlemissings(s.surf)) handlemissings(v::Volume) = Volume(handlemissings(v.v), v.x_extents, v.y_extents, v.z_extents) # default: assume x represents a single series -convertToAnyVector(x) = Any[prepareSeriesData(x)] +convertToAnyVector(x, plotattributes) = Any[prepareSeriesData(x)] # fixed number of blank series -convertToAnyVector(n::Integer) = Any[zeros(0) for i in 1:n] +convertToAnyVector(n::Integer, plotattributes) = Any[zeros(0) for i in 1:n] # vector of data points is a single series -convertToAnyVector(v::AVec{<:DataPoint}) = Any[prepareSeriesData(v)] +convertToAnyVector(v::AVec{<:DataPoint}, plotattributes) = Any[prepareSeriesData(v)] # list of things (maybe other vectors, functions, or something else) -function convertToAnyVector(v::AVec) +function convertToAnyVector(v::AVec, plotattributes) if all(x -> isa(x, Number) || ismissing(x), v) || all(x -> isa(x, AbstractString) || ismissing(x), v) - convertToAnyVector(convert.(DataPoint, v)) + convertToAnyVector(convert.(DataPoint, v), plotattributes) else - vcat((convertToAnyVector(vi) for vi in v)...) + vcat((convertToAnyVector(vi, plotattributes) for vi in v)...) end end # Matrix is split into columns -convertToAnyVector(v::AMat{<:DataPoint}) = Any[prepareSeriesData(v[:,i]) for i in 1:size(v,2)] +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)] + end +end # -------------------------------------------------------------------- # Fillranges & ribbons -process_fillrange(range::Number) = [range] -process_fillrange(range) = convertToAnyVector(range) +process_fillrange(range::Number, plotattributes) = [range] +process_fillrange(range, plotattributes) = convertToAnyVector(range, plotattributes) -process_ribbon(ribbon::Number) = [ribbon] -process_ribbon(ribbon) = convertToAnyVector(ribbon) +process_ribbon(ribbon::Number, plotattributes) = [ribbon] +process_ribbon(ribbon, plotattributes) = convertToAnyVector(ribbon, plotattributes) # ribbon as a tuple: (lower_ribbons, upper_ribbons) -process_ribbon(ribbon::Tuple{Any,Any}) = collect(zip(convertToAnyVector(ribbon[1]), - convertToAnyVector(ribbon[2]))) +process_ribbon(ribbon::Tuple{Any,Any}) = collect(zip(convertToAnyVector(ribbon[1], plotattributes), + convertToAnyVector(ribbon[2], plotattributes))) # -------------------------------------------------------------------- @@ -116,17 +122,17 @@ struct SliceIt end z = z.data end - xs = convertToAnyVector(x) - ys = convertToAnyVector(y) - zs = convertToAnyVector(z) + xs = convertToAnyVector(x, plotattributes) + ys = convertToAnyVector(y, plotattributes) + zs = convertToAnyVector(z, plotattributes) fr = pop!(plotattributes, :fillrange, nothing) - fillranges = process_fillrange(fr) + fillranges = process_fillrange(fr, plotattributes) mf = length(fillranges) rib = pop!(plotattributes, :ribbon, nothing) - ribbons = process_ribbon(rib) + ribbons = process_ribbon(rib, plotattributes) mr = length(ribbons) # @show zs From 1ed9bcae5cf0a5100a21d2de867dd6a20ab0a4e6 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 28 Aug 2019 18:43:01 +0200 Subject: [PATCH 034/357] small coords bug-fix --- src/components.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components.jl b/src/components.jl index 3e7c312f..be82e5b9 100644 --- a/src/components.jl +++ b/src/components.jl @@ -794,7 +794,7 @@ end @deprecate curve_points coords -coords(curve::BezierCurve, n::Integer = 30; range = [0,1]) = map(curve, range(range..., stop=n, length=50)) +coords(curve::BezierCurve, n::Integer = 30; range = [0,1]) = map(curve, Base.range(range..., length=n)) # build a BezierCurve which leaves point p vertically upwards and arrives point q vertically upwards. # may create a loop if necessary. Assumes the view is [0,1] From 30f321d88bfb5c60019086900cd4fd882a4846f9 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 28 Aug 2019 23:36:46 +0200 Subject: [PATCH 035/357] avoid annotation clipping for pyplot --- src/backends/pyplot.jl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index c2b38edc..9e57027f 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -1229,7 +1229,7 @@ end function py_add_annotations(sp::Subplot{PyPlotBackend}, x, y, val) ax = sp.o - ax."annotate"(val, xy = (x,y), zorder = 999) + ax."annotate"(val, xy = (x,y), zorder = 999, annotation_clip = false) end @@ -1243,7 +1243,8 @@ function py_add_annotations(sp::Subplot{PyPlotBackend}, x, y, val::PlotText) verticalalignment = val.font.valign == :vcenter ? "center" : string(val.font.valign), rotation = val.font.rotation, size = py_thickness_scale(sp.plt, val.font.pointsize), - zorder = 999 + zorder = 999, + annotation_clip = false ) end From 3ea4c8d9cadf8e5a910dce4c62e8f0cadd0f179b Mon Sep 17 00:00:00 2001 From: yha Date: Thu, 29 Aug 2019 02:36:23 +0300 Subject: [PATCH 036/357] Correctly typed vector for all number/missing or all string/missing input --- src/series.jl | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/series.jl b/src/series.jl index d803f693..32300558 100644 --- a/src/series.jl +++ b/src/series.jl @@ -7,7 +7,9 @@ # note: returns meta information... mainly for use with automatic labeling from DataFrames for now const FuncOrFuncs{F} = Union{F, Vector{F}, Matrix{F}} -const DataPoint = Union{Number, AbstractString, Missing} +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") @@ -15,8 +17,8 @@ prepareSeriesData(::Nothing) = nothing prepareSeriesData(s::SeriesData) = handlemissings(s) handlemissings(v) = v -handlemissings(v::AbstractArray{Union{T,Missing}}) where T <: Number = replace(v, missing => NaN) -handlemissings(v::AbstractArray{Union{T,Missing}}) where T <: AbstractString = replace(v, missing => "") +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) @@ -31,8 +33,10 @@ convertToAnyVector(v::AVec{<:DataPoint}, plotattributes) = Any[prepareSeriesData # list of things (maybe other vectors, functions, or something else) function convertToAnyVector(v::AVec, plotattributes) - if all(x -> isa(x, Number) || ismissing(x), v) || all(x -> isa(x, AbstractString) || ismissing(x), v) - convertToAnyVector(convert.(DataPoint, v), plotattributes) + if all(x -> x isa MaybeNumber, v) + convertToAnyVector(Vector{MaybeNumber}(v), plotattributes) + elseif all(x -> x isa MaybeString, v) + convertToAnyVector(Vector{MaybeString}(v), plotattributes) else vcat((convertToAnyVector(vi, plotattributes) for vi in v)...) end From a4380586e9531a464245f6a91cbedeb48b2d95eb Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Thu, 29 Aug 2019 09:35:02 +0200 Subject: [PATCH 037/357] remove `@show`s --- src/backends/pyplot.jl | 1 - src/layouts.jl | 1 - src/utils.jl | 1 - 3 files changed, 3 deletions(-) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index c2b38edc..8b9d0f9e 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -726,7 +726,6 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) elseif typeof(z) <: AbstractVector # tri-surface plot (http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#tri-surface-plots) - @show x, y, z handle = ax."plot_trisurf"(x, y, z; label = series[:label], zorder = series[:series_plotindex], diff --git a/src/layouts.jl b/src/layouts.jl index 83ae259d..7dbc088d 100644 --- a/src/layouts.jl +++ b/src/layouts.jl @@ -107,7 +107,6 @@ function resolve_mixed(mix::MixedMeasures, sp::Subplot, letter::Symbol) if mix.len != 0mm f = (letter == :x ? width : height) totlen = f(plotarea(sp)) - @show totlen pct += mix.len / totlen end if pct != 0 diff --git a/src/utils.jl b/src/utils.jl index 68fb6056..08887237 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -115,7 +115,6 @@ function regressionXY(x, y) end function replace_image_with_heatmap(z::Array{T}) where T<:Colorant - @show T, size(z) n, m = size(z) # idx = 0 colors = ColorGradient(vec(z)) From 2c57e0c9582a65a5d17d447e3f81b920460a9345 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Thu, 29 Aug 2019 14:13:57 +0200 Subject: [PATCH 038/357] always return positive linthresh for pyplot with log scales --- src/backends/pyplot.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index cde16488..baa2d7b1 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -927,7 +927,7 @@ function py_set_scale(ax, sp::Subplot, axis::Axis) elseif scale == :log10 10 end - kw[Symbol(:linthresh,letter)] = NaNMath.min(1e-16, py_compute_axis_minval(sp, axis)) + kw[Symbol(:linthresh,letter)] = NaNMath.max(1e-16, py_compute_axis_minval(sp, axis)) "symlog" end func(arg; kw...) From dd645bcd9f0d9440ffe197456c4d3297ccda3820 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Mon, 2 Sep 2019 00:04:11 +0200 Subject: [PATCH 039/357] swap x/y formatters for vline --- src/args.jl | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/args.jl b/src/args.jl index 68ac3fd4..ef134731 100644 --- a/src/args.jl +++ b/src/args.jl @@ -937,6 +937,15 @@ function preprocessArgs!(plotattributes::KW) end end + # vline accesses the y argument but actually maps it to the x axis. + # Hence, we have to swap formatters + if get(plotattributes, :seriestype, :path) == :vline + xformatter = get(plotattributes, :xformatter, :auto) + yformatter = get(plotattributes, :yformatter, :auto) + plotattributes[:xformatter] = yformatter + plotattributes[:yformatter] = xformatter + end + # handle grid args common to all axes args = pop!(plotattributes, :grid, ()) for arg in wraptuple(args) From 11ae5ea014a261c84725e2f91be0e2ba2fa8a74c Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Fri, 6 Sep 2019 09:38:23 +0200 Subject: [PATCH 040/357] prepare release --- NEWS.md | 9 +++++++++ Project.toml | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index 2295b891..f280a5de 100644 --- a/NEWS.md +++ b/NEWS.md @@ -11,6 +11,15 @@ --- ## (current master) +## 0.26.3 +- fix `vline` with dates +- fix PyPlot logscale bug +- avoid annotation clipping for PyPlot +- allow plotting of Any vectors and 3D plotting again in convertToAnyVector +- specify legend title font in GR and PyPlot +- delete `pushtomaster.sh` +- use `=== nothing` + ## 0.26.2 - improve empty animation build error - fix GR axis flip for heatmaps and images diff --git a/Project.toml b/Project.toml index 6de366a5..3eb2c8c0 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.26.2" +version = "0.26.3" [deps] Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" From f8ee4da18067a84ed6e04f44d22028da4de6469d Mon Sep 17 00:00:00 2001 From: yha Date: Sun, 8 Sep 2019 15:14:35 +0300 Subject: [PATCH 041/357] Base.show method for RootLayout, to allow dump(::Plot) --- src/layouts.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/layouts.jl b/src/layouts.jl index 7dbc088d..f05fcde5 100644 --- a/src/layouts.jl +++ b/src/layouts.jl @@ -217,6 +217,7 @@ bottompad(layout::AbstractLayout) = 0mm # this is the parent of the top-level layout struct RootLayout <: AbstractLayout end +Base.show(io::IO, layout::RootLayout) = Base.show_default(io, layout) Base.parent(::RootLayout) = nothing parent_bbox(::RootLayout) = defaultbox bbox(::RootLayout) = defaultbox From 150b5a1f069fee92d251b3eb8cf0df4fb68005a9 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Mon, 9 Sep 2019 13:13:17 +0200 Subject: [PATCH 042/357] fix vline for pgfplots --- src/backends/plotly.jl | 2 +- src/utils.jl | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index ead66956..2a4b88e0 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -469,7 +469,7 @@ function plotly_series(plt::Plot, series::Series) plotattributes_out[:showlegend] = should_add_to_legend(series) if st == :straightline - x, y = straightline_data(series) + x, y = straightline_data(series, 100) z = series[:z] else x, y, z = series[:x], series[:y], series[:z] diff --git a/src/utils.jl b/src/utils.jl index 08887237..2e028906 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -1114,20 +1114,20 @@ function convert_sci_unicode(label::AbstractString) label end -function straightline_data(series) +function straightline_data(series, expansion_factor = 1) sp = series[:subplot] xl, yl = isvertical(series) ? (xlims(sp), ylims(sp)) : (ylims(sp), xlims(sp)) x, y = series[:x], series[:y] n = length(x) if n == 2 - return straightline_data(xl, yl, x, y) + return straightline_data(xl, yl, x, y, expansion_factor) else k, r = divrem(n, 3) if r == 0 xdata, ydata = fill(NaN, n), fill(NaN, n) for i in 1:k inds = (3 * i - 2):(3 * i - 1) - xdata[inds], ydata[inds] = straightline_data(xl, yl, x[inds], y[inds]) + xdata[inds], ydata[inds] = straightline_data(xl, yl, x[inds], y[inds], expansion_factor) end return xdata, ydata else @@ -1136,7 +1136,7 @@ function straightline_data(series) end end -function straightline_data(xl, yl, x, y) +function straightline_data(xl, yl, x, y, expansion_factor = 1) x_vals, y_vals = if y[1] == y[2] if x[1] == x[2] error("Two identical points cannot be used to describe a straight line.") @@ -1157,9 +1157,8 @@ function straightline_data(xl, yl, x, y) end # expand the data outside the axis limits, by a certain factor too improve # plotly(js) and interactive behaviour - factor = 100 - x_vals = x_vals .+ (x_vals[2] - x_vals[1]) .* factor .* [-1, 1] - y_vals = y_vals .+ (y_vals[2] - y_vals[1]) .* factor .* [-1, 1] + x_vals = x_vals .+ (x_vals[2] - x_vals[1]) .* expansion_factor .* [-1, 1] + y_vals = y_vals .+ (y_vals[2] - y_vals[1]) .* expansion_factor .* [-1, 1] return x_vals, y_vals end From d0c6f0d6ee88fddc8be5dd25f5957a35e3dea402 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Mon, 9 Sep 2019 13:17:34 +0200 Subject: [PATCH 043/357] expand data of shapes only for plotly(js) --- src/backends/plotly.jl | 2 +- src/utils.jl | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index 2a4b88e0..4a604889 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -584,7 +584,7 @@ function plotly_series_shapes(plt::Plot, series::Series, clims) ) x, y = (plotly_data(series, letter, data) - for (letter, data) in zip((:x, :y), shape_data(series)) + for (letter, data) in zip((:x, :y), shape_data(series, 100)) ) for (i,rng) in enumerate(segments) diff --git a/src/utils.jl b/src/utils.jl index 2e028906..9f159dbb 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -1162,23 +1162,23 @@ function straightline_data(xl, yl, x, y, expansion_factor = 1) return x_vals, y_vals end -function shape_data(series) +function shape_data(series, expansion_factor = 1) sp = series[:subplot] xl, yl = isvertical(series) ? (xlims(sp), ylims(sp)) : (ylims(sp), xlims(sp)) x, y = series[:x], series[:y] factor = 100 for i in eachindex(x) if x[i] == -Inf - x[i] = xl[1] - factor * (xl[2] - xl[1]) + x[i] = xl[1] - expansion_factor * (xl[2] - xl[1]) elseif x[i] == Inf - x[i] = xl[2] + factor * (xl[2] - xl[1]) + x[i] = xl[2] + expansion_factor * (xl[2] - xl[1]) end end for i in eachindex(y) if y[i] == -Inf - y[i] = yl[1] - factor * (yl[2] - yl[1]) + y[i] = yl[1] - expansion_factor * (yl[2] - yl[1]) elseif y[i] == Inf - y[i] = yl[2] + factor * (yl[2] - yl[1]) + y[i] = yl[2] + expansion_factor * (yl[2] - yl[1]) end end return x, y From d28164c89798a6948dadb22815836a7349548379 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Tue, 10 Sep 2019 09:30:16 +0200 Subject: [PATCH 044/357] allow to broadcast over linestyle attribute only --- src/utils.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.jl b/src/utils.jl index 9f159dbb..bf478958 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -653,7 +653,7 @@ function has_attribute_segments(series::Series) end series[:seriestype] == :shape && return false # ... else we check relevant attributes if they have multiple inputs - return any((typeof(series[attr]) <: AbstractVector && length(series[attr]) > 1) for attr in [:seriescolor, :seriesalpha, :linecolor, :linealpha, :linewidth, :fillcolor, :fillalpha, :markercolor, :markeralpha, :markerstrokecolor, :markerstrokealpha]) || any(typeof(series[attr]) <: AbstractArray for attr in (:line_z, :fill_z, :marker_z)) + return any((typeof(series[attr]) <: AbstractVector && length(series[attr]) > 1) for attr in [:seriescolor, :seriesalpha, :linecolor, :linealpha, :linewidth, :linestyle, :fillcolor, :fillalpha, :markercolor, :markeralpha, :markerstrokecolor, :markerstrokealpha]) || any(typeof(series[attr]) <: AbstractArray for attr in (:line_z, :fill_z, :marker_z)) end # --------------------------------------------------------------- From 37044e5fc8fd551a91d926f28d949368175824cc Mon Sep 17 00:00:00 2001 From: Moritz Schauer Date: Tue, 10 Sep 2019 22:36:56 +0200 Subject: [PATCH 045/357] Typo in gr.jl --- src/backends/gr.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index ccaf914a..c1f5d7c3 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -481,7 +481,7 @@ function _cbar_unique(values, propname) out = last(values) if any(x != out for x in values) @warn "Multiple series with different $propname share a colorbar. " * - "Colorbar may not refelct all series correctly." + "Colorbar may not reflect all series correctly." end out end From bd8e9dc947049a24a0ac4ff7a75221e6a7f037bd Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 11 Sep 2019 10:36:43 +0200 Subject: [PATCH 046/357] Print vectors passed to label a as vectors in GR --- src/backends/gr.jl | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index c1f5d7c3..503172d5 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -874,7 +874,6 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) # has to be done now due to a potential adjustment to the plotarea given an outer legend. legendn = 0 legendw = 0 - legendi = 0 if sp[:legend] != :none GR.savestate() GR.selntran(0) @@ -889,12 +888,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) for series in series_list(sp) should_add_to_legend(series) || continue legendn += 1 - if typeof(series[:label]) <: Array - legendi += 1 - lab = series[:label][legendi] - else - lab = series[:label] - end + lab = series[:label] tbx, tby = gr_inqtext(0, 0, string(lab)) legendw = max(legendw, tbx[3] - tbx[1]) end @@ -1485,7 +1479,6 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) GR.setscale(0) gr_set_font(legendfont(sp)) w = legendw - i = legendi n = legendn if w > 0 dy = _gr_point_mult[1] * sp[:legendfontsize] * 1.75 @@ -1538,12 +1531,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) gr_draw_markers(series, xpos - .035, ypos, clims, 6) end - if typeof(series[:label]) <: Array - i += 1 - lab = series[:label][i] - else - lab = series[:label] - end + lab = series[:label] GR.settextalign(GR.TEXT_HALIGN_LEFT, GR.TEXT_VALIGN_HALF) gr_set_textcolor(sp[:legendfontcolor]) gr_text(xpos, ypos, string(lab)) From 61e3abaf808c7927085954c0cc689b66a986c8b3 Mon Sep 17 00:00:00 2001 From: Anshul Singhvi Date: Thu, 12 Sep 2019 15:11:47 -0400 Subject: [PATCH 047/357] process_ribbon(ribbon::Tuple{Any,Any}) -> process_ribbon(ribbon::Tuple{Any,Any}, plottatributes) --- src/series.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/series.jl b/src/series.jl index 32300558..f37d501d 100644 --- a/src/series.jl +++ b/src/series.jl @@ -61,7 +61,7 @@ process_fillrange(range, plotattributes) = convertToAnyVector(range, plotattribu process_ribbon(ribbon::Number, plotattributes) = [ribbon] process_ribbon(ribbon, plotattributes) = convertToAnyVector(ribbon, plotattributes) # ribbon as a tuple: (lower_ribbons, upper_ribbons) -process_ribbon(ribbon::Tuple{Any,Any}) = collect(zip(convertToAnyVector(ribbon[1], plotattributes), +process_ribbon(ribbon::Tuple{Any,Any}, plotattributes) = collect(zip(convertToAnyVector(ribbon[1], plotattributes), convertToAnyVector(ribbon[2], plotattributes))) From 3e31c4363f03d41ca8409300b271e03a594354b8 Mon Sep 17 00:00:00 2001 From: Anshul Singhvi Date: Thu, 12 Sep 2019 15:42:54 -0400 Subject: [PATCH 048/357] add ribbon to refimages? --- src/examples.jl | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/examples.jl b/src/examples.jl index d55d3b4c..5f975dce 100644 --- a/src/examples.jl +++ b/src/examples.jl @@ -152,6 +152,23 @@ plot(y, line = (5, styles), label = map(string,styles), legendtitle = "linestyle end)] ), +PlotExample("Ribbons", + """ + Ribbons can be added to lines via the `ribbon` keyword; + you can pass a tuple of arrays (upper and lower bounds), + a single Array (for symmetric ribbons), a Function, or a number. + """, + [:(begin + plot( + plot(0:10; ribbon = (LinRange(0, 2, 10), LinRange(0, 1, 10))), + plot(0:10; ribbon = 0:0.5:5), + plot(0:10; ribbon = sqrt), + plot(0:10; ribbon = 1), + ) + end) + ] +), + PlotExample("Marker types", "", [:(begin @@ -165,7 +182,7 @@ PlotExample("Marker types", ), PlotExample("Bar", - "x is the midpoint of the bar. (todo: allow passing of edges instead of midpoints)", + "`x` is the midpoint of the bar. (todo: allow passing of edges instead of midpoints)", [:(begin bar(randn(99)) end)] From 7dc6ea355c352b53282315481b98777ecbfa1694 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Sun, 15 Sep 2019 21:29:08 +0200 Subject: [PATCH 049/357] update Plots tests for GR --- .travis.yml | 24 ++++++++++++++++- Project.toml | 6 ++--- src/Plots.jl | 2 +- src/examples.jl | 10 +++---- test/imgcomp.jl | 68 +++------------------------------------------- test/runtests.jl | 70 +++++++++++++++++++++++++++++++++--------------- 6 files changed, 84 insertions(+), 96 deletions(-) diff --git a/.travis.yml b/.travis.yml index fc303b0f..9b0ad9bc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ os: julia: - 1.1 - nightly - + matrix: allow_failures: - julia: nightly @@ -16,5 +16,27 @@ before_install: - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then pwd ; fi - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ./test/install_wkhtmltoimage.sh ; fi +addons: + apt: + packages: + - qt5-default + # pgfplots + - pdf2svg + - texlive-latex-base + - texlive-binaries + - texlive-pictures + - texlive-latex-extra + - texlive-luatex + - ghostscript-x + # orca + - libgconf2-4 + +env: + - PYTHON = "" MPLBACKEND = "agg" + notifications: email: true + +script: + - if [[ -a .git/shallow ]]; then git fetch --unshallow; fi + - xvfb-run julia -e 'using Pkg; Pkg.build(); Pkg.test(coverage=true)' diff --git a/Project.toml b/Project.toml index 3eb2c8c0..80d71153 100644 --- a/Project.toml +++ b/Project.toml @@ -41,17 +41,17 @@ julia = "≥ 1.0.0" [extras] FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +Gtk = "4c0ca9eb-093a-5379-98c5-f87ac0bbbf44" ImageMagick = "6218d12a-5da1-5696-b52f-db25d2ecc6d1" Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0" LaTeXStrings = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" -Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +LibGit2 = "76f85450-5226-5b5a-8eaa-529ad045b433" RDatasets = "ce6b1742-4840-55fa-b093-852dadbb1d8b" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" StatsPlots = "f3b207a7-027a-5e70-b257-86293d7955fd" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" UnicodePlots = "b8865327-cd53-5732-bb35-84acbb429228" VisualRegressionTests = "34922c18-7c2a-561c-bac1-01e79b2c4c92" -BinaryProvider = "b99e7846-7c00-51b0-8f62-c81ae34c0232" [targets] -test = ["BinaryProvider", "Pkg", "Test", "Random", "StatsPlots", "VisualRegressionTests", "LaTeXStrings", "Images", "ImageMagick", "RDatasets", "FileIO", "UnicodePlots"] +test = ["FileIO", "Gtk", "ImageMagick", "Images", "LaTeXStrings", "LibGit2", "Random", "RDatasets", "StatsPlots", "Test", "UnicodePlots", "VisualRegressionTests"] diff --git a/src/Plots.jl b/src/Plots.jl index 54d34615..731acd49 100644 --- a/src/Plots.jl +++ b/src/Plots.jl @@ -1,6 +1,6 @@ module Plots -_current_plots_version = v"0.26.1" +const _current_plots_version = VersionNumber(split(first(filter(line -> occursin("version", line), readlines(normpath(@__DIR__, "..", "Project.toml")))), "\"")[2]) using Reexport diff --git a/src/examples.jl b/src/examples.jl index d55d3b4c..808520e1 100644 --- a/src/examples.jl +++ b/src/examples.jl @@ -238,12 +238,12 @@ build with the method `text(string, attr...)`, which wraps font and color attrib """, [:(begin y = rand(10) -plot(y, annotations = (3,y[3],text("this is #3",:left)), leg=false) -annotate!([(5, y[5], text("this is #5",16,:red,:center)), - (10, y[10], text("this is #10",:right,20,"courier"))]) +plot(y, annotations = (3,y[3], Plots.text("this is #3",:left)), leg=false) +annotate!([(5, y[5], Plots.text("this is #5",16,:red,:center)), + (10, y[10], Plots.text("this is #10",:right,20,"courier"))]) scatter!(range(2, stop=8, length=6), rand(6), marker=(50,0.2,:orange), series_annotations = ["series","annotations","map","to","series", - text("data",:green)]) + Plots.text("data",:green)]) end)] ), @@ -461,7 +461,7 @@ _animation_examples = [2, 30] _backend_skips = Dict( :gr => [25, 30], :pyplot => [25, 30], - :plotlyjs => [2, 21, 25, 30, 31], + :plotlyjs => [2, 21, 24, 25, 30, 31], :pgfplots => [2, 5, 6, 10, 16, 20, 22, 23, 25, 28, 30], ) diff --git a/test/imgcomp.jl b/test/imgcomp.jl index 1aa4ceee..e7151573 100644 --- a/test/imgcomp.jl +++ b/test/imgcomp.jl @@ -1,34 +1,6 @@ import Plots._current_plots_version -# Taken from MakieGallery -""" -Downloads the reference images from ReferenceImages for a specific version -""" -function download_reference(version = v"0.0.1") - download_dir = abspath(@__DIR__, "reference_images") - isdir(download_dir) || mkpath(download_dir) - tarfile = joinpath(download_dir, "reference_images.zip") - url = "https://github.com/JuliaPlots/PlotReferenceImages.jl/archive/v$(version).tar.gz" - refpath = joinpath(download_dir, "PlotReferenceImages.jl-$(version)") - if !isdir(refpath) # if not yet downloaded - @info "downloading reference images for version $version" - download(url, tarfile) - BinaryProvider.unpack(tarfile, download_dir) - # check again after download - if !isdir(refpath) - error("Something went wrong while downloading reference images. Plots can't be compared to references") - else - rm(tarfile, force = true) - end - else - @info "using reference images for version $version (already downloaded)" - end - refpath -end - -const ref_image_dir = download_reference() - -function image_comparison_tests(pkg::Symbol, idx::Int; debug = false, popup = isinteractive(), sigma = [1,1], tol = 1e-2) +function image_comparison_tests(pkg::Symbol, idx::Int; debug = false, popup = !is_ci(), sigma = [1,1], tol = 1e-2) Plots._debugMode.on = debug example = Plots._examples[idx] Plots.theme(:default) @@ -39,36 +11,9 @@ function image_comparison_tests(pkg::Symbol, idx::Int; debug = false, popup = is # ensure consistent results Random.seed!(1234) - # reference image directory setup - refdir = joinpath(ref_image_dir, "Plots", string(pkg)) fn = "ref$idx.png" - - # firgure out version info - vns = filter(x->x[1] != '.', readdir(refdir)) - versions = sort(VersionNumber.(vns), rev = true) - versions = filter(v -> v <= _current_plots_version, versions) - # @show refdir fn versions - - newdir = joinpath(refdir, string(_current_plots_version)) - newfn = joinpath(newdir, fn) - - # figure out which reference file we should compare to, by finding the highest versioned file - reffn = nothing - for v in versions - tmpfn = joinpath(refdir, string(v), fn) - if isfile(tmpfn) - reffn = tmpfn - break - end - end - - # now we have the fn (if any)... do the comparison - # @show reffn - if reffn === nothing - reffn = newfn - end - # @show reffn - # return + reffn = reference_file(pkg, idx, _current_plots_version) + newfn = joinpath(reference_path(pkg, _current_plots_version), fn) # test function func = (fn, idx) -> begin @@ -78,13 +23,6 @@ function image_comparison_tests(pkg::Symbol, idx::Int; debug = false, popup = is png(fn) end - # try - # run(`mkdir -p $newdir`) - # catch err - # display(err) - # end - # # reffn = joinpath(refdir, "ref$idx.png") - # the test vtest = VisualTest(func, reffn, idx) test_images(vtest, popup=popup, sigma=sigma, tol=tol, newfn = newfn) diff --git a/test/runtests.jl b/test/runtests.jl index b0515c58..97ad4e9a 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,40 +1,68 @@ using VisualRegressionTests using Plots using Random -using BinaryProvider using Test using FileIO -using GeometryTypes +using Gtk + +reference_dir(args...) = joinpath(homedir(), ".julia", "dev", "PlotReferenceImages", args...) + +function reference_file(backend, i, version) + refdir = reference_dir("Plots", string(backend)) + fn = "ref$i.png" + versions = sort(VersionNumber.(readdir(refdir)), rev = true) + + reffn = joinpath(refdir, string(version), fn) + for v in versions + tmpfn = joinpath(refdir, string(v), fn) + if isfile(tmpfn) + reffn = tmpfn + break + end + end + + return reffn +end + +reference_path(backend, version) = reference_dir("Plots", string(backend), string(version)) + +if !isdir(reference_dir()) + LibGit2.clone("https://github.com/JuliaPlots/PlotReferenceImages.jl.git", reference_dir()) +end include("imgcomp.jl") # don't actually show the plots Random.seed!(1234) default(show=false, reuse=true) -img_tol = isinteractive() ? 1e-2 : 10e-2 +is_ci() = get(ENV, "CI", false) +img_tol = is_ci() ? 10e-2 : 10e-2 -@testset "GR" begin - ENV["PLOTS_TEST"] = "true" - ENV["GKSwstype"] = "100" - @test gr() == Plots.GRBackend() - @test backend() == Plots.GRBackend() +@testset "Backends" begin - @static if Sys.islinux() - image_comparison_facts(:gr, tol=img_tol, skip = [25, 30]) + @testset "GR" begin + ENV["PLOTS_TEST"] = "true" + ENV["GKSwstype"] = "100" + @test gr() == Plots.GRBackend() + @test backend() == Plots.GRBackend() + + @static if Sys.islinux() + image_comparison_facts(:gr, tol=img_tol, skip = Plots._backend_skips[:gr]) + end end -end + @testset "UnicodePlots" begin + @test unicodeplots() == Plots.UnicodePlotsBackend() + @test backend() == Plots.UnicodePlotsBackend() -@testset "UnicodePlots" begin - @test unicodeplots() == Plots.UnicodePlotsBackend() - @test backend() == Plots.UnicodePlotsBackend() + # lets just make sure it runs without error + p = plot(rand(10)) + @test isa(p, Plots.Plot) == true + @test isa(display(p), Nothing) == true + p = bar(randn(10)) + @test isa(p, Plots.Plot) == true + @test isa(display(p), Nothing) == true + end - # lets just make sure it runs without error - p = plot(rand(10)) - @test isa(p, Plots.Plot) == true - @test isa(display(p), Nothing) == true - p = bar(randn(10)) - @test isa(p, Plots.Plot) == true - @test isa(display(p), Nothing) == true end @testset "Axes" begin From eba6e2909289111bdcc00dfd808f7063b25a5de8 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Sun, 15 Sep 2019 21:32:44 +0200 Subject: [PATCH 050/357] use default travis script --- .travis.yml | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9b0ad9bc..0bdcb930 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,27 +16,5 @@ before_install: - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then pwd ; fi - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ./test/install_wkhtmltoimage.sh ; fi -addons: - apt: - packages: - - qt5-default - # pgfplots - - pdf2svg - - texlive-latex-base - - texlive-binaries - - texlive-pictures - - texlive-latex-extra - - texlive-luatex - - ghostscript-x - # orca - - libgconf2-4 - -env: - - PYTHON = "" MPLBACKEND = "agg" - notifications: email: true - -script: - - if [[ -a .git/shallow ]]; then git fetch --unshallow; fi - - xvfb-run julia -e 'using Pkg; Pkg.build(); Pkg.test(coverage=true)' From 5ad4c517e192b0c8a0c8cec31c4819853ec21615 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Sun, 15 Sep 2019 22:48:54 +0200 Subject: [PATCH 051/357] update travis for gtk --- .travis.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0bdcb930..6a1751b1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,9 +7,12 @@ julia: - 1.1 - nightly -matrix: - allow_failures: - - julia: nightly +addons: + apt: + packages: + - xvfb + - xauth + - libgtk-3-dev sudo: required before_install: @@ -18,3 +21,8 @@ before_install: notifications: email: true + +script: + - if [[ -a .git/shallow ]]; then git fetch --unshallow; fi + - if [[ `uname` = "Linux" ]]; then TESTCMD="xvfb-run julia"; else TESTCMD="julia"; fi + - $TESTCMD -e 'using Pkg; Pkg.build(); Pkg.test(coverage=true)' From 57286ea40d11882787ed3acc5d31f63e720837e2 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Sun, 15 Sep 2019 22:57:39 +0200 Subject: [PATCH 052/357] using LibGit2 --- test/runtests.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/test/runtests.jl b/test/runtests.jl index 97ad4e9a..26ccecfa 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -4,6 +4,7 @@ using Random using Test using FileIO using Gtk +using LibGit2 reference_dir(args...) = joinpath(homedir(), ".julia", "dev", "PlotReferenceImages", args...) From d7cc15d39121b84b7e9fb03ed20dc02b09d852d7 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Mon, 16 Sep 2019 10:50:11 +0200 Subject: [PATCH 053/357] add another travis dependency --- .travis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6a1751b1..10d4eadd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,9 +10,10 @@ julia: addons: apt: packages: - - xvfb - - xauth + - at-spi2-core - libgtk-3-dev + - xauth + - xvfb sudo: required before_install: From 1650049b88a9b82df86c97e35347339b1e778449 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Mon, 16 Sep 2019 11:08:16 +0200 Subject: [PATCH 054/357] fix checking for ci --- test/runtests.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/runtests.jl b/test/runtests.jl index 26ccecfa..b0e9a8ef 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -35,7 +35,7 @@ include("imgcomp.jl") # don't actually show the plots Random.seed!(1234) default(show=false, reuse=true) -is_ci() = get(ENV, "CI", false) +is_ci() = get(ENV, "CI", "false") == "true" img_tol = is_ci() ? 10e-2 : 10e-2 @testset "Backends" begin From 9775abecc206433fcb182f02a3765cc69ba1d481 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Mon, 16 Sep 2019 11:24:16 +0200 Subject: [PATCH 055/357] import ImageMagick --- test/runtests.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/test/runtests.jl b/test/runtests.jl index b0e9a8ef..7e40db40 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,3 +1,4 @@ +import ImageMagick using VisualRegressionTests using Plots using Random From 1da4b2eda94df96f5d8f7e7d39ad36363635e475 Mon Sep 17 00:00:00 2001 From: Sebastian Pfitzner Date: Mon, 16 Sep 2019 13:07:08 +0200 Subject: [PATCH 056/357] allow html output in Juno e.g. for the PlotlyJS backend --- src/output.jl | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/output.jl b/src/output.jl index bbc7b80e..aa5f89a3 100644 --- a/src/output.jl +++ b/src/output.jl @@ -201,6 +201,8 @@ for mime in ("text/plain", "text/html", "image/png", "image/eps", "image/svg+xml end end +Base.show(io::IO, m::MIME"application/prs.juno.plotpane+html", plt::Plot) = showjuno(io, MIME("text/html"), plt) + # default text/plain for all backends _show(io::IO, ::MIME{Symbol("text/plain")}, plt::Plot) = show(io, plt) @@ -229,7 +231,7 @@ closeall() = closeall(backend()) # Atom PlotPane # --------------------------------------------------------- function showjuno(io::IO, m, plt) - sz = plt[:size] + sz = collect(plt[:size]) dpi = plt[:dpi] thickness_scaling = plt[:thickness_scaling] @@ -258,4 +260,8 @@ function _showjuno(io::IO, m::MIME"image/svg+xml", plt) end end +function Base.showable(m::MIME"application/prs.juno.plotpane+html", plt::P) where P <: Plot + return showable(MIME("text/html"), plt) +end + _showjuno(io::IO, m, plt) = _show(io, m, plt) From 871561afd7fb4509bd15533707fcf5640431ba2e Mon Sep 17 00:00:00 2001 From: Sebastian Pfitzner Date: Mon, 16 Sep 2019 13:09:01 +0200 Subject: [PATCH 057/357] prettier function definition --- src/output.jl | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/output.jl b/src/output.jl index aa5f89a3..9fe661f4 100644 --- a/src/output.jl +++ b/src/output.jl @@ -260,8 +260,6 @@ function _showjuno(io::IO, m::MIME"image/svg+xml", plt) end end -function Base.showable(m::MIME"application/prs.juno.plotpane+html", plt::P) where P <: Plot - return showable(MIME("text/html"), plt) -end +Base.showable(::MIME"application/prs.juno.plotpane+html", plt::Plot) = showable(MIME"text/html"(), plt) _showjuno(io::IO, m, plt) = _show(io, m, plt) From 5d5c4d76b91a0b33614715f96f86eca8c22e6c94 Mon Sep 17 00:00:00 2001 From: Sebastian Pfitzner Date: Mon, 16 Sep 2019 13:46:02 +0200 Subject: [PATCH 058/357] make Juno plots devicePixelRatio aware --- src/output.jl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/output.jl b/src/output.jl index bbc7b80e..95a1699e 100644 --- a/src/output.jl +++ b/src/output.jl @@ -234,10 +234,11 @@ function showjuno(io::IO, m, plt) thickness_scaling = plt[:thickness_scaling] jsize = get(io, :juno_plotsize, [400, 500]) + jdpi = get(io, :juno_dpi_ratio, 1)*Plots.DPI scale = minimum(jsize[i] / sz[i] for i in 1:2) plt[:size] = (s * scale for s in sz) - plt[:dpi] = Plots.DPI + plt[:dpi] = jdpi plt[:thickness_scaling] *= scale prepare_output(plt) From 1e0fcbc65ee376b42bfc96708ca74d9fd1f69627 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Tue, 17 Sep 2019 14:06:15 +0200 Subject: [PATCH 059/357] use GeometryTypes in Tests --- Project.toml | 3 ++- test/runtests.jl | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 80d71153..2ac80ca7 100644 --- a/Project.toml +++ b/Project.toml @@ -41,6 +41,7 @@ julia = "≥ 1.0.0" [extras] FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +GeometryTypes = "4d00f742-c7ba-57c2-abde-4428a4b178cb" Gtk = "4c0ca9eb-093a-5379-98c5-f87ac0bbbf44" ImageMagick = "6218d12a-5da1-5696-b52f-db25d2ecc6d1" Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0" @@ -54,4 +55,4 @@ UnicodePlots = "b8865327-cd53-5732-bb35-84acbb429228" VisualRegressionTests = "34922c18-7c2a-561c-bac1-01e79b2c4c92" [targets] -test = ["FileIO", "Gtk", "ImageMagick", "Images", "LaTeXStrings", "LibGit2", "Random", "RDatasets", "StatsPlots", "Test", "UnicodePlots", "VisualRegressionTests"] +test = ["FileIO", "GeometryTypes", "Gtk", "ImageMagick", "Images", "LaTeXStrings", "LibGit2", "Random", "RDatasets", "StatsPlots", "Test", "UnicodePlots", "VisualRegressionTests"] diff --git a/test/runtests.jl b/test/runtests.jl index 7e40db40..71877e34 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -6,6 +6,7 @@ using Test using FileIO using Gtk using LibGit2 +using GeometryTypes reference_dir(args...) = joinpath(homedir(), ".julia", "dev", "PlotReferenceImages", args...) From f7e19bcf6368df653daafd74cfbf22c06ae84eaa Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Tue, 17 Sep 2019 15:40:00 +0200 Subject: [PATCH 060/357] fix Point ambiguity --- test/runtests.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/runtests.jl b/test/runtests.jl index 71877e34..6cdc6d60 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -128,6 +128,6 @@ end [(missing,missing)], [(missing,missing,missing),("a","b","c")]) for z in zipped @test isequal(collect(zip(Plots.unzip(z)...)), z) - @test isequal(collect(zip(Plots.unzip(Point.(z))...)), z) + @test isequal(collect(zip(Plots.unzip(GeometryTypes.Point.(z))...)), z) end end From 03d2f704c506f9ce8274a70cba3a73c8b777f0f8 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 17 Sep 2019 17:05:34 +0200 Subject: [PATCH 061/357] add tikz ending --- src/output.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/output.jl b/src/output.jl index bbc7b80e..c6d67b0d 100644 --- a/src/output.jl +++ b/src/output.jl @@ -72,6 +72,7 @@ const _savemap = Dict( "eps" => eps, "tex" => tex, "html" => html, + "tikz" => tex, ) function getExtension(fn::AbstractString) From ba8110dc20edbc1ef65b18abad05180470220f70 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 18 Sep 2019 18:38:01 +0200 Subject: [PATCH 062/357] create PlotReferenceImages dev path for appveyor --- test/runtests.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/test/runtests.jl b/test/runtests.jl index 6cdc6d60..24feab44 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -30,6 +30,7 @@ end reference_path(backend, version) = reference_dir("Plots", string(backend), string(version)) if !isdir(reference_dir()) + mkpath(reference_dir()) LibGit2.clone("https://github.com/JuliaPlots/PlotReferenceImages.jl.git", reference_dir()) end From 3b962ffb08b45a6a821bc236ccdeab7d6368d6a0 Mon Sep 17 00:00:00 2001 From: Ben Ide Date: Wed, 18 Sep 2019 19:09:43 -0400 Subject: [PATCH 063/357] added latex formatter for ticks (solves #2042, #2147) --- src/axes.jl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/axes.jl b/src/axes.jl index 6eb23422..d3120886 100644 --- a/src/axes.jl +++ b/src/axes.jl @@ -218,6 +218,8 @@ function optimal_ticks_and_labels(sp::Subplot, axis::Axis, ticks = nothing) map(labelfunc(scale, backend()), Showoff.showoff(scaled_ticks, :plain)) elseif formatter == :scientific Showoff.showoff(unscaled_ticks, :scientific) + elseif formatter == :latex + map(x -> string("\$", replace(convert_sci_unicode(x), '×' => "\\times"), "\$"), Showoff.showoff(unscaled_ticks, :auto)) else # there was an override for the formatter... use that on the unscaled ticks map(formatter, unscaled_ticks) From f6d37afba0a04cfda84136d6b98b369e1810b8dd Mon Sep 17 00:00:00 2001 From: Sebastian Pfitzner Date: Thu, 19 Sep 2019 11:37:38 +0200 Subject: [PATCH 064/357] actually fix dpi issues in Juno? --- src/output.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/output.jl b/src/output.jl index 4fa7df25..accb7142 100644 --- a/src/output.jl +++ b/src/output.jl @@ -237,11 +237,11 @@ function showjuno(io::IO, m, plt) thickness_scaling = plt[:thickness_scaling] jsize = get(io, :juno_plotsize, [400, 500]) - jdpi = get(io, :juno_dpi_ratio, 1)*Plots.DPI + jratio = get(io, :juno_dpi_ratio, 1) scale = minimum(jsize[i] / sz[i] for i in 1:2) - plt[:size] = (s * scale for s in sz) - plt[:dpi] = jdpi + plt[:size] = [s * scale for s in sz]./jratio + plt[:dpi] = jratio*Plots.DPI plt[:thickness_scaling] *= scale prepare_output(plt) From 831987c76f05a5e5748e0389925a7552a72f40c1 Mon Sep 17 00:00:00 2001 From: Miles Frain Date: Thu, 19 Sep 2019 12:36:33 -0700 Subject: [PATCH 065/357] maintain original plot size --- src/output.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/output.jl b/src/output.jl index accb7142..ac29815c 100644 --- a/src/output.jl +++ b/src/output.jl @@ -240,7 +240,7 @@ function showjuno(io::IO, m, plt) jratio = get(io, :juno_dpi_ratio, 1) scale = minimum(jsize[i] / sz[i] for i in 1:2) - plt[:size] = [s * scale for s in sz]./jratio + plt[:size] = [s * scale for s in sz] plt[:dpi] = jratio*Plots.DPI plt[:thickness_scaling] *= scale From 216dae97fccf4c8d1060e5b7665bb639100d8cad Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Sat, 28 Sep 2019 22:09:53 +0200 Subject: [PATCH 066/357] take y values from adapted_grid --- src/series.jl | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/series.jl b/src/series.jl index 32300558..a4d21d47 100644 --- a/src/series.jl +++ b/src/series.jl @@ -515,20 +515,24 @@ end # # special handling... xmin/xmax with parametric function(s) @recipe function f(f::Function, xmin::Number, xmax::Number) xscale, yscale = [get(plotattributes, sym, :identity) for sym=(:xscale,:yscale)] - xs = _scaled_adapted_grid(f, xscale, yscale, xmin, xmax) - xs, f + _scaled_adapted_grid(f, xscale, yscale, xmin, xmax) end @recipe function f(fs::AbstractArray{F}, xmin::Number, xmax::Number) where F<:Function xscale, yscale = [get(plotattributes, sym, :identity) for sym=(:xscale,:yscale)] - xs = Any[_scaled_adapted_grid(f, xscale, yscale, xmin, xmax) for f in fs] - xs, fs + xs = ys = Array{Any}(undef, length(fs)) + for (i, (x, y)) in enumerate(_scaled_adapted_grid(f, xscale, yscale, xmin, xmax) for f in fs) + xs[i] = x + ys[i] = y + end + xs, ys end @recipe f(fx::FuncOrFuncs{F}, fy::FuncOrFuncs{G}, u::AVec) where {F<:Function,G<:Function} = mapFuncOrFuncs(fx, u), mapFuncOrFuncs(fy, u) @recipe f(fx::FuncOrFuncs{F}, fy::FuncOrFuncs{G}, umin::Number, umax::Number, n = 200) where {F<:Function,G<:Function} = fx, fy, range(umin, stop = umax, length = n) function _scaled_adapted_grid(f, xscale, yscale, xmin, xmax) (xf, xinv), (yf, yinv) = ((scalefunc(s),invscalefunc(s)) for s in (xscale,yscale)) - xinv.(adapted_grid(yf∘f∘xinv, xf.((xmin, xmax)))) + xs, ys = adapted_grid(yf∘f∘xinv, xf.((xmin, xmax))) + xinv.(xs), yinv.(ys) end # From 62fe5d003e36acd8201fc5472a85d0112d26ca5f Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Sat, 28 Sep 2019 22:34:32 +0200 Subject: [PATCH 067/357] add test for adapted_grid usage --- test/runtests.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/test/runtests.jl b/test/runtests.jl index 24feab44..55c7e963 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -93,6 +93,7 @@ end for plt in plots display(plt) end + @test_nowarn plot(x->x^2,0,2) end @testset "EmptyAnim" begin From caca1b2e3c56cad4a9107e6dc7ac2a3483a39e35 Mon Sep 17 00:00:00 2001 From: Iain Skett Date: Tue, 8 Oct 2019 00:17:21 +0100 Subject: [PATCH 068/357] Generalise fps to support fractional arguments (rational or float) as well as integer. --- src/animation.jl | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/animation.jl b/src/animation.jl index 7d55b567..aa8fe78e 100644 --- a/src/animation.jl +++ b/src/animation.jl @@ -64,10 +64,12 @@ gif(anim::Animation, fn = giffn(); kw...) = buildanimation(anim, fn; kw...) mov(anim::Animation, fn = movfn(); kw...) = buildanimation(anim, fn, false; kw...) mp4(anim::Animation, fn = mp4fn(); kw...) = buildanimation(anim, fn, false; kw...) +ffmpeg_framerate(fps) = "$fps" +ffmpeg_framerate(fps::Rational) = "$(fps.num)/$(fps.den)" function buildanimation(anim::Animation, fn::AbstractString, is_animated_gif::Bool=true; - fps::Integer = 20, loop::Integer = 0, + fps::Real = 20, loop::Integer = 0, variable_palette::Bool=false, show_msg::Bool=true) if length(anim.frames) == 0 @@ -76,20 +78,21 @@ function buildanimation(anim::Animation, fn::AbstractString, fn = abspath(expanduser(fn)) animdir = anim.dir + framerate = ffmpeg_framerate(fps) if is_animated_gif if variable_palette # generate a colorpalette for each frame for highest quality, but larger filesize palette="palettegen=stats_mode=single[pal],[0:v][pal]paletteuse=new=1" - ffmpeg_exe(`-v 0 -framerate $fps -loop $loop -i $(animdir)/%06d.png -lavfi "$palette" -y $fn`) + ffmpeg_exe(`-v 0 -framerate $framerate -loop $loop -i $(animdir)/%06d.png -lavfi "$palette" -y $fn`) else # generate a colorpalette first so ffmpeg does not have to guess it ffmpeg_exe(`-v 0 -i $(animdir)/%06d.png -vf "palettegen=stats_mode=diff" -y "$(animdir)/palette.bmp"`) # then apply the palette to get better results - ffmpeg_exe(` -v 0 -framerate $fps -loop $loop -i $(animdir)/%06d.png -i "$(animdir)/palette.bmp" -lavfi "paletteuse=dither=sierra2_4a" -y $fn`) + ffmpeg_exe(` -v 0 -framerate $framerate -loop $loop -i $(animdir)/%06d.png -i "$(animdir)/palette.bmp" -lavfi "paletteuse=dither=sierra2_4a" -y $fn`) end else - ffmpeg_exe(`-v 0 -framerate $fps -loop $loop -i $(animdir)/%06d.png -pix_fmt yuv420p -y $fn`) + ffmpeg_exe(`-v 0 -framerate $framerate -loop $loop -i $(animdir)/%06d.png -pix_fmt yuv420p -y $fn`) end show_msg && @info("Saved animation to ", fn) From 74beb86530d8eeb2d99f841438c8b4021e047b1e Mon Sep 17 00:00:00 2001 From: Michael Krabbe Borregaard Date: Tue, 8 Oct 2019 09:34:52 +0200 Subject: [PATCH 069/357] Up minimum dependency version of PlotUtils --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 2ac80ca7..1cba5889 100644 --- a/Project.toml +++ b/Project.toml @@ -34,7 +34,7 @@ UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" FixedPointNumbers = "≥ 0.3.0" GR = "≥ 0.31.0" PlotThemes = "≥ 0.1.3" -PlotUtils = "≥ 0.4.1" +PlotUtils = "≥ 0.6.0" RecipesBase = "≥ 0.6.0" StatsBase = "≥ 0.14.0" julia = "≥ 1.0.0" From 4f705a6e5892ad537a245a2aaec4d18c8789386c Mon Sep 17 00:00:00 2001 From: Michael Krabbe Borregaard Date: Tue, 8 Oct 2019 09:40:36 +0200 Subject: [PATCH 070/357] Update Project.toml --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 1cba5889..087277df 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.26.3" +version = "0.27.0" [deps] Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" From 926a023b1d14ce66784a2d06cb14e72b66000454 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Fri, 11 Oct 2019 12:52:38 +0200 Subject: [PATCH 071/357] fix html output of video animations --- src/animation.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/animation.jl b/src/animation.jl index 7d55b567..cac6ca3a 100644 --- a/src/animation.jl +++ b/src/animation.jl @@ -104,7 +104,7 @@ function Base.show(io::IO, ::MIME"text/html", agif::AnimatedGif) write(io, if ext == "gif" "" elseif ext in ("mov", "mp4") - "" + "" else error("Cannot show animation with extension $ext: $agif") end) From 12df8fa5009690780a241bb16af5fe13a8ce750d Mon Sep 17 00:00:00 2001 From: Anshul Singhvi Date: Thu, 12 Sep 2019 15:11:47 -0400 Subject: [PATCH 072/357] process_ribbon(ribbon::Tuple{Any,Any}) -> process_ribbon(ribbon::Tuple{Any,Any}, plottatributes) --- src/series.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/series.jl b/src/series.jl index a4d21d47..bbc2248f 100644 --- a/src/series.jl +++ b/src/series.jl @@ -61,7 +61,7 @@ process_fillrange(range, plotattributes) = convertToAnyVector(range, plotattribu process_ribbon(ribbon::Number, plotattributes) = [ribbon] process_ribbon(ribbon, plotattributes) = convertToAnyVector(ribbon, plotattributes) # ribbon as a tuple: (lower_ribbons, upper_ribbons) -process_ribbon(ribbon::Tuple{Any,Any}) = collect(zip(convertToAnyVector(ribbon[1], plotattributes), +process_ribbon(ribbon::Tuple{Any,Any}, plotattributes) = collect(zip(convertToAnyVector(ribbon[1], plotattributes), convertToAnyVector(ribbon[2], plotattributes))) From d179b5d6bff04e22694b4e972bd70446482f4e72 Mon Sep 17 00:00:00 2001 From: Anshul Singhvi Date: Thu, 12 Sep 2019 15:42:54 -0400 Subject: [PATCH 073/357] add ribbon to refimages? --- src/examples.jl | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/examples.jl b/src/examples.jl index 808520e1..f6d2296d 100644 --- a/src/examples.jl +++ b/src/examples.jl @@ -152,6 +152,23 @@ plot(y, line = (5, styles), label = map(string,styles), legendtitle = "linestyle end)] ), +PlotExample("Ribbons", + """ + Ribbons can be added to lines via the `ribbon` keyword; + you can pass a tuple of arrays (upper and lower bounds), + a single Array (for symmetric ribbons), a Function, or a number. + """, + [:(begin + plot( + plot(0:10; ribbon = (LinRange(0, 2, 10), LinRange(0, 1, 10))), + plot(0:10; ribbon = 0:0.5:5), + plot(0:10; ribbon = sqrt), + plot(0:10; ribbon = 1), + ) + end) + ] +), + PlotExample("Marker types", "", [:(begin @@ -165,7 +182,7 @@ PlotExample("Marker types", ), PlotExample("Bar", - "x is the midpoint of the bar. (todo: allow passing of edges instead of midpoints)", + "`x` is the midpoint of the bar. (todo: allow passing of edges instead of midpoints)", [:(begin bar(randn(99)) end)] From 28903d5db2cd7720f0e6e683fc51682fcd561259 Mon Sep 17 00:00:00 2001 From: daschw Date: Sun, 13 Oct 2019 17:11:46 +0200 Subject: [PATCH 074/357] move ribbon example to the end --- src/examples.jl | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/examples.jl b/src/examples.jl index f6d2296d..5919d8a4 100644 --- a/src/examples.jl +++ b/src/examples.jl @@ -152,23 +152,6 @@ plot(y, line = (5, styles), label = map(string,styles), legendtitle = "linestyle end)] ), -PlotExample("Ribbons", - """ - Ribbons can be added to lines via the `ribbon` keyword; - you can pass a tuple of arrays (upper and lower bounds), - a single Array (for symmetric ribbons), a Function, or a number. - """, - [:(begin - plot( - plot(0:10; ribbon = (LinRange(0, 2, 10), LinRange(0, 1, 10))), - plot(0:10; ribbon = 0:0.5:5), - plot(0:10; ribbon = sqrt), - plot(0:10; ribbon = 1), - ) - end) - ] -), - PlotExample("Marker types", "", [:(begin @@ -471,6 +454,23 @@ see: http://stackoverflow.com/a/37732384/5075246 end)] ), +PlotExample("Ribbons", + """ + Ribbons can be added to lines via the `ribbon` keyword; + you can pass a tuple of arrays (upper and lower bounds), + a single Array (for symmetric ribbons), a Function, or a number. + """, + [:(begin + plot( + plot(0:10; ribbon = (LinRange(0, 2, 10), LinRange(0, 1, 10))), + plot(0:10; ribbon = 0:0.5:5), + plot(0:10; ribbon = sqrt), + plot(0:10; ribbon = 1), + ) + end) + ] +), + ] # Some constants for PlotDocs and PlotReferenceImages From e12b0a585c8c49a37f3c16e22bc6ad37a15f052d Mon Sep 17 00:00:00 2001 From: daschw Date: Sun, 13 Oct 2019 17:31:09 +0200 Subject: [PATCH 075/357] remove ribbon example from in between --- src/examples.jl | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/examples.jl b/src/examples.jl index 642c3a7e..5919d8a4 100644 --- a/src/examples.jl +++ b/src/examples.jl @@ -152,23 +152,6 @@ plot(y, line = (5, styles), label = map(string,styles), legendtitle = "linestyle end)] ), -PlotExample("Ribbons", - """ - Ribbons can be added to lines via the `ribbon` keyword; - you can pass a tuple of arrays (upper and lower bounds), - a single Array (for symmetric ribbons), a Function, or a number. - """, - [:(begin - plot( - plot(0:10; ribbon = (LinRange(0, 2, 10), LinRange(0, 1, 10))), - plot(0:10; ribbon = 0:0.5:5), - plot(0:10; ribbon = sqrt), - plot(0:10; ribbon = 1), - ) - end) - ] -), - PlotExample("Marker types", "", [:(begin From f632cd48a4209ab2d3305af328f2d301cde802e3 Mon Sep 17 00:00:00 2001 From: daschw Date: Sun, 13 Oct 2019 19:20:11 +0200 Subject: [PATCH 076/357] update julia versions for CI --- .travis.yml | 7 ++++++- appveyor.yml | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 10d4eadd..1bd6d03c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,9 +4,14 @@ os: - linux # - osx julia: - - 1.1 + - 1 + - 1.2 - nightly +matrix: + allow_failures: + - julia: nightly + addons: apt: packages: diff --git a/appveyor.yml b/appveyor.yml index 3490f07b..b0bbcfc0 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -2,6 +2,7 @@ environment: matrix: # - julia_version: 0.7 - julia_version: 1 + - julia_version: 1.2 - julia_version: nightly platform: From d0a73eb862cf62a2e7dde414ab944a499903595b Mon Sep 17 00:00:00 2001 From: Nicolau Leal Werneck Date: Mon, 21 Oct 2019 23:03:44 +0200 Subject: [PATCH 077/357] Update pyplot.jl Adds a half-pixel margin to the extent for image plots so that the pixel coordinates match the grid, i.e. the center of each square pixel lies over its integral index numbers, and each square covers half a pixel before and after that. --- src/backends/pyplot.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index baa2d7b1..27ce9a4c 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -756,7 +756,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) cmap = py_colormap(cgrad([:black, :white])), vmin = 0.0, vmax = 1.0, - extent = (xmin, xmax, ymax, ymin) + extent = (xmin-0.5, xmax+0.5, ymax+0.5, ymin-0.5) ) push!(handles, handle) From cc14ab20bb9e2678f1494cb264dc81187d7cb6fa Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Mon, 28 Oct 2019 12:49:07 +0100 Subject: [PATCH 078/357] neglect clims for series without colorbar entry --- src/utils.jl | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/utils.jl b/src/utils.jl index bf478958..48eb1126 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -525,11 +525,13 @@ function get_clims(sp::Subplot) zmin, zmax = Inf, -Inf z_colored_series = (:contour, :contour3d, :heatmap, :histogram2d, :surface) for series in series_list(sp) - for vals in (series[:seriestype] in z_colored_series ? series[:z] : nothing, series[:line_z], series[:marker_z], series[:fill_z]) - if (typeof(vals) <: AbstractSurface) && (eltype(vals.surf) <: Union{Missing, Real}) - zmin, zmax = _update_clims(zmin, zmax, ignorenan_extrema(vals.surf)...) - elseif (vals !== nothing) && (eltype(vals) <: Union{Missing, Real}) - zmin, zmax = _update_clims(zmin, zmax, ignorenan_extrema(vals)...) + if series[:colorbar_entry] + for vals in (series[:seriestype] in z_colored_series ? series[:z] : nothing, series[:line_z], series[:marker_z], series[:fill_z]) + if (typeof(vals) <: AbstractSurface) && (eltype(vals.surf) <: Union{Missing, Real}) + zmin, zmax = _update_clims(zmin, zmax, ignorenan_extrema(vals.surf)...) + elseif (vals !== nothing) && (eltype(vals) <: Union{Missing, Real}) + zmin, zmax = _update_clims(zmin, zmax, ignorenan_extrema(vals)...) + end end end end From 17eef46da2541981beb89047ca912cd83d23154e Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Mon, 28 Oct 2019 18:50:02 +0100 Subject: [PATCH 079/357] separate clims for colorbar_entry=false series for GR --- src/backends/gr.jl | 28 ++++------------------------ src/utils.jl | 36 ++++++++++++++++++++++++++++-------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 503172d5..84c9b24a 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -260,19 +260,6 @@ function gr_fill_viewport(vp::AVec{Float64}, c) GR.restorestate() end - -normalize_zvals(args...) = nothing -function normalize_zvals(zv::AVec, clims::NTuple{2, <:Real}) - vmin, vmax = ignorenan_extrema(zv) - isfinite(clims[1]) && (vmin = clims[1]) - isfinite(clims[2]) && (vmax = clims[2]) - if vmin == vmax - zeros(length(zv)) - else - clamp.((zv .- vmin) ./ (vmax .- vmin), 0, 1) - end -end - # --------------------------------------------------------- # draw ONE Shape @@ -920,8 +907,6 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) # reduced from before... set some flags based on the series in this subplot # TODO: can these be generic flags? outside_ticks = false - # calculate the colorbar limits once for a subplot - clims = get_clims(sp) cbar = GRColorbar() draw_axes = sp[:framestyle] != :none @@ -995,14 +980,6 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) GR.setlinewidth(sp.plt[:thickness_scaling]) if is3d(sp) - # TODO do we really need a different clims computation here from the one - # computed above using get_clims(sp)? - zmin, zmax = gr_lims(sp, zaxis, true) - clims3d = sp[:clims] - if is_2tuple(clims3d) - isfinite(clims3d[1]) && (zmin = clims3d[1]) - isfinite(clims3d[2]) && (zmax = clims3d[2]) - end GR.setspace(zmin, zmax, round.(Int, sp[:camera])...) xtick = GR.tick(xmin, xmax) / 2 ytick = GR.tick(ymin, ymax) / 2 @@ -1234,6 +1211,8 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) x, y, z = series[:x], series[:y], series[:z] frng = series[:fillrange] + clims = get_clims(sp, series) + # add custom frame shapes to markershape? series_annotations_shapes!(series) # ------------------------------------------------------- @@ -1470,7 +1449,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) end # draw the colorbar - hascolorbar(sp) && gr_draw_colorbar(cbar, sp, clims) + hascolorbar(sp) && gr_draw_colorbar(cbar, sp, get_clims(sp)) # add the legend if sp[:legend] != :none @@ -1498,6 +1477,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) gr_set_font(legendfont(sp)) end for series in series_list(sp) + clims = get_clims(sp, series) should_add_to_legend(series) || continue st = series[:seriestype] lc = get_linecolor(series, clims) diff --git a/src/utils.jl b/src/utils.jl index 48eb1126..0c2b4b80 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -523,16 +523,9 @@ zlims(sp_idx::Int = 1) = zlims(current(), sp_idx) function get_clims(sp::Subplot) zmin, zmax = Inf, -Inf - z_colored_series = (:contour, :contour3d, :heatmap, :histogram2d, :surface) for series in series_list(sp) if series[:colorbar_entry] - for vals in (series[:seriestype] in z_colored_series ? series[:z] : nothing, series[:line_z], series[:marker_z], series[:fill_z]) - if (typeof(vals) <: AbstractSurface) && (eltype(vals.surf) <: Union{Missing, Real}) - zmin, zmax = _update_clims(zmin, zmax, ignorenan_extrema(vals.surf)...) - elseif (vals !== nothing) && (eltype(vals) <: Union{Missing, Real}) - zmin, zmax = _update_clims(zmin, zmax, ignorenan_extrema(vals)...) - end - end + zmin, zmax = _update_clims(zmin, zmax, get_clims(series)...) end end clims = sp[:clims] @@ -543,6 +536,33 @@ function get_clims(sp::Subplot) return zmin < zmax ? (zmin, zmax) : (-0.1, 0.1) end +function get_clims(sp::Subplot, series::Series) + zmin, zmax = if series[:colorbar_entry] + get_clims(sp) + else + get_clims(series) + end + clims = sp[:clims] + if is_2tuple(clims) + isfinite(clims[1]) && (zmin = clims[1]) + isfinite(clims[2]) && (zmax = clims[2]) + end + return zmin < zmax ? (zmin, zmax) : (-0.1, 0.1) +end + +function get_clims(series::Series) + zmin, zmax = Inf, -Inf + z_colored_series = (:contour, :contour3d, :heatmap, :histogram2d, :surface) + for vals in (series[:seriestype] in z_colored_series ? series[:z] : nothing, series[:line_z], series[:marker_z], series[:fill_z]) + if (typeof(vals) <: AbstractSurface) && (eltype(vals.surf) <: Union{Missing, Real}) + zmin, zmax = _update_clims(zmin, zmax, ignorenan_extrema(vals.surf)...) + elseif (vals !== nothing) && (eltype(vals) <: Union{Missing, Real}) + zmin, zmax = _update_clims(zmin, zmax, ignorenan_extrema(vals)...) + end + end + return zmin < zmax ? (zmin, zmax) : (-0.1, 0.1) +end + _update_clims(zmin, zmax, emin, emax) = min(zmin, emin), max(zmax, emax) @enum ColorbarStyle cbar_gradient cbar_fill cbar_lines From b58c52f12ceca209a2a18733d577cd2e59533a18 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Mon, 28 Oct 2019 18:54:01 +0100 Subject: [PATCH 080/357] per series clims for plotly --- src/backends/plotly.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index 4a604889..4fcb334f 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -454,7 +454,7 @@ function plotly_series(plt::Plot, series::Series) st = series[:seriestype] sp = series[:subplot] - clims = get_clims(sp) + clims = get_clims(sp, series) if st == :shape return plotly_series_shapes(plt, series, clims) From 9b4a51c5bef5172473dd8981dd3435add28c3f8d Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Mon, 28 Oct 2019 19:01:07 +0100 Subject: [PATCH 081/357] per series clims for pyplot() --- src/backends/pyplot.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index 27ce9a4c..0b36999b 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -399,7 +399,7 @@ function py_add_series(plt::Plot{PyPlotBackend}, series::Series) # handle zcolor and get c/cmap needs_colorbar = hascolorbar(sp) - vmin, vmax = clims = get_clims(sp) + vmin, vmax = clims = get_clims(sp, series) # Dict to store extra kwargs if st == :wireframe @@ -1290,13 +1290,13 @@ py_legend_bbox(pos) = pos function py_add_legend(plt::Plot, sp::Subplot, ax) leg = sp[:legend] - clims = get_clims(sp) if leg != :none # gotta do this to ensure both axes are included labels = [] handles = [] for series in series_list(sp) if should_add_to_legend(series) + clims = get_clims(sp, series) # add a line/marker and a label push!(handles, if series[:seriestype] == :shape || series[:fillrange] !== nothing pypatches."Patch"( From cf8bd786d0a8f123bcea430aef6326212e8d9931 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Mon, 28 Oct 2019 19:40:56 +0100 Subject: [PATCH 082/357] readd deleted lines in GR --- src/backends/gr.jl | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 84c9b24a..7aee8768 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -980,6 +980,14 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) GR.setlinewidth(sp.plt[:thickness_scaling]) if is3d(sp) + # TODO do we really need a different clims computation here from the one + # computed above using get_clims(sp)? + zmin, zmax = gr_lims(sp, zaxis, true) + clims3d = sp[:clims] + if is_2tuple(clims3d) + isfinite(clims3d[1]) && (zmin = clims3d[1]) + isfinite(clims3d[2]) && (zmax = clims3d[2]) + end GR.setspace(zmin, zmax, round.(Int, sp[:camera])...) xtick = GR.tick(xmin, xmax) / 2 ytick = GR.tick(ymin, ymax) / 2 From 798d78813a7f12a4fcdf00b3a425bb126c447846 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Thu, 31 Oct 2019 14:28:19 +0100 Subject: [PATCH 083/357] allow minorgrid = true for only two tick values --- src/axes.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/axes.jl b/src/axes.jl index d3120886..085d2bc5 100644 --- a/src/axes.jl +++ b/src/axes.jl @@ -297,7 +297,7 @@ function get_minor_ticks(sp, axis, ticks) #Add one phantom tick either side of the ticks to ensure minor ticks extend to the axis limits if length(ticks) > 2 ratio = (ticks[3] - ticks[2])/(ticks[2] - ticks[1]) - elseif axis[:scale] == :none + elseif axis[:scale] in (:none, :identity) ratio = 1 else return nothing From 8a9e963d929d660fd9f9a0a3add25a3d61ff3b3a Mon Sep 17 00:00:00 2001 From: Lukas Hauertmann Date: Fri, 1 Nov 2019 12:03:59 +0100 Subject: [PATCH 084/357] Nonuniform heatmaps are now possible with the GR backend. At least for the cartesian case. For polar plots it's still not possible. --- src/backends/gr.jl | 69 +++++++++++++++++++++++++++++++++------------- 1 file changed, 50 insertions(+), 19 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 7aee8768..ef05550b 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -920,11 +920,26 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) outside_ticks = true for ax in (sp[:xaxis], sp[:yaxis]) v = series[ax[:letter]] - if length(v) > 1 && diff(collect(extrema(diff(v))))[1] > 1e-6*std(v) - @warn("GR: heatmap only supported with equally spaced data.") - end end - x, y = heatmap_edges(series[:x], sp[:xaxis][:scale]), heatmap_edges(series[:y], sp[:yaxis][:scale]) + fx, fy = scalefunc(sp[:xaxis][:scale]), scalefunc(sp[:yaxis][:scale]) + nx, ny = length(series[:x]), length(series[:y]) + z = series[:z] + use_midpoints = size(z) == (ny, nx) + use_edges = size(z) == (ny - 1, nx - 1) + if !use_midpoints && !use_edges + error("""Length of x & y does not match the size of z. + Must be either `size(z) == (length(y), length(x))` (x & y define midpoints) + or `size(z) == (length(y)+1, length(x)+1))` (x & y define edges).""") + end + x, y = if use_midpoints + x_diff, y_diff = diff(series[:x]) ./ 2, diff(series[:y]) ./ 2 + x = [ series[:x][1] - x_diff[1], (series[:x][1:end-1] .+ x_diff)..., series[:x][end] + x_diff[end] ] + y = [ series[:y][1] - y_diff[1], (series[:y][1:end-1] .+ y_diff)..., series[:y][end] + y_diff[end] ] + x, y + else + series[:x], series[:y] + end + x, y = map(fx, series[:x]), map(fy, series[:y]) xy_lims = x[1], x[end], y[1], y[end] expand_extrema!(sp[:xaxis], x) expand_extrema!(sp[:yaxis], y) @@ -1316,24 +1331,40 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) elseif st == :heatmap zmin, zmax = clims + nx, ny = length(series[:x]), length(series[:y]) + use_midpoints = length(z) == ny * nx if !ispolar(sp) - xmin, xmax, ymin, ymax = xy_lims - m, n = length(x), length(y) GR.setspace(zmin, zmax, 0, 90) - grad = isa(series[:fillcolor], ColorGradient) ? series[:fillcolor] : cgrad() - colors = [plot_color(grad[clamp((zi-zmin) / (zmax-zmin), 0, 1)], series[:fillalpha]) for zi=z] - rgba = map(c -> UInt32( round(UInt, alpha(c) * 255) << 24 + - round(UInt, blue(c) * 255) << 16 + - round(UInt, green(c) * 255) << 8 + - round(UInt, red(c) * 255) ), colors) - w, h = length(x), length(y) - GR.drawimage(xmin, xmax, ymax, ymin, w, h, rgba) + x, y = if use_midpoints + x_diff, y_diff = diff(series[:x]) ./ 2, diff(series[:y]) ./ 2 + x = [ series[:x][1] - x_diff[1], (series[:x][1:end-1] .+ x_diff)..., series[:x][end] + x_diff[end] ] + y = [ series[:y][1] - y_diff[1], (series[:y][1:end-1] .+ y_diff)..., series[:y][end] + y_diff[end] ] + x, y + else + series[:x], series[:y] + end + w, h = length(x) - 1, length(y) - 1 + z_normalized = map(x -> GR.jlgr.normalize_color(x, zmin, zmax), z) + colors = Int32[round(Int32, 1000 + _i * 255) for _i in z_normalized] + GR.nonuniformcellarray(x, y, w, h, colors) else - h, w = length(x), length(y) - z = reshape(z, h, w) - colors = Int32[round(Int32, 1000 + _i * 255) for _i in z'] - GR.setwindow(-1, 1, -1, 1) - GR.polarcellarray(0, 0, 0, 360, 0, 1, w, h, colors) + phimin, phimax = 0.0, 360.0 # nonuniform polar array is not yet supported in GR.jl + z_normalized = map(x -> GR.jlgr.normalize_color(x, zmin, zmax), z) + colors = Int32[round(Int32, 1000 + _i * 255) for _i in z_normalized] + xmin, xmax, ymin, ymax = xy_lims + rmax = data_lims[4] + GR.setwindow(-rmax, rmax, -rmax, rmax) + if ymin > 0 + @warn "'ymin[1] > 0' (rmin) is not yet supported." + end + @show series[:y][end] + if series[:y][end] != ny + @warn "Right now only the maximum value of y (r) is taken into account." + end + # GR.polarcellarray(0, 0, phimin, phimax, ymin, ymax, nx, ny, colors) + GR.polarcellarray(0, 0, phimin, phimax, 0, ymax, nx, ny, colors) + # Right now only the maximum value of y (r) is taken into account. + # This is certainly not perfect but nonuniform polar array is not yet supported in GR.jl end elseif st in (:path3d, :scatter3d) From 224858dad5f21898be76715953ac7bf22b6f57e6 Mon Sep 17 00:00:00 2001 From: yha Date: Sun, 3 Nov 2019 19:21:26 +0200 Subject: [PATCH 085/357] Convert infinite values to NaN --- src/examples.jl | 17 +++++++++++++++++ src/series.jl | 5 ++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/examples.jl b/src/examples.jl index 19b167ad..5208b9af 100644 --- a/src/examples.jl +++ b/src/examples.jl @@ -480,6 +480,23 @@ PlotExample("Histogram2D (complex values)", end)] ), +PlotExample("Unconnected lines using NaN values", +""" +Non-finite values, including `NaN`, are not plotted. +Instead, lines are separated into segments at these values. +""", + [:(begin + x,y = [1,2,2,1,1], [1,2,1,2,1] + plot( + plot([rand(5); NaN; rand(5); NaN; rand(5)]), + plot([1,Inf,2,3], marker=true), + plot([x; NaN; x.+2], [y; NaN; y.+1], arrow=2), + plot([1, 2+3im, Inf, 4im, 3, -Inf*im, 0, 3+3im], marker=true), + legend=false + ) + end)] +), + ] # Some constants for PlotDocs and PlotReferenceImages diff --git a/src/series.jl b/src/series.jl index bbc2248f..5c0ffeac 100644 --- a/src/series.jl +++ b/src/series.jl @@ -14,7 +14,10 @@ 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) = handlemissings(s) +prepareSeriesData(s::SeriesData) = handleinfinites(handlemissings(s)) + +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) From c9a9541d0edc6aa67f81e5a56fc6a0ad57bedf2b Mon Sep 17 00:00:00 2001 From: yha Date: Mon, 4 Nov 2019 03:27:47 +0200 Subject: [PATCH 086/357] 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)] From 5c1c80fd9a2d56e5f45b7202330cd273df733662 Mon Sep 17 00:00:00 2001 From: yha Date: Mon, 4 Nov 2019 03:35:09 +0200 Subject: [PATCH 087/357] Remove leftover method --- src/series.jl | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/series.jl b/src/series.jl index d8c182df..b509ab52 100644 --- a/src/series.jl +++ b/src/series.jl @@ -22,8 +22,6 @@ prepareSeriesData(s::Surface{<:AMat{<:MaybeNumber}}) = Surface(prepareSeriesData 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) -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)] From c3c63971ab9a9a769f53a1661c989d5727cc03b6 Mon Sep 17 00:00:00 2001 From: yha Date: Mon, 4 Nov 2019 16:20:43 +0200 Subject: [PATCH 088/357] Update NaN example to show missing values. --- src/examples.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/examples.jl b/src/examples.jl index 5208b9af..62600217 100644 --- a/src/examples.jl +++ b/src/examples.jl @@ -480,16 +480,16 @@ PlotExample("Histogram2D (complex values)", end)] ), -PlotExample("Unconnected lines using NaN values", +PlotExample("Unconnected lines using `missing` or `NaN`", """ -Non-finite values, including `NaN`, are not plotted. +Missing values and non-finite values, including `NaN`, are not plotted. Instead, lines are separated into segments at these values. """, [:(begin x,y = [1,2,2,1,1], [1,2,1,2,1] plot( plot([rand(5); NaN; rand(5); NaN; rand(5)]), - plot([1,Inf,2,3], marker=true), + plot([1,missing,2,3], marker=true), plot([x; NaN; x.+2], [y; NaN; y.+1], arrow=2), plot([1, 2+3im, Inf, 4im, 3, -Inf*im, 0, 3+3im], marker=true), legend=false From 7c5b7b09c287c4e7e72650c3f125754e15445768 Mon Sep 17 00:00:00 2001 From: Lukas Hauertmann Date: Mon, 4 Nov 2019 21:29:35 +0100 Subject: [PATCH 089/357] Add keyword `isedges::Bool = false` to function `heatmap_edges` Add the keyword `isedges::Bool` to the functions `heatmap_edges` and `_heatmap_edges`. Default is `false`. If `true`, the functions treat the given vector `v` as edges and not as midpoints. --- src/utils.jl | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/utils.jl b/src/utils.jl index 0c2b4b80..bd127f6c 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -342,8 +342,9 @@ const _scale_base = Dict{Symbol, Real}( :ln => ℯ, ) -function _heatmap_edges(v::AVec) +function _heatmap_edges(v::AVec, isedges::Bool = false) length(v) == 1 && return v[1] .+ [-0.5, 0.5] + if isedges return v end vmin, vmax = ignorenan_extrema(v) extra_min = (v[2] - v[1]) / 2 extra_max = (v[end] - v[end - 1]) / 2 @@ -351,9 +352,9 @@ function _heatmap_edges(v::AVec) end "create an (n+1) list of the outsides of heatmap rectangles" -function heatmap_edges(v::AVec, scale::Symbol = :identity) +function heatmap_edges(v::AVec, scale::Symbol = :identity; isedges::Bool = false) f, invf = scalefunc(scale), invscalefunc(scale) - map(invf, _heatmap_edges(map(f,v))) + map(invf, _heatmap_edges(map(f,v), isedges)) end function convert_to_polar(theta, r, r_extrema = ignorenan_extrema(r)) From 00fd916595a0e31a2717a6f12e57f8d151f1ec6a Mon Sep 17 00:00:00 2001 From: Lukas Hauertmann Date: Mon, 4 Nov 2019 21:30:11 +0100 Subject: [PATCH 090/357] Remove code duplication Use the function `heatmap_edges` again --- src/backends/gr.jl | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index ef05550b..6fa33080 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -921,7 +921,6 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) for ax in (sp[:xaxis], sp[:yaxis]) v = series[ax[:letter]] end - fx, fy = scalefunc(sp[:xaxis][:scale]), scalefunc(sp[:yaxis][:scale]) nx, ny = length(series[:x]), length(series[:y]) z = series[:z] use_midpoints = size(z) == (ny, nx) @@ -931,15 +930,8 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) Must be either `size(z) == (length(y), length(x))` (x & y define midpoints) or `size(z) == (length(y)+1, length(x)+1))` (x & y define edges).""") end - x, y = if use_midpoints - x_diff, y_diff = diff(series[:x]) ./ 2, diff(series[:y]) ./ 2 - x = [ series[:x][1] - x_diff[1], (series[:x][1:end-1] .+ x_diff)..., series[:x][end] + x_diff[end] ] - y = [ series[:y][1] - y_diff[1], (series[:y][1:end-1] .+ y_diff)..., series[:y][end] + y_diff[end] ] - x, y - else - series[:x], series[:y] - end - x, y = map(fx, series[:x]), map(fy, series[:y]) + x, y = heatmap_edges(series[:x], sp[:xaxis][:scale]; isedges = use_edges), + heatmap_edges(series[:y], sp[:yaxis][:scale]; isedges = use_edges) xy_lims = x[1], x[end], y[1], y[end] expand_extrema!(sp[:xaxis], x) expand_extrema!(sp[:yaxis], y) @@ -1335,14 +1327,8 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) use_midpoints = length(z) == ny * nx if !ispolar(sp) GR.setspace(zmin, zmax, 0, 90) - x, y = if use_midpoints - x_diff, y_diff = diff(series[:x]) ./ 2, diff(series[:y]) ./ 2 - x = [ series[:x][1] - x_diff[1], (series[:x][1:end-1] .+ x_diff)..., series[:x][end] + x_diff[end] ] - y = [ series[:y][1] - y_diff[1], (series[:y][1:end-1] .+ y_diff)..., series[:y][end] + y_diff[end] ] - x, y - else - series[:x], series[:y] - end + x, y = heatmap_edges(series[:x], sp[:xaxis][:scale]; isedges = !use_midpoints), + heatmap_edges(series[:y], sp[:yaxis][:scale]; isedges = !use_midpoints) w, h = length(x) - 1, length(y) - 1 z_normalized = map(x -> GR.jlgr.normalize_color(x, zmin, zmax), z) colors = Int32[round(Int32, 1000 + _i * 255) for _i in z_normalized] From a728ed9a60f0b83da19c461d126c87d0524d4d4d Mon Sep 17 00:00:00 2001 From: Lukas Hauertmann Date: Tue, 5 Nov 2019 00:06:33 +0100 Subject: [PATCH 091/357] Add new method for `heatmap_edges` New method check input vectors for x and y in compatibility with the 2D input array z. It also decides whether x and y represend the midpoints or the egdes of the heatmap pixels. --- src/backends/gr.jl | 19 ++++--------------- src/utils.jl | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 6fa33080..50d67f16 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -921,17 +921,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) for ax in (sp[:xaxis], sp[:yaxis]) v = series[ax[:letter]] end - nx, ny = length(series[:x]), length(series[:y]) - z = series[:z] - use_midpoints = size(z) == (ny, nx) - use_edges = size(z) == (ny - 1, nx - 1) - if !use_midpoints && !use_edges - error("""Length of x & y does not match the size of z. - Must be either `size(z) == (length(y), length(x))` (x & y define midpoints) - or `size(z) == (length(y)+1, length(x)+1))` (x & y define edges).""") - end - x, y = heatmap_edges(series[:x], sp[:xaxis][:scale]; isedges = use_edges), - heatmap_edges(series[:y], sp[:yaxis][:scale]; isedges = use_edges) + x, y = heatmap_edges(series[:x], sp[:xaxis][:scale], series[:y], sp[:yaxis][:scale], size(series[:z])) xy_lims = x[1], x[end], y[1], y[end] expand_extrema!(sp[:xaxis], x) expand_extrema!(sp[:yaxis], y) @@ -1323,18 +1313,17 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) elseif st == :heatmap zmin, zmax = clims - nx, ny = length(series[:x]), length(series[:y]) - use_midpoints = length(z) == ny * nx if !ispolar(sp) GR.setspace(zmin, zmax, 0, 90) - x, y = heatmap_edges(series[:x], sp[:xaxis][:scale]; isedges = !use_midpoints), - heatmap_edges(series[:y], sp[:yaxis][:scale]; isedges = !use_midpoints) + x, y = heatmap_edges(series[:x], sp[:xaxis][:scale], series[:y], sp[:yaxis][:scale], size(series[:z])) w, h = length(x) - 1, length(y) - 1 z_normalized = map(x -> GR.jlgr.normalize_color(x, zmin, zmax), z) + z_normalized = map(x -> isnan(x) ? 256/255 : x, z_normalized) # results in color index = 1256 -> transparent colors = Int32[round(Int32, 1000 + _i * 255) for _i in z_normalized] GR.nonuniformcellarray(x, y, w, h, colors) else phimin, phimax = 0.0, 360.0 # nonuniform polar array is not yet supported in GR.jl + nx, ny = length(series[:x]), length(series[:y]) z_normalized = map(x -> GR.jlgr.normalize_color(x, zmin, zmax), z) colors = Int32[round(Int32, 1000 + _i * 255) for _i in z_normalized] xmin, xmax, ymin, ymax = xy_lims diff --git a/src/utils.jl b/src/utils.jl index bd127f6c..cd7bb414 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -357,6 +357,22 @@ function heatmap_edges(v::AVec, scale::Symbol = :identity; isedges::Bool = false map(invf, _heatmap_edges(map(f,v), isedges)) end +function heatmap_edges(x::AVec, xscale::Symbol, y::AVec, yscale::Symbol, z_size::Tuple{Int, Int}) + nx, ny = length(x), length(y) + # use_midpoints = z_size == (ny, nx) # This fails some tests, but would actually be + # the correct check, since (4, 3) != (3, 4) and a missleading plot is produced. + use_midpoints = prod(z_size) == (ny * nx) + use_edges = z_size == (ny - 1, nx - 1) + if !use_midpoints && !use_edges + error("""Length of x & y does not match the size of z. + Must be either `size(z) == (length(y), length(x))` (x & y define midpoints) + or `size(z) == (length(y)+1, length(x)+1))` (x & y define edges).""") + end + x, y = heatmap_edges(x, xscale; isedges = use_edges), + heatmap_edges(y, yscale; isedges = use_edges) + return x, y +end + function convert_to_polar(theta, r, r_extrema = ignorenan_extrema(r)) rmin, rmax = r_extrema r = (r .- rmin) ./ (rmax .- rmin) From 686ab1b51f59bbbe9ab2c1f15bb6f8986a7220af Mon Sep 17 00:00:00 2001 From: Lukas Hauertmann Date: Tue, 5 Nov 2019 11:12:46 +0100 Subject: [PATCH 092/357] `isedges` is now an arguement and not a keyword anymore --- src/utils.jl | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/utils.jl b/src/utils.jl index cd7bb414..324aa2cb 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -344,7 +344,9 @@ const _scale_base = Dict{Symbol, Real}( function _heatmap_edges(v::AVec, isedges::Bool = false) length(v) == 1 && return v[1] .+ [-0.5, 0.5] - if isedges return v end + if isedges return v end + # `isedges = true` means that v is a vector which already describes edges + # and does not need to be extended. vmin, vmax = ignorenan_extrema(v) extra_min = (v[2] - v[1]) / 2 extra_max = (v[end] - v[end - 1]) / 2 @@ -352,24 +354,24 @@ function _heatmap_edges(v::AVec, isedges::Bool = false) end "create an (n+1) list of the outsides of heatmap rectangles" -function heatmap_edges(v::AVec, scale::Symbol = :identity; isedges::Bool = false) +function heatmap_edges(v::AVec, scale::Symbol = :identity, isedges::Bool = false) f, invf = scalefunc(scale), invscalefunc(scale) map(invf, _heatmap_edges(map(f,v), isedges)) end function heatmap_edges(x::AVec, xscale::Symbol, y::AVec, yscale::Symbol, z_size::Tuple{Int, Int}) nx, ny = length(x), length(y) - # use_midpoints = z_size == (ny, nx) # This fails some tests, but would actually be + # ismidpoints = z_size == (ny, nx) # This fails some tests, but would actually be # the correct check, since (4, 3) != (3, 4) and a missleading plot is produced. - use_midpoints = prod(z_size) == (ny * nx) - use_edges = z_size == (ny - 1, nx - 1) - if !use_midpoints && !use_edges + ismidpoints = prod(z_size) == (ny * nx) + isedges = z_size == (ny - 1, nx - 1) + if !ismidpoints && !isedges error("""Length of x & y does not match the size of z. Must be either `size(z) == (length(y), length(x))` (x & y define midpoints) or `size(z) == (length(y)+1, length(x)+1))` (x & y define edges).""") end - x, y = heatmap_edges(x, xscale; isedges = use_edges), - heatmap_edges(y, yscale; isedges = use_edges) + x, y = heatmap_edges(x, xscale, isedges), + heatmap_edges(y, yscale, isedges) return x, y end From 36558389b6fd6e792bbc504c416d7f6acde7af64 Mon Sep 17 00:00:00 2001 From: Lukas Hauertmann Date: Tue, 5 Nov 2019 11:51:34 +0100 Subject: [PATCH 093/357] remove debugging line --- src/backends/gr.jl | 1 - 1 file changed, 1 deletion(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 50d67f16..e7ab5209 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -1332,7 +1332,6 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) if ymin > 0 @warn "'ymin[1] > 0' (rmin) is not yet supported." end - @show series[:y][end] if series[:y][end] != ny @warn "Right now only the maximum value of y (r) is taken into account." end From 31c4414c32836e5fb658a9fe32b33a7a55e70daf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johan=20Bl=C3=A5b=C3=A4ck?= Date: Wed, 6 Nov 2019 15:17:51 +0100 Subject: [PATCH 094/357] animation.jl: using randstring() to generate unique tmp names (fix: 2239) Browser caching prevents animations from being updated if names are not unique. This solves Issue #2239. --- src/animation.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/animation.jl b/src/animation.jl index b78b02b5..d05c92e3 100644 --- a/src/animation.jl +++ b/src/animation.jl @@ -21,9 +21,9 @@ function frame(anim::Animation, plt::P=current()) where P<:AbstractPlot push!(anim.frames, filename) end -giffn() = (isijulia() ? "tmp.gif" : tempname()*".gif") -movfn() = (isijulia() ? "tmp.mov" : tempname()*".mov") -mp4fn() = (isijulia() ? "tmp.mp4" : tempname()*".mp4") +giffn() = (isijulia() ? "tmp_"*randstring()*".gif" : tempname()*".gif") +movfn() = (isijulia() ? "tmp_"*randstring()*".mov" : tempname()*".mov") +mp4fn() = (isijulia() ? "tmp_"*randstring()*".mp4" : tempname()*".mp4") mutable struct FrameIterator itr From 8b43f70ed4ba2ea8c0f2ca6a4527d0848f8e2dbe Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 8 Nov 2019 11:55:34 +0100 Subject: [PATCH 095/357] fix multiplot of functions --- src/series.jl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/series.jl b/src/series.jl index a4d21d47..59b3ac4e 100644 --- a/src/series.jl +++ b/src/series.jl @@ -519,10 +519,11 @@ end end @recipe function f(fs::AbstractArray{F}, xmin::Number, xmax::Number) where F<:Function xscale, yscale = [get(plotattributes, sym, :identity) for sym=(:xscale,:yscale)] - xs = ys = Array{Any}(undef, length(fs)) + xs = Array{Any}(undef, length(fs)) + ys = Array{Any}(undef, length(fs)) for (i, (x, y)) in enumerate(_scaled_adapted_grid(f, xscale, yscale, xmin, xmax) for f in fs) xs[i] = x - ys[i] = y + ys[i] = y end xs, ys end From 25313f6b4351308e77120e136802a82e98763f31 Mon Sep 17 00:00:00 2001 From: Antoine Levitt Date: Sat, 9 Nov 2019 16:49:48 +0100 Subject: [PATCH 096/357] Alternative fix for #2239 --- src/animation.jl | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/animation.jl b/src/animation.jl index d05c92e3..659353e5 100644 --- a/src/animation.jl +++ b/src/animation.jl @@ -21,9 +21,9 @@ function frame(anim::Animation, plt::P=current()) where P<:AbstractPlot push!(anim.frames, filename) end -giffn() = (isijulia() ? "tmp_"*randstring()*".gif" : tempname()*".gif") -movfn() = (isijulia() ? "tmp_"*randstring()*".mov" : tempname()*".mov") -mp4fn() = (isijulia() ? "tmp_"*randstring()*".mp4" : tempname()*".mp4") +giffn() = (isijulia() ? "tmp.gif" : tempname()*".gif") +movfn() = (isijulia() ? "tmp.mov" : tempname()*".mov") +mp4fn() = (isijulia() ? "tmp.mp4" : tempname()*".mp4") mutable struct FrameIterator itr @@ -104,10 +104,12 @@ end # write out html to view the gif function Base.show(io::IO, ::MIME"text/html", agif::AnimatedGif) ext = file_extension(agif.filename) + link = relpath(agif.filename) + link *= "?"*randstring() #to foil browser cache, see https://github.com/JuliaPlots/Plots.jl/issues/2239 write(io, if ext == "gif" - "" + "" elseif ext in ("mov", "mp4") - "" + "" else error("Cannot show animation with extension $ext: $agif") end) From cb4702f7b82afe62b3eea52c54ad667f0ca1b77a Mon Sep 17 00:00:00 2001 From: Antoine Levitt Date: Mon, 11 Nov 2019 10:49:55 +0100 Subject: [PATCH 097/357] Embed gifs and videos --- src/animation.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/animation.jl b/src/animation.jl index 659353e5..e4a213ce 100644 --- a/src/animation.jl +++ b/src/animation.jl @@ -104,12 +104,12 @@ end # write out html to view the gif function Base.show(io::IO, ::MIME"text/html", agif::AnimatedGif) ext = file_extension(agif.filename) - link = relpath(agif.filename) - link *= "?"*randstring() #to foil browser cache, see https://github.com/JuliaPlots/Plots.jl/issues/2239 write(io, if ext == "gif" - "" + "" elseif ext in ("mov", "mp4") - "" + "" else error("Cannot show animation with extension $ext: $agif") end) From b8f21ad878f76ca4751931287248b477003afa22 Mon Sep 17 00:00:00 2001 From: Anshul Singhvi Date: Tue, 12 Nov 2019 08:11:03 -0500 Subject: [PATCH 098/357] Update Project.toml --- Project.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Project.toml b/Project.toml index 087277df..4ab91544 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.27.0" +version = "0.27.1" [deps] Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" @@ -34,7 +34,7 @@ UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" FixedPointNumbers = "≥ 0.3.0" GR = "≥ 0.31.0" PlotThemes = "≥ 0.1.3" -PlotUtils = "≥ 0.6.0" +PlotUtils = "≥ 0.6.1" RecipesBase = "≥ 0.6.0" StatsBase = "≥ 0.14.0" julia = "≥ 1.0.0" From 6d1c723e4bf495b8630d9a34ad50f5665b6f9e99 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 12 Nov 2019 16:03:54 +0100 Subject: [PATCH 099/357] create stub --- Project.toml | 1 + src/backends.jl | 55 +++++++++++++++++++++++++++++++++++++++ src/backends/pgfplotsx.jl | 13 +++++++++ 3 files changed, 69 insertions(+) create mode 100644 src/backends/pgfplotsx.jl diff --git a/Project.toml b/Project.toml index 087277df..685dbd8e 100644 --- a/Project.toml +++ b/Project.toml @@ -15,6 +15,7 @@ JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Measures = "442fdcdd-2543-5da2-b0f3-8c86c306513e" NaNMath = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +PGFPlotsX = "8314cec4-20b6-5062-9cdb-752b83310925" Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" PlotThemes = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" PlotUtils = "995b91a9-d308-5afd-9ec6-746e21dbc043" diff --git a/src/backends.jl b/src/backends.jl index 26f01c91..d8074d35 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -252,6 +252,7 @@ end @init_backend PlotlyJS @init_backend GR @init_backend PGFPlots +@init_backend PGFPlotsX @init_backend InspectDR @init_backend HDF5 @@ -661,3 +662,57 @@ const _inspectdr_marker = Symbol[ ] const _inspectdr_scale = [:identity, :ln, :log2, :log10] +# ------------------------------------------------------------------------------ +# pgfplotsx + +const _pgfplotsx_attr = merge_with_base_supported([ + :annotations, + :background_color_legend, :background_color_inside, :background_color_outside, + :foreground_color_legend, :foreground_color_grid, :foreground_color_axis, + :foreground_color_text, :foreground_color_border, + :label, + :seriescolor, :seriesalpha, + :linecolor, :linestyle, :linewidth, :linealpha, + :markershape, :markercolor, :markersize, :markeralpha, + :markerstrokewidth, :markerstrokecolor, :markerstrokealpha, + :fillrange, :fillcolor, :fillalpha, + :bins, + :layout, + :title, :window_title, + :guide, :lims, :ticks, :scale, :flip, + :match_dimensions, + :titlefontfamily, :titlefontsize, :titlefonthalign, :titlefontvalign, + :titlefontrotation, :titlefontcolor, + :legendfontfamily, :legendfontsize, :legendfonthalign, :legendfontvalign, + :legendfontrotation, :legendfontcolor, + :tickfontfamily, :tickfontsize, :tickfonthalign, :tickfontvalign, + :tickfontrotation, :tickfontcolor, + :guidefontfamily, :guidefontsize, :guidefonthalign, :guidefontvalign, + :guidefontrotation, :guidefontcolor, + :grid, :gridalpha, :gridstyle, :gridlinewidth, + :legend, :legendtitle, :colorbar, :colorbar_title, :colorbar_entry, + :fill_z, :line_z, :marker_z, :levels, + :ribbon, :quiver, + :orientation, + :overwrite_figure, + :polar, + :aspect_ratio, + :normalize, :weights, + :inset_subplots, + :bar_width, + :arrow, + :framestyle, + :tick_direction, + :camera, + :contour_labels, +]) +const _pgfplotsx_seriestype = [ + :path, :scatter, :straightline, + :heatmap, :pie, :image, + :contour, :path3d, :scatter3d, :surface, :wireframe, :volume, + :shape +] +const _pgfplotsx_style = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] +const _pgfplotsx_marker = _allMarkers +const _pgfplotsx_scale = [:identity, :log10] +is_marker_supported(::PGFPlotsXBackend, shape::Shape) = false diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl new file mode 100644 index 00000000..27122d8b --- /dev/null +++ b/src/backends/pgfplotsx.jl @@ -0,0 +1,13 @@ +# -------------------------------------------------------------------------------------- +function _show(io::IO, mime::MIME"image/svg+xml", plt::Plot{PGFPlotsXBackend}) +end + +function _show(io::IO, mime::MIME"application/pdf", plt::Plot{PGFPlotsXBackend}) +end + +function _show(io::IO, mime::MIME"application/x-tex", plt::Plot{PGFPlotsXBackend}) +end + +function _display(plt::Plot{PGFPlotsXBackend}) + +end From 54fc1ff69cfa3b4c1771a02e2681776bc9b53312 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 12 Nov 2019 16:27:27 +0100 Subject: [PATCH 100/357] create display methods --- src/backends/pgfplotsx.jl | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 27122d8b..19522d8e 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,13 +1,25 @@ # -------------------------------------------------------------------------------------- +# display calls this and then _display +function _update_plot_object(plt::Plot{PGFPlotsXBackend}) + plt.o = PGFPlotsX.Axis() +end + function _show(io::IO, mime::MIME"image/svg+xml", plt::Plot{PGFPlotsXBackend}) + plt.o end function _show(io::IO, mime::MIME"application/pdf", plt::Plot{PGFPlotsXBackend}) + show(io, mime, plt.o) +end + +function _show(io::IO, mime::MIME"image/png", plt::Plot{PGFPlotsXBackend}) + display("image/png", plt.o) end function _show(io::IO, mime::MIME"application/x-tex", plt::Plot{PGFPlotsXBackend}) + PGFPlotsX.print_tex(plt.o) end function _display(plt::Plot{PGFPlotsXBackend}) - + plt.o end From 37300a934570ba1ab41f972afb9ef0e2136356c4 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 12 Nov 2019 16:55:13 +0100 Subject: [PATCH 101/357] not displaying in Juno --- src/backends/pgfplotsx.jl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 19522d8e..e85e0933 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,11 +1,13 @@ +using PGFPlotsX: PGFPlotsX # -------------------------------------------------------------------------------------- # display calls this and then _display function _update_plot_object(plt::Plot{PGFPlotsXBackend}) plt.o = PGFPlotsX.Axis() + push!( plt.o, PGFPlotsX.Plot(PGFPlotsX.Coordinates(1:5,1:5)) ) end function _show(io::IO, mime::MIME"image/svg+xml", plt::Plot{PGFPlotsXBackend}) - plt.o + show(io, mime, plt.o) end function _show(io::IO, mime::MIME"application/pdf", plt::Plot{PGFPlotsXBackend}) @@ -13,7 +15,7 @@ function _show(io::IO, mime::MIME"application/pdf", plt::Plot{PGFPlotsXBackend}) end function _show(io::IO, mime::MIME"image/png", plt::Plot{PGFPlotsXBackend}) - display("image/png", plt.o) + show(io, mime, plt.o) end function _show(io::IO, mime::MIME"application/x-tex", plt::Plot{PGFPlotsXBackend}) From 3db930cb9386680879a9e1b8e744435757a41c80 Mon Sep 17 00:00:00 2001 From: Antoine Levitt Date: Tue, 12 Nov 2019 19:06:36 +0100 Subject: [PATCH 102/357] correct mimetype for mov --- src/animation.jl | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/animation.jl b/src/animation.jl index e4a213ce..63e001d0 100644 --- a/src/animation.jl +++ b/src/animation.jl @@ -104,15 +104,18 @@ end # write out html to view the gif function Base.show(io::IO, ::MIME"text/html", agif::AnimatedGif) ext = file_extension(agif.filename) - write(io, if ext == "gif" - "" + if ext == "gif" + html = "" elseif ext in ("mov", "mp4") - "" + mimetype = ext == "mov" ? "video/quicktime" : "video/mp4" + html = "" else error("Cannot show animation with extension $ext: $agif") - end) + end + + write(io, html) return nothing end From 94812cde7afb3f3fe2caf7a07b593832b84e7a1c Mon Sep 17 00:00:00 2001 From: Antoine Levitt Date: Tue, 12 Nov 2019 19:31:55 +0100 Subject: [PATCH 103/357] fix mimetype again --- src/animation.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/animation.jl b/src/animation.jl index 63e001d0..7e5f9a8e 100644 --- a/src/animation.jl +++ b/src/animation.jl @@ -110,7 +110,7 @@ function Base.show(io::IO, ::MIME"text/html", agif::AnimatedGif) mimetype = ext == "mov" ? "video/quicktime" : "video/mp4" html = "" + "\" type = \"$mimetype\">" else error("Cannot show animation with extension $ext: $agif") end From ca600e9d760cd44d44263c6de19e4502c048a68b Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Wed, 13 Nov 2019 12:12:31 +0100 Subject: [PATCH 104/357] fix display --- src/backends/pgfplotsx.jl | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index e85e0933..a62f2317 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,9 +1,18 @@ using PGFPlotsX: PGFPlotsX # -------------------------------------------------------------------------------------- -# display calls this and then _display +# display calls this and then _display, its called 3 times for plot(1:5) function _update_plot_object(plt::Plot{PGFPlotsXBackend}) - plt.o = PGFPlotsX.Axis() - push!( plt.o, PGFPlotsX.Plot(PGFPlotsX.Coordinates(1:5,1:5)) ) + plt.o = PGFPlotsX.GroupPlot() + + local axis + for sp in plt.subplots + axis = PGFPlotsX.Axis() + for series in series_list(sp) + series_plot = PGFPlotsX.Plot(PGFPlotsX.Coordinates(series[:x],series[:y])) + push!( axis, series_plot ) + end + end + push!( plt.o, axis ) end function _show(io::IO, mime::MIME"image/svg+xml", plt::Plot{PGFPlotsXBackend}) @@ -23,5 +32,8 @@ function _show(io::IO, mime::MIME"application/x-tex", plt::Plot{PGFPlotsXBackend end function _display(plt::Plot{PGFPlotsXBackend}) + # fn = string(tempname(),".svg") + # PGFPlotsX.pgfsave(fn, plt.o) + # open_browser_window(fn) plt.o end From 9e74976d6d97c0f7731fec2e3bf17ff8a54ddea9 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Wed, 13 Nov 2019 16:00:50 +0100 Subject: [PATCH 105/357] axes labels, legend entries, line color, marker shapes --- src/backends/pgfplotsx.jl | 60 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index a62f2317..44ac5994 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,4 +1,38 @@ using PGFPlotsX: PGFPlotsX + +const _pgfplotsx_linestyles = KW( + :solid => "solid", + :dash => "dashed", + :dot => "dotted", + :dashdot => "dashdotted", + :dashdotdot => "dashdotdotted", +) + +const _pgfplotsx_markers = KW( + :none => "none", + :cross => "+", + :xcross => "x", + :+ => "+", + :x => "x", + :utriangle => "triangle*", + :dtriangle => "triangle*", + :circle => "*", + :rect => "square*", + :star5 => "star", + :star6 => "asterisk", + :diamond => "diamond*", + :pentagon => "pentagon*", + :hline => "-", + :vline => "|" +) + +const _pgfplotsx_legend_pos = KW( + :bottomleft => "south west", + :bottomright => "south east", + :topright => "north east", + :topleft => "north west", + :outertopright => "outer north east", +) # -------------------------------------------------------------------------------------- # display calls this and then _display, its called 3 times for plot(1:5) function _update_plot_object(plt::Plot{PGFPlotsXBackend}) @@ -6,10 +40,32 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) local axis for sp in plt.subplots - axis = PGFPlotsX.Axis() + bb = bbox(sp) + axis = PGFPlotsX.@pgf PGFPlotsX.Axis( + { + xlabel = sp.attr[:xaxis][:guide], + ylabel = sp.attr[:yaxis][:guide], + height = string(height(bb)), + width = string(width(bb)), + title = sp[:title], + }, + ) for series in series_list(sp) - series_plot = PGFPlotsX.Plot(PGFPlotsX.Coordinates(series[:x],series[:y])) + opt = series.plotattributes + series_plot = PGFPlotsX.@pgf PGFPlotsX.Plot( + { + color = opt[:linecolor], + mark = _pgfplotsx_markers[opt[:markershape]], + # TODO: how to do nested options? + # "mark options" = "{color = $(opt[:markercolor])}", + }, + PGFPlotsX.Coordinates(series[:x],series[:y]) + ) push!( axis, series_plot ) + if opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) + push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) + ) + end end end push!( plt.o, axis ) From 05eed0fdda0c0e30994abafdc77927194434dd3d Mon Sep 17 00:00:00 2001 From: Leon Shen Date: Wed, 13 Nov 2019 17:08:20 -0500 Subject: [PATCH 106/357] precompile functions to reduce compilation time of first plot --- deps/generateprecompiles.jl | 27 ++ src/Plots.jl | 3 + src/examples.jl | 13 +- src/precompile.jl | 851 ++++++++++++++++++++++++++++++++++++ 4 files changed, 891 insertions(+), 3 deletions(-) create mode 100644 deps/generateprecompiles.jl diff --git a/deps/generateprecompiles.jl b/deps/generateprecompiles.jl new file mode 100644 index 00000000..353d6880 --- /dev/null +++ b/deps/generateprecompiles.jl @@ -0,0 +1,27 @@ +# To figure out what should be precompiled, run this script, then move +# precompile_Plots.jl in precompiles_path (see below) to src/precompile.jl + +using SnoopCompile + +log_path = joinpath(tempdir(), "compiles.log") +precompiles_path = joinpath(tempdir(), "precompile") + +# run examples with GR backend, logging what needs to be compiled +SnoopCompile.@snoopc log_path begin + using Plots + Plots.test_examples(:gr, disp=true) +end + +# precompile calls containing the following strings are dropped +blacklist = [ + # functions defined in examples + "PlotExampleModule", + # the following are not visible to Plots, only its dependencies + "CategoricalArrays", + "FixedPointNumbers", + "SparseArrays" +] + +data = SnoopCompile.read(log_path) +pc = SnoopCompile.parcel(reverse!(data[2]), blacklist=blacklist) +SnoopCompile.write(precompiles_path, pc) diff --git a/src/Plots.jl b/src/Plots.jl index 731acd49..6b64f9c0 100644 --- a/src/Plots.jl +++ b/src/Plots.jl @@ -222,4 +222,7 @@ end const CURRENT_BACKEND = CurrentBackend(:none) +include("precompile.jl") +_precompile_() + end # module diff --git a/src/examples.jl b/src/examples.jl index 62600217..77e9ff04 100644 --- a/src/examples.jl +++ b/src/examples.jl @@ -305,7 +305,8 @@ PlotExample("3D", PlotExample("DataFrames", "Plot using DataFrame column symbols.", - [:(begin + [:(using StatsPlots), # can't be inside begin block because @df gets expanded first + :(begin import RDatasets iris = RDatasets.dataset("datasets", "iris") @df iris scatter(:SepalLength, :SepalWidth, group=:Species, @@ -354,7 +355,8 @@ PlotExample("Layouts, margins, label rotation, title location", PlotExample("Boxplot and Violin series recipes", "", - [:(begin + [:(using StatsPlots), # can't be inside begin block because @df gets expanded first + :(begin import RDatasets singers = RDatasets.dataset("lattice", "singer") @df singers violin(:VoicePart, :Height, line = 0, fill = (0.2, :blue)) @@ -518,7 +520,12 @@ function test_examples(pkgname::Symbol, idx::Int; debug = false, disp = true) @info("Testing plot: $pkgname:$idx:$(_examples[idx].header)") backend(pkgname) backend() - map(eval, _examples[idx].exprs) + + # prevent leaking variables (esp. functions) directly into Plots namespace + m = Module(:PlotExampleModule) + Base.eval(m, :(using Plots)) + map(exprs -> Base.eval(m, exprs), _examples[idx].exprs) + plt = current() if disp gui(plt) diff --git a/src/precompile.jl b/src/precompile.jl index 22c11ca0..357b9106 100644 --- a/src/precompile.jl +++ b/src/precompile.jl @@ -1,3 +1,854 @@ function _precompile_() ccall(:jl_generating_output, Cint, ()) == 1 || return nothing + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots.gr_display), Plots.Subplot{Plots.GRBackend}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.legendtitlefont), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.pie_labels), Plots.Subplot{Plots.GRBackend}, Plots.Series}) + precompile(Tuple{typeof(Plots.should_add_to_legend), Plots.Series}) + precompile(Tuple{typeof(Plots.shape_data), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.preprocessArgs!), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.gr_display), Plots.Subplot{Plots.GRBackend}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._backend_instance), Symbol}) + precompile(Tuple{typeof(Plots.replaceAlias!), Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Symbol}}) + precompile(Tuple{typeof(Plots.preprocessArgs!), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Array{T, 1} where T, 1}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Nothing}) + precompile(Tuple{typeof(Plots.straightline_data), Tuple{Int64, Int64}, Tuple{Float64, Float64}, Array{Float64, 1}, Array{Float64, 1}, Int64}) + precompile(Tuple{typeof(Plots.convert_to_polar), Array{Float64, 1}, Array{Float64, 1}, Tuple{Int64, Float64}}) + precompile(Tuple{typeof(Plots.gr_inqtext), Int64, Int64, String}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Int64, Plots.Shape}) + precompile(Tuple{typeof(Plots.nanappend!), Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Int64, Int64, Plots.Shape}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Float64, Float64, Int64, Plots.Shape}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.Spy}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.recompute_lengths), Array{Measures.Measure, 1}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Float64, 1}, Array{String, 1}}}) + precompile(Tuple{typeof(Plots._heatmap_edges), Array{Float64, 1}, Bool}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Float64, 1}, Array{Any, 1}}}) + precompile(Tuple{typeof(Plots._preprocess_binlike), Base.Dict{Symbol, Any}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.__init__)}) + precompile(Tuple{typeof(Plots.warnOnUnsupported), Plots.GRBackend, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.iscontour), Plots.Series}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Float64, 1}, Array{String, 1}}}) + precompile(Tuple{typeof(Plots.gr_text), Float64, Float64, String}) + precompile(Tuple{typeof(Plots.layout_args), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots.iscontour), Plots.Series}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}}) + precompile(Tuple{typeof(Plots.axis_drawing_info), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.link_subplots), Array{RecipesBase.AbstractLayout, 1}, Symbol}) + precompile(Tuple{typeof(Plots.axis_drawing_info), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.gr_get_color), Plots.Series}) + precompile(Tuple{typeof(Plots.showaxis), Symbol, Symbol}) + precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64, Array{Plots.Plot{T} where T<:RecipesBase.AbstractBackend, 1}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots.default), Symbol}) + precompile(Tuple{typeof(Plots.add_layout_pct!), Base.Dict{Symbol, Any}, Expr, Int64, Int64}) + precompile(Tuple{typeof(Plots.gr_xaxis_height), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Float64, Plots.Shape}) + precompile(Tuple{typeof(Plots.warnOnUnsupported_args), Plots.GRBackend, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.gr_xaxis_height), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.gr_set_viewport_cmap), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.gr_set_linecolor), PlotUtils.ColorGradient}) + precompile(Tuple{typeof(Plots.contour_levels), Plots.Series, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots._scale_adjusted_values), Type{Float64}, Array{Float64, 1}, Symbol}) + precompile(Tuple{typeof(Plots.has_attribute_segments), Plots.Series}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.isijulia)}) + precompile(Tuple{typeof(Plots.get_clims), Plots.Series}) + precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64, Array{Plots.Plot{T} where T<:RecipesBase.AbstractBackend, 1}}) + precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, Base.StepRange{Int64, Int64}, Symbol}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Float64, 2}}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) + precompile(Tuple{typeof(Plots.get_clims), Plots.Series}) + precompile(Tuple{typeof(Plots.color_or_nothing!), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.gr_viewport_from_bbox), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.gr_display), Plots.Plot{Plots.GRBackend}, String}) + precompile(Tuple{typeof(Plots.default_should_widen), Plots.Axis}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.gr_legend_pos), Plots.Subplot{Plots.GRBackend}, Float64, Float64}) + precompile(Tuple{typeof(Plots._plots_defaults)}) + precompile(Tuple{typeof(Plots.gr_draw_colorbar), Plots.GRColorbar, Plots.Subplot{Plots.GRBackend}, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.layout_args), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots.default_should_widen), Plots.Axis}) + precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64}) + precompile(Tuple{typeof(Plots.gr_polaraxes), Int64, Float64, Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.isvertical), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.gr_viewport_from_bbox), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.get_markercolor), Plots.Series, Float64, Float64, Int64}) + precompile(Tuple{typeof(Plots._preprocess_barlike), Base.Dict{Symbol, Any}, Array{Int64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, Tuple{Int64, Int64}, Symbol}) + precompile(Tuple{typeof(Plots._backend_instance), Symbol}) + precompile(Tuple{typeof(Plots.has_attribute_segments), Plots.Series}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._preprocess_barlike), Base.Dict{Symbol, Any}, Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Union{Base.Missing, Int64}, 1}}) + precompile(Tuple{typeof(Plots.hasgrid), Symbol, Symbol}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Union{Base.Missing, Number}, 1}}) + precompile(Tuple{typeof(Plots.get_markercolor), Plots.Series, Float64, Float64, Int64}) + precompile(Tuple{typeof(Plots.process_annotation), Plots.Subplot{Plots.GRBackend}, Int64, Float64, Plots.PlotText, Plots.Font}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) + precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Array{T, 1} where T, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.backend), Plots.GRBackend}) + precompile(Tuple{typeof(Plots._hist_edges), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Tuple{Int64, Int64}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.is_attr_supported), Symbol}) + precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.GRBackend}, Symbol, Bool, Bool}) + precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Char}) + precompile(Tuple{typeof(Plots._cbar_unique), Array{Symbol, 1}, String}) + precompile(Tuple{typeof(Plots._hist_edges), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Int64}) + precompile(Tuple{typeof(Plots._cbar_unique), Array{Int64, 1}, String}) + precompile(Tuple{typeof(Plots.convertToAnyVector), Int64, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Array{Symbol, 2}, Symbol}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.frame), Plots.Animation}) + precompile(Tuple{typeof(Plots.shape_data), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Float64}) + precompile(Tuple{typeof(Plots._cbar_unique), Array{Nothing, 1}, String}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._cbar_unique), Array{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, 1}, String}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots._bin_centers), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.addExtension), String, String}) + precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, String, Symbol}) + precompile(Tuple{typeof(Plots.create_grid), Symbol}) + precompile(Tuple{typeof(Plots.getxy), Plots.Plot{Plots.GRBackend}, Int64}) + precompile(Tuple{typeof(Plots.straightline_data), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.gr_display), Plots.Plot{Plots.GRBackend}, String}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Plots.Spy}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.make_steps), Base.UnitRange{Int64}, Symbol}) + precompile(Tuple{typeof(Plots._update_axis), Plots.Axis, Base.Dict{Symbol, Any}, Symbol, Int64}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Union{Base.Missing, Int64}, 1}}}) + precompile(Tuple{typeof(Plots.gr_get_color), Plots.Series}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.is_seriestype_supported), Plots.GRBackend, Symbol}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.get_xy), Plots.OHLC{Float64}, Int64, Float64}) + precompile(Tuple{typeof(Plots._cbar_unique), Array{PlotUtils.ColorGradient, 1}, String}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Base.Complex{Float64}, 1}}}) + precompile(Tuple{typeof(Plots.series_annotations_shapes!), Plots.Series, Symbol}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Function, 1}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Function, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.ensure_gradient!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Array{Float64, 1}, 1}}) + precompile(Tuple{typeof(Plots.warnOnUnsupported_scales), Plots.GRBackend, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots._plot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots.is_marker_supported), Plots.GRBackend, Symbol}) + precompile(Tuple{typeof(Plots.wand_edges), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots.slice_arg), Base.ReshapedArray{Int64, 2, Base.UnitRange{Int64}, Tuple{}}, Int64}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{String, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, typeof(Base.log), Int64}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Function, 1}, Int64}}) + precompile(Tuple{typeof(Plots._series_index), Base.Dict{Symbol, Any}, Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Int64}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Plots.PortfolioComposition}}) + precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Base.StepRange{Int64, Int64}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) + precompile(Tuple{typeof(Plots._update_series_attributes!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.warnOnUnsupported_args), Plots.GRBackend, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._update_min_padding!), Plots.GridLayout}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}}) + precompile(Tuple{typeof(Plots.gr_set_gradient), PlotUtils.ColorGradient}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy}}) + precompile(Tuple{typeof(Plots.titlefont), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Plots.OHLC{T} where T<:Real, 1}}}) + precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.GRBackend}, Symbol, Bool, Bool}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots._update_subplot_periphery), Plots.Subplot{Plots.GRBackend}, Array{Any, 1}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Array{T, 1} where T, 1}}}) + precompile(Tuple{typeof(Plots.unzip), Array{Tuple{Float64, Float64, Float64}, 1}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.command_idx), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{Any, 1}}, Int64}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Union{Base.Missing, Int64}, 1}}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Base.LinRange{Float64}}) + precompile(Tuple{typeof(Plots.slice_arg), Array{Measures.Length{:mm, Float64}, 2}, Int64}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Int64, 1}}}) + precompile(Tuple{typeof(Plots._update_min_padding!), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.Spy}}) + precompile(Tuple{typeof(Plots._plot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) + precompile(Tuple{typeof(Plots.aliasesAndAutopick), Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Symbol}, Array{Symbol, 1}, Int64}) + precompile(Tuple{typeof(Plots.colorbar_style), Plots.Series}) + precompile(Tuple{typeof(Plots._update_subplot_periphery), Plots.Subplot{Plots.GRBackend}, Array{Any, 1}}) + precompile(Tuple{typeof(Plots.fakedata), Int64, Int64}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.autopick_ignore_none_auto), Array{Symbol, 1}, Int64}) + precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Base.Missing}) + precompile(Tuple{typeof(Plots._add_defaults!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Int64}) + precompile(Tuple{typeof(Plots._cycle), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int64}) + precompile(Tuple{typeof(Plots.make_steps), Array{Int64, 1}, Symbol}) + precompile(Tuple{typeof(Plots.gr_set_line), Float64, Symbol, ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.make_fillrange_side), Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._update_min_padding!), Plots.GridLayout}) + precompile(Tuple{typeof(Plots._add_defaults!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Int64}) + precompile(Tuple{typeof(Plots._process_seriesrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._add_markershape), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) + precompile(Tuple{typeof(Plots.ispolar), Plots.Series}) + precompile(Tuple{typeof(Plots._hist_edges), Tuple{Array{Float64, 1}}, Symbol}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.make_steps), Array{Float64, 1}, Symbol}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}}) + precompile(Tuple{typeof(Plots.filter_data), Base.UnitRange{Int64}, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.create_grid_curly), Expr}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._show), Base.IOStream, Base.Multimedia.MIME{Symbol("image/png")}, Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots._binbarlike_baseline), Float64, Symbol}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.get_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis}) + precompile(Tuple{typeof(Plots.colorbar_style), Plots.Series}) + precompile(Tuple{typeof(Plots.ensure_gradient!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Float64, Float64, Int64}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.make_fillrange_from_ribbon), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.is_scale_supported), Plots.GRBackend, Symbol}) + precompile(Tuple{typeof(Plots.isvertical), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}}) + precompile(Tuple{typeof(Plots.right), Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + precompile(Tuple{typeof(Plots.gr_set_line), Int64, Symbol, ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}}) + precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Float64, Float64, Int64}) + precompile(Tuple{typeof(Plots.supported_markers)}) + precompile(Tuple{typeof(Plots.warnOnUnsupported), Plots.GRBackend, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._process_seriesrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, String}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._add_markershape), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}}) + precompile(Tuple{typeof(Plots.gr_lims), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Bool, Nothing}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) + precompile(Tuple{typeof(Plots._add_smooth_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.supported_styles)}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) + precompile(Tuple{typeof(Plots.gr_fill_viewport), Array{Float64, 1}, ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout, Array{Measures.Length{:mm, Float64}, 1}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}}) + precompile(Tuple{typeof(Plots._process_seriesrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.warnOnUnsupported_scales), Plots.GRBackend, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Function, 1}}) + precompile(Tuple{typeof(Plots.get_xy), Array{Plots.OHLC{T} where T<:Real, 1}, Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots.gr_text), Float64, Float64, String}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) + precompile(Tuple{typeof(Plots.like_histogram), Symbol}) + precompile(Tuple{typeof(Plots.compute_gridsize), Int64, Int64, Int64}) + precompile(Tuple{typeof(Plots._process_plotrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}, Array{Base.Dict{Symbol, Any}, 1}}) + precompile(Tuple{typeof(Plots.get_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis}) + precompile(Tuple{typeof(Plots.is_marker_supported), Symbol}) + precompile(Tuple{typeof(Plots.gr_set_viewport_polar)}) + precompile(Tuple{typeof(Plots._pick_default_backend)}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Tuple{Int64, Int64}, Int64, Bool}) + precompile(Tuple{typeof(Plots._preprocess_userrecipe), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Plots.Surface{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.all3D), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.make_fillrange_side), Array{Float64, 1}, Int64}) + precompile(Tuple{typeof(Plots.reset_extrema!), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._replace_linewidth), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Float64, Symbol}) + precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Float64, Float64, Int64}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.slice_arg), Array{ColorTypes.RGBA{Float64}, 2}, Int64}) + precompile(Tuple{typeof(Plots.should_add_to_legend), Plots.Series}) + precompile(Tuple{typeof(Plots.reset_extrema!), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Plots.Shape}) + precompile(Tuple{typeof(Plots.is3d), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Int64, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Bool, Int64, Bool}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Float64, Float64, Int64, Symbol}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Symbol, Int64, Bool}) + precompile(Tuple{typeof(Plots._update_series_attributes!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.gr_yaxis_width), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Nothing, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Measures.Length{:mm, Float64}, Int64, Bool}) + precompile(Tuple{typeof(Plots.transpose_z), Plots.Series, Array{Float64, 2}, Bool}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Plots.Surface{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Float64, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, String, Int64, Bool}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Array{Any, 1}, Int64, Bool}) + precompile(Tuple{typeof(Plots.xlims), Int64}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Any}, Int64, Bool}) + precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.create_grid_curly), Expr}) + precompile(Tuple{typeof(Plots.slice_arg), Array{String, 2}, Int64}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots._update_min_padding!), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.slice_arg), Array{Symbol, 2}, Int64}) + precompile(Tuple{typeof(Plots.ignorenan_extrema), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots.get_linealpha), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots.gr_yaxis_width), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots.extendSeriesData), Array{Float64, 1}, Float64}) + precompile(Tuple{typeof(Plots.is_style_supported), Plots.GRBackend, Symbol}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Tuple{Int64, Int64}, Int64, Bool}) + precompile(Tuple{typeof(Plots._replace_linewidth), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._add_errorbar_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._pick_default_backend)}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.ignorenan_minimum), Array{Int64, 1}}) + precompile(Tuple{typeof(Plots._add_errorbar_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.filter_data), Array{Float64, 1}, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.convert_sci_unicode), String}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Int64, Int64, Symbol}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Nothing, Int64, Bool}) + precompile(Tuple{typeof(Plots._get_defaults), Symbol}) + precompile(Tuple{typeof(Plots.gr_inqtext), Int64, Int64, String}) + precompile(Tuple{typeof(Plots.gr_set_fillcolor), ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, typeof(identity)}) + precompile(Tuple{typeof(Plots.gr_set_fill), ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.fakedata), Int64, Int64}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Float64, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, String, Int64, Bool}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Bool, Int64, Bool}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Int64, Symbol}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Measures.Length{:mm, Float64}, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Int64, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Symbol, Int64, Bool}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Int32, 1}}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Float64, Symbol}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Array{Any, 1}, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Any}, Int64, Bool}) + precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Array{Any, 1}}) + precompile(Tuple{typeof(Plots.create_grid_vcat), Expr}) + precompile(Tuple{typeof(Plots.calc_num_subplots), Plots.GridLayout}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.gr_set_textcolor), ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.fg_color), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.update_inset_bboxes!), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.ignorenan_extrema), Array{Float64, 2}}) + precompile(Tuple{typeof(Plots.like_surface), Symbol}) + precompile(Tuple{typeof(Plots.gr_set_xticks_font), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout, Array{Measures.Length{:mm, Float64}, 1}}) + precompile(Tuple{typeof(Plots.backend), Symbol}) + precompile(Tuple{typeof(Plots._process_plotrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}, Array{Base.Dict{Symbol, Any}, 1}}) + precompile(Tuple{typeof(Plots.is3d), Symbol}) + precompile(Tuple{typeof(Plots.iter_segments), Array{Float64, 1}, Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.get_fillalpha), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots._cycle), Base.StepRange{Int64, Int64}, Int64}) + precompile(Tuple{typeof(Plots.series_annotations), Array{Any, 1}}) + precompile(Tuple{typeof(Plots.convertLegendValue), Symbol}) + precompile(Tuple{typeof(Plots.compute_xyz), Nothing, Nothing, Nothing}) + precompile(Tuple{typeof(Plots.gr_text_size), String}) + precompile(Tuple{typeof(Plots.backend), Symbol}) + precompile(Tuple{typeof(Plots.gr_set_markercolor), ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.ignorenan_maximum), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.gr_set_yticks_font), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.legendfont), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Int64, 1}, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.update_inset_bboxes!), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.gr_set_yticks_font), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.iter_segments), Base.UnitRange{Int64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.hascolorbar), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.ignorenan_extrema), Base.StepRange{Int64, Int64}}) + precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{String, 1}}, Int64}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Int64}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Nothing}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Bool}) + precompile(Tuple{typeof(Plots.straightline_data), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.is3d), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.arrow), Int64}) + precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Int64}) + precompile(Tuple{typeof(Plots.link_axes!), Plots.Axis, Plots.Axis}) + precompile(Tuple{typeof(Plots.setxy!), Plots.Plot{Plots.GRBackend}, Tuple{Array{Float64, 1}, Array{Float64, 1}}, Int64}) + precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol, Array{Float64, 1}, Symbol, Tuple{Int64, Int64}}) + precompile(Tuple{typeof(Plots._update_series_attributes!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.link_axes!), Plots.Axis, Plots.Axis}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, typeof(identity), Nothing}) + precompile(Tuple{typeof(Plots.bbox!), Plots.GridLayout, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + precompile(Tuple{typeof(Plots._preprocess_userrecipe), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._update_plot_args), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.iter_segments), Plots.Series}) + precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Tuple{Int64, Int64}}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Plots.Stroke}) + precompile(Tuple{typeof(Plots._update_axis_links), Plots.Plot{Plots.GRBackend}, Plots.Axis, Symbol}) + precompile(Tuple{typeof(Plots.autopick), Array{ColorTypes.RGBA{Float64}, 1}, Int64}) + precompile(Tuple{typeof(Plots.wrap_surfaces), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._update_clims), Float64, Float64, Int64, Int64}) + precompile(Tuple{typeof(Plots.filter_data!), Base.Dict{Symbol, Any}, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Bool}) + precompile(Tuple{typeof(Plots._subplot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) + precompile(Tuple{typeof(Plots.legendfont), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.ensure_gradient!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots.layout_args), Tuple{Int64, Int64}}) + precompile(Tuple{typeof(Plots._cycle), Base.UnitRange{Int64}, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots._cycle), Array{Any, 1}, Int64}) + precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{String, 1}}, Int64}) + precompile(Tuple{typeof(Plots.rowsize), Expr}) + precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Float64}) + precompile(Tuple{typeof(Plots.tickfont), Plots.Axis}) + precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol, Bool}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.UnitRange{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.process_ribbon), Tuple{Base.LinRange{Float64}, Base.LinRange{Float64}}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.is_attr_supported), Plots.GRBackend, Symbol}) + precompile(Tuple{typeof(Plots.get_series_color), ColorTypes.RGBA{Float64}, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.inline), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._cycle), Array{Plots.Subplot{T} where T<:RecipesBase.AbstractBackend, 1}, Int64}) + precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64}) + precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Function, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Array{String, 1}, Int64}) + precompile(Tuple{typeof(Plots.get_markerstrokecolor), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots._update_clims), Float64, Float64, Float64, Float64}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._cycle), Array{String, 1}, Int64}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}}) + precompile(Tuple{typeof(Plots.color_or_nothing!), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.fg_color), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._override_seriestype_check), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.get_series_color), Int64, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.get_linewidth), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.Spy}}) + isdefined(Plots, Symbol("#scatter!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#scatter!##kw")), NamedTuple{(:markersize, :c), Tuple{Int64, Symbol}}, typeof(Plots.scatter!), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._update_axis), Plots.Axis, Base.Dict{Symbol, Any}, Symbol, Int64}) + precompile(Tuple{typeof(Plots.compute_xyz), Nothing, Array{Union{Base.Missing, Float64}, 1}, Nothing}) + precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}, Float64}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}}) + precompile(Tuple{typeof(Plots._update_subplot_args), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Int64, Bool}) + isdefined(Plots, Symbol("#heatmap##kw")) && precompile(Tuple{getfield(Plots, Symbol("#heatmap##kw")), NamedTuple{(:aspect_ratio,), Tuple{Int64}}, typeof(Plots.heatmap), Array{String, 1}, Int}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{String, 1}, Array{Float64, 1}, Nothing}) + isdefined(Plots, Symbol("#portfoliocomposition##kw")) && precompile(Tuple{getfield(Plots, Symbol("#portfoliocomposition##kw")), NamedTuple{(:labels,), Tuple{Array{String, 2}}}, typeof(Plots.portfoliocomposition), Array{Float64, 2}, Int}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Array{Int64, 1}, Int64}) + precompile(Tuple{typeof(Plots.get_series_color), Symbol, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.tovec), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.get_linestyle), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots.get_series_color), ColorTypes.RGBA{Float64}, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + isdefined(Plots, Symbol("#gr_set_font##kw")) && precompile(Tuple{getfield(Plots, Symbol("#gr_set_font##kw")), NamedTuple{(:halign, :valign, :rotation), Tuple{Symbol, Symbol, Int64}}, typeof(Plots.gr_set_font), Plots.Font}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + isdefined(Plots, Symbol("#scatter##kw")) && precompile(Tuple{getfield(Plots, Symbol("#scatter##kw")), NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks), Tuple{Array{Symbol, 2}, Array{String, 2}, Base.ReshapedArray{Int64, 2, Base.UnitRange{Int64}, Tuple{}}, Int64, String, Int64, Base.UnitRange{Int64}}}, typeof(Plots.scatter), Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._show), Base.IOStream, Base.Multimedia.MIME{Symbol("image/png")}, Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._update_subplot_args), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Int64, Bool}) + precompile(Tuple{typeof(Plots.xlims), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.process_ribbon), Int64, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}}) + precompile(Tuple{typeof(Plots.backend)}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.link_axes!), Plots.GridLayout, Symbol}) + isdefined(Plots, Symbol("#gr_polyline##kw")) && precompile(Tuple{getfield(Plots, Symbol("#gr_polyline##kw")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Array{Symbol, 2}, Int64}) + precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Bool}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{String, 1}, Array{String, 1}, Plots.Surface{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots.process_ribbon), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.gr_text_size), String, Int64}) + precompile(Tuple{typeof(Plots._subplot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) + precompile(Tuple{typeof(Plots.layout_args), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.process_fillrange), Int64, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Float64}) + precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}}) + precompile(Tuple{typeof(Plots._display), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) + precompile(Tuple{typeof(Plots._update_axis_links), Plots.Plot{Plots.GRBackend}, Plots.Axis, Symbol}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots.gr_set_font), Plots.Font}) + precompile(Tuple{typeof(Plots.get_markeralpha), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.legendtitlefont), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.UnitRange{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.is_2tuple), Int64}) + precompile(Tuple{typeof(Plots.is_marker_supported), Plots.Shape}) + precompile(Tuple{typeof(Plots.gr_colorbar_colors), Plots.Series, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Float64}) + precompile(Tuple{typeof(Plots.iter_segments), Array{Int64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.get_markerstrokealpha), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots._hist_edge), Tuple{Array{Float64, 1}}, Int64, Symbol}) + precompile(Tuple{typeof(Plots._update_axis_colors), Plots.Axis}) + precompile(Tuple{typeof(Plots.xgrid!), Plots.Plot{Plots.GRBackend}, Symbol, Int}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots.get_series_color), PlotUtils.ColorGradient, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, Array{Float64, 1}, Plots.Surface{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, typeof(identity), Nothing}) + isdefined(Plots, Symbol("#gr_set_font##kw")) && precompile(Tuple{getfield(Plots, Symbol("#gr_set_font##kw")), NamedTuple{(:halign, :valign, :rotation), Tuple{Symbol, Symbol, Int64}}, typeof(Plots.gr_set_font), Plots.Font}) + precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.yaxis!), String, Symbol}) + precompile(Tuple{typeof(Plots.ignorenan_maximum), Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots._update_plot_args), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + isdefined(Plots, Symbol("#scatter!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#scatter!##kw")), NamedTuple{(:zcolor, :m, :ms, :lab), Tuple{Array{Float64, 1}, Tuple{Symbol, Float64, Plots.Stroke}, Array{Float64, 1}, String}}, typeof(Plots.scatter!), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.ignorenan_minimum), Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots._prepare_annotations), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.extractGroupArgs), Array{String, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Base.StepRange{Int64, Int64}}) + precompile(Tuple{typeof(Plots.plotarea!), Plots.GridLayout, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, ColorTypes.RGBA{Float64}, Symbol}) + precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Bool}) + precompile(Tuple{typeof(Plots.text), String, Symbol, Int64, Int}) + precompile(Tuple{typeof(Plots.font), Int64, Int}) + precompile(Tuple{typeof(Plots.ispolar), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._prepare_subplot), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Bool, Symbol}) + precompile(Tuple{typeof(Plots._cycle), Int64, Base.StepRange{Int64, Int64}}) + precompile(Tuple{typeof(Plots.font), Symbol, Int}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Plots.Spy}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.guidefont), Plots.Axis}) + precompile(Tuple{typeof(Plots._add_the_series), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._update_axis_colors), Plots.Axis}) + precompile(Tuple{typeof(Plots.stroke), Int64, Int}) + precompile(Tuple{typeof(Plots.bottom), Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + isdefined(Plots, Symbol("#pie##kw")) && precompile(Tuple{getfield(Plots, Symbol("#pie##kw")), NamedTuple{(:title, :l), Tuple{String, Float64}}, typeof(Plots.pie), Array{String, 1}, Int}) + precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Bool}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, Array{Float64, 1}, Array{Float64, 1}}) + isdefined(Plots, Symbol("#@layout")) && precompile(Tuple{getfield(Plots, Symbol("#@layout")), LineNumberNode, Module, Expr}) + precompile(Tuple{typeof(Plots.build_layout), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._preprocess_barlike), Base.Dict{Symbol, Any}, Base.UnitRange{Int64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.compute_xyz), Nothing, Array{Float64, 1}, Nothing}) + precompile(Tuple{typeof(Plots.gr_contour_levels), Plots.Series, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.aliasesAndAutopick), Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Symbol}, Array{Symbol, 1}, Int64}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{String, 1}}) + precompile(Tuple{typeof(Plots.process_fillrange), Nothing, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.bbox!), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + precompile(Tuple{typeof(Plots.process_ribbon), typeof(identity), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._add_the_series), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + isdefined(Plots, Symbol("#histogram2d##kw")) && precompile(Tuple{getfield(Plots, Symbol("#histogram2d##kw")), NamedTuple{(:nbins,), Tuple{Int64}}, typeof(Plots.histogram2d), Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Array{Float64, 1}, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._prepare_subplot), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.gr_text_size), String, Int64}) + precompile(Tuple{typeof(Plots.gr_set_gradient), Plots.Series}) + precompile(Tuple{typeof(Plots.attr), Plots.EmptyLayout, Symbol}) + precompile(Tuple{typeof(Plots.gr_update_colorbar!), Plots.GRColorbar, Plots.Series}) + isdefined(Plots, Symbol("#hline!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#hline!##kw")), NamedTuple{(:line,), Tuple{Tuple{Int64, Symbol, Float64, Array{Symbol, 2}}}}, typeof(Plots.hline!), Array{Float64, 2}}) + precompile(Tuple{typeof(Plots.ignorenan_extrema), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Plots.Shape, Symbol}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.labelfunc), Symbol, Plots.GRBackend}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.is_seriestype_supported), Symbol}) + precompile(Tuple{typeof(Plots.slice_arg), Tuple{Int64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.slice_arg), Base.UnitRange{Int64}, Int64}) + precompile(Tuple{typeof(Plots.trueOrAllTrue), typeof(identity), Array{Symbol, 2}}) + precompile(Tuple{typeof(Plots.annotate!), Array{Tuple{Int64, Float64, Plots.PlotText}, 1}}) + precompile(Tuple{typeof(Plots.is_seriestype_supported), Symbol}) + precompile(Tuple{typeof(Plots.widen), Float64, Float64, Symbol}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.gr_set_xticks_font), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.plotarea!), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + precompile(Tuple{typeof(Plots._cycle), ColorTypes.RGBA{Float64}, Int64}) + precompile(Tuple{typeof(Plots.gr_lims), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Bool, Nothing}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Float64, 2}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.is_marker_supported), Symbol}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}, Array{RecipesBase.RecipeData, 1}}) + isdefined(Plots, Symbol("#contour##kw")) && precompile(Tuple{getfield(Plots, Symbol("#contour##kw")), NamedTuple{(:fill,), Tuple{Bool}}, typeof(Plots.contour), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots.font), String, Int}) + precompile(Tuple{typeof(Plots.vline!), Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.wraptuple), Int64}) + precompile(Tuple{typeof(Plots.text), String, Int64, Symbol, Symbol}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.title!), String}) + precompile(Tuple{typeof(Plots._filter_input_data!), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.attr), Plots.EmptyLayout, Symbol, Symbol}) + precompile(Tuple{typeof(Plots._display), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.frame), Plots.Animation, Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.UnitRange{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.gr_update_colorbar!), Plots.GRColorbar, Plots.Series}) + precompile(Tuple{typeof(Plots.titlefont), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.gr_set_gradient), Plots.Series}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._transform_ticks), Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots._prepare_annotations), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.process_ribbon), Nothing, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.slice_arg), Tuple{Int64, Int64}, Int64}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + isdefined(Plots, Symbol("#scatter##kw")) && precompile(Tuple{getfield(Plots, Symbol("#scatter##kw")), NamedTuple{(:m, :lab, :bg, :xlim, :ylim), Tuple{Tuple{Int64, Symbol}, Array{String, 2}, Symbol, Tuple{Int64, Int64}, Tuple{Int64, Int64}}}, typeof(Plots.scatter), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) + precompile(Tuple{typeof(Plots.tickfont), Plots.Axis}) + precompile(Tuple{typeof(Plots.series_annotations_shapes!), Plots.Series, Symbol}) + precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + isdefined(Plots, Symbol("#scatter!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#scatter!##kw")), NamedTuple{(:marker, :series_annotations), Tuple{Tuple{Int64, Float64, Symbol}, Array{Any, 1}}}, typeof(Plots.scatter!), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) + precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Function, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.rightpad), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, Array{Float64, 1}, Nothing}) + precompile(Tuple{typeof(Plots.iter_segments), Plots.Series}) + precompile(Tuple{typeof(Plots.allAlphas), Int64}) + precompile(Tuple{typeof(Plots.gui), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._add_smooth_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._update_subplot_colors), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.link_axes!), Plots.GridLayout, Symbol}) + precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.ylims), Int64}) + precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}, Plots.Series}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.slice_arg), ColorTypes.RGBA{Float64}, Int64}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Int64, 1}, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}, Nothing}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._transform_ticks), Base.StepRange{Int64, Int64}}) + precompile(Tuple{typeof(Plots.allStyles), Int64}) + precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}, Plots.Series}) + precompile(Tuple{typeof(Plots.layout_args), Int64}) + precompile(Tuple{typeof(Plots.locate_annotation), Plots.Subplot{Plots.GRBackend}, Int64, Float64, Plots.PlotText}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.contour), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.png), Plots.Plot{Plots.GRBackend}, String}) + precompile(Tuple{typeof(Plots.create_grid), Expr}) + precompile(Tuple{typeof(Plots.guidefont), Plots.Axis}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.bottompad), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots._update_subplot_colors), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.create_grid_vcat), Expr}) + precompile(Tuple{typeof(Plots.toppad), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Array{String, 1}}) + precompile(Tuple{typeof(Plots.slice_arg), Int64, Int64}) + precompile(Tuple{typeof(Plots.trueOrAllTrue), typeof(Plots.is3d), Symbol}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Float64, Float64, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Array{Union{Base.Missing, Float64}, 1}}) + precompile(Tuple{typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Float64}) + precompile(Tuple{typeof(Plots.slice_arg), Base.StepRange{Int64, Int64}, Int64}) + precompile(Tuple{typeof(Plots.rowsize), Symbol}) + precompile(Tuple{typeof(Plots.ylims), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Nothing}) + precompile(Tuple{typeof(Plots.wraptuple), Plots.SeriesAnnotations}) + precompile(Tuple{typeof(Plots.wraptuple), Bool}) + precompile(Tuple{typeof(Plots._transform_ticks), Nothing}) + precompile(Tuple{typeof(Plots.make_steps), Nothing, Symbol}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Plots.GridLayout, Int64}) + precompile(Tuple{typeof(Plots.supported_markers), Plots.GRBackend}) + precompile(Tuple{typeof(Plots.slice_arg), Nothing, Int64}) + precompile(Tuple{typeof(Plots.wraptuple), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.gr_set_font), Plots.Font}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, ColorTypes.RGB{Float64}, Int64}) + precompile(Tuple{typeof(Plots.leftpad), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.convertLegendValue), Bool}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, String, Int64}) + precompile(Tuple{typeof(Plots.wraptuple), Array{Any, 1}}) + precompile(Tuple{typeof(Plots.supported_styles), Plots.GRBackend}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Symbol, Int64, Symbol, Float64}}) + precompile(Tuple{typeof(Plots.stroke), Int64, Int64}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Symbol, Symbol, Int64, Float64}}) + precompile(Tuple{typeof(Plots.add_layout_pct!), Base.Dict{Symbol, Any}, Expr, Int64, Int64}) + precompile(Tuple{typeof(Plots._expand_subplot_extrema), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.wraptuple), Float64}) + precompile(Tuple{typeof(Plots.create_grid), Expr}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Array{Symbol, 2}, Int64}}) + precompile(Tuple{typeof(Plots._cycle), Float64, Int64}) + precompile(Tuple{typeof(Plots.calc_num_subplots), Plots.EmptyLayout}) + precompile(Tuple{typeof(Plots._replace_markershape), Plots.Shape}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Float64, Symbol}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.nobigs), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.prepare_output), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.slice_arg), Symbol, Int64}) + precompile(Tuple{typeof(Plots.get_linewidth), Plots.Series}) + precompile(Tuple{typeof(Plots.slice_arg), String, Int64}) + precompile(Tuple{typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}, typeof(identity)}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Symbol}}) + precompile(Tuple{typeof(Plots._cycle), Int64, Int64}) + precompile(Tuple{typeof(Plots.filter_data), Nothing, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.process_annotation), Plots.Subplot{Plots.GRBackend}, Int64, Float64, Plots.PlotText}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Float64, Symbol, Plots.Stroke}}) + precompile(Tuple{typeof(Plots.get_linestyle), Plots.Series}) + precompile(Tuple{typeof(Plots._expand_subplot_extrema), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots._cycle), Symbol, Int64}) + precompile(Tuple{typeof(Plots.get_fillalpha), Plots.Series}) + precompile(Tuple{typeof(Plots.font), String, Int}) + precompile(Tuple{typeof(Plots.get_series_color), Symbol, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Array{Symbol, 2}, Int64, Float64, Plots.Stroke}}) + precompile(Tuple{typeof(Plots.get_linealpha), Plots.Series}) + precompile(Tuple{typeof(Plots.slice_arg), Float64, Int64}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.replaceAliases!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Symbol}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{String, Tuple{Int64, Int64}, Base.StepRange{Int64, Int64}, Symbol}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Array{Symbol, 2}}}) + precompile(Tuple{typeof(Plots.is_2tuple), Symbol}) + precompile(Tuple{typeof(Plots._cycle), Plots.Shape, Int64}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Float64, Symbol}}) + precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.Subplot{Plots.GRBackend}, Array{Measures.Length{:mm, Float64}, 1}}) + precompile(Tuple{typeof(Plots.wraptuple), Nothing}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Float64, Plots.Stroke}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Symbol, Float64, Array{Symbol, 2}}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Symbol, Symbol}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Int64}}) + precompile(Tuple{typeof(Plots._cycle), Nothing, Int64}) + precompile(Tuple{typeof(Plots.link_axes!), Array{RecipesBase.AbstractLayout, 1}, Symbol}) + precompile(Tuple{typeof(Plots._replace_markershape), Array{Symbol, 2}}) + precompile(Tuple{typeof(Plots.allReals), Int64}) + precompile(Tuple{typeof(Plots.get_subplot), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{}}) + precompile(Tuple{typeof(Plots._transform_ticks), Symbol}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{String, Symbol}}) + precompile(Tuple{typeof(Plots._update_axis), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol, Int64}) + precompile(Tuple{typeof(Plots.slice_arg), Bool, Int64}) + precompile(Tuple{typeof(Plots.prepare_output), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Plots.Plot{Plots.GRBackend}, Int64}) + precompile(Tuple{typeof(Plots._create_backend_figure), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.text), String, Symbol}) + precompile(Tuple{typeof(Plots.bar), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.annotations), Array{Any, 1}}) + precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Int64, Int64}) + precompile(Tuple{typeof(Plots.link_axes!), Plots.Subplot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots.get_axis), Plots.Subplot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.series_annotations), Plots.SeriesAnnotations}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Float64, Array{Symbol, 2}, Int64}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Plots.Shape, Int64, ColorTypes.RGBA{Float64}}}) + precompile(Tuple{typeof(Plots._update_axis), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol, Int64}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Float64, Int64}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Symbol, Int64}) + precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Bool}) + precompile(Tuple{typeof(Plots.gr_set_line), Int64, Symbol, PlotUtils.ColorGradient}) + precompile(Tuple{typeof(Plots.link_axes!), Array{RecipesBase.AbstractLayout, 1}, Symbol}) + precompile(Tuple{typeof(Plots.build_layout), Base.Dict{Symbol, Any}}) + isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:grid, :lims), Tuple{Bool, Tuple{Int64, Int64}}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.get_axis), Plots.Subplot{Plots.GRBackend}, Symbol}) + isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:foreground_color_grid, :grid, :gridalpha, :gridstyle, :gridlinewidth), Tuple{ColorTypes.RGBA{Float64}, Bool, Float64, Symbol, Int64}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#histogram##kw")) && precompile(Tuple{getfield(Plots, Symbol("#histogram##kw")), NamedTuple{(:bins, :weights), Tuple{Symbol, Array{Int64, 1}}}, typeof(Plots.histogram), Array{Float64, 1}}) + isdefined(Plots, Symbol("#histogram2d##kw")) && precompile(Tuple{getfield(Plots, Symbol("#histogram2d##kw")), NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio), Tuple{Tuple{Int64, Int64}, Bool, Bool, Int64}}, typeof(Plots.histogram2d), Array{Base.Complex{Float64}, 1}}) + precompile(Tuple{typeof(Plots.series_annotations), Nothing}) + isdefined(Plots, Symbol("#gr_polyline##kw")) && precompile(Tuple{getfield(Plots, Symbol("#gr_polyline##kw")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Array{Int64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.ohlc), Array{Plots.OHLC{T} where T<:Real, 1}}) + isdefined(Plots, Symbol("#gr_polyline##kw")) && precompile(Tuple{getfield(Plots, Symbol("#gr_polyline##kw")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Base.UnitRange{Int64}, Array{Float64, 1}}) + isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:grid, :lims, :flip), Tuple{Bool, Tuple{Int64, Int64}, Bool}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout}) + isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:ticks,), Tuple{Base.UnitRange{Int64}}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout}) + isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:lims,), Tuple{Tuple{Int64, Float64}}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:lims, :flip, :ticks, :guide), Tuple{Tuple{Int64, Int64}, Bool, Base.StepRange{Int64, Int64}, String}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Array{Symbol, 2}, Symbol}) + precompile(Tuple{typeof(Plots._process_userrecipe), Plots.Plot{Plots.GRBackend}, Array{Base.Dict{Symbol, Any}, 1}, RecipesBase.RecipeData}) + isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:rotation,), Tuple{Int64}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:lims,), Tuple{Tuple{Int64, Int64}}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Array{Symbol, 2}, Symbol}) + isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:lims,), Tuple{Tuple{Int64, Int64}}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Union{Base.Missing, Number}, 1}}) + isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:grid, :ticks), Tuple{Bool, Nothing}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:grid,), Tuple{Bool}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:guide,), Tuple{String}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:grid,), Tuple{Bool}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots._process_userrecipe), Plots.Plot{Plots.GRBackend}, Array{Base.Dict{Symbol, Any}, 1}, RecipesBase.RecipeData}) + isdefined(Plots, Symbol("#_make_hist##kw")) && precompile(Tuple{getfield(Plots, Symbol("#_make_hist##kw")), NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Tuple{Int64, Int64}}) + precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.GRBackend}, Symbol}) + isdefined(Plots, Symbol("#_make_hist##kw")) && precompile(Tuple{getfield(Plots, Symbol("#_make_hist##kw")), NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}}, Symbol}) + isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:scale, :guide), Tuple{Symbol, String}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#test_examples##kw")) && precompile(Tuple{getfield(Plots, Symbol("#test_examples##kw")), NamedTuple{(:disp,), Tuple{Bool}}, typeof(Plots.test_examples), Symbol}) + isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:flip,), Tuple{Bool}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#_make_hist##kw")) && precompile(Tuple{getfield(Plots, Symbol("#_make_hist##kw")), NamedTuple{(:normed, :weights), Tuple{Bool, Array{Int64, 1}}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}}, Symbol}) + precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots.ignorenan_extrema), Plots.Axis}) + precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol}) + precompile(Tuple{typeof(Plots.layout_args), Plots.GridLayout}) + isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:ticks,), Tuple{Nothing}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#_make_hist##kw")) && precompile(Tuple{getfield(Plots, Symbol("#_make_hist##kw")), NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Int64}) + isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:formatter,), Tuple{Symbol}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol}) + precompile(Tuple{typeof(Plots.backend)}) + precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.hascolorbar), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol}) + precompile(Tuple{typeof(Plots.allStyles), Symbol}) end From 97c0161b9d8b818469402b17bd66cbde53275e65 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 14 Nov 2019 07:37:21 +0100 Subject: [PATCH 107/357] markercolor --- src/backends/pgfplotsx.jl | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 44ac5994..d2fc8622 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -56,8 +56,7 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) { color = opt[:linecolor], mark = _pgfplotsx_markers[opt[:markershape]], - # TODO: how to do nested options? - # "mark options" = "{color = $(opt[:markercolor])}", + mark_options = {color = opt[:markercolor]}, }, PGFPlotsX.Coordinates(series[:x],series[:y]) ) From c984722807cb5aed5ad29018c5c5c47a5e8a3179 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 14 Nov 2019 16:45:31 +0100 Subject: [PATCH 108/357] fix code loading --- Project.toml | 1 - src/backends.jl | 1 - src/init.jl | 1 + 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Project.toml b/Project.toml index 685dbd8e..087277df 100644 --- a/Project.toml +++ b/Project.toml @@ -15,7 +15,6 @@ JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Measures = "442fdcdd-2543-5da2-b0f3-8c86c306513e" NaNMath = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" -PGFPlotsX = "8314cec4-20b6-5062-9cdb-752b83310925" Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" PlotThemes = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" PlotUtils = "995b91a9-d308-5afd-9ec6-746e21dbc043" diff --git a/src/backends.jl b/src/backends.jl index d8074d35..f9b7ce12 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -37,7 +37,6 @@ macro init_backend(s) _backendType[Symbol($str)] = $T _backendSymbol[$T] = Symbol($str) _backend_packages[Symbol($str)] = Symbol($package_str) - # include("backends/" * $str * ".jl") end) end diff --git a/src/init.jl b/src/init.jl index bffc99f2..41519404 100644 --- a/src/init.jl +++ b/src/init.jl @@ -31,6 +31,7 @@ function __init__() @require HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" include(joinpath(@__DIR__, "backends", "hdf5.jl")) @require InspectDR = "d0351b0e-4b05-5898-87b3-e2a8edfddd1d" include(joinpath(@__DIR__, "backends", "inspectdr.jl")) @require PGFPlots = "3b7a836e-365b-5785-a47d-02c71176b4aa" include(joinpath(@__DIR__, "backends", "pgfplots.jl")) + @require PGFPlotsX = "8314cec4-20b6-5062-9cdb-752b83310925" include(joinpath(@__DIR__, "backends", "pgfplotsx.jl")) @require PlotlyJS = "f0f68f2c-4968-5e81-91da-67840de0976a" include(joinpath(@__DIR__, "backends", "plotlyjs.jl")) @require PyPlot = "d330b81b-6aea-500a-939a-2ce795aea3ee" include(joinpath(@__DIR__, "backends", "pyplot.jl")) @require UnicodePlots = "b8865327-cd53-5732-bb35-84acbb429228" include(joinpath(@__DIR__, "backends", "unicodeplots.jl")) From 70c507b8f870ec1008819e701333e95158bbcb69 Mon Sep 17 00:00:00 2001 From: Leon Shen Date: Thu, 14 Nov 2019 14:00:39 -0500 Subject: [PATCH 109/357] add more instructions for generateprecompiles.jl --- deps/generateprecompiles.jl | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/deps/generateprecompiles.jl b/deps/generateprecompiles.jl index 353d6880..dfbd4d0b 100644 --- a/deps/generateprecompiles.jl +++ b/deps/generateprecompiles.jl @@ -1,6 +1,29 @@ # To figure out what should be precompiled, run this script, then move # precompile_Plots.jl in precompiles_path (see below) to src/precompile.jl +# This script works by using SnoopCompile to log compilations that take place +# while running the examples on the GR backend. So SnoopCompile must be +# installed, and StatsPlots, RDatasets, and FileIO are also required for +# certain examples. + +# If precompilation fails with an UndefVarError for a module, probably what is +# happening is that the module appears in the precompile statements, but is +# only visible to one of Plots' dependencies, and not Plots itself. Adding the +# module to the blacklist below will remove these precompile statements. + +# Anonymous functions may appear in precompile statements as functions with +# hashes in their name. Those of the form "#something##kw" have to do with +# compiling functions with keyword arguments, and are named reproducibly, so +# can be kept. Others generally will not work. Currently, SnoopCompile includes +# some anonymous functions that not reproducible, but SnoopCompile PR #30 +# (which looks about to be merged) will ensure that anonymous functions are +# actually defined before attempting to precompile them. Alternatively, we can +# keep only the keyword argument related anonymous functions by changing the +# regex that SnoopCompile uses to detect anonymous functions to +# r"#{1,2}[^\"#]+#{1,2}\d+" (see anonrex in SnoopCompile.jl). To exclude all +# precompile statements involving anonymous functions, "#" can also be added to +# the blacklist below. + using SnoopCompile log_path = joinpath(tempdir(), "compiles.log") From 5920f3b34d3a8a841daa2dad6d34d6e0e0e68171 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 14 Nov 2019 22:31:22 +0100 Subject: [PATCH 110/357] options translation part 1, use Options instead of @pgf --- src/backends/pgfplotsx.jl | 420 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 400 insertions(+), 20 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index d2fc8622..455f61cc 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,5 +1,3 @@ -using PGFPlotsX: PGFPlotsX - const _pgfplotsx_linestyles = KW( :solid => "solid", :dash => "dashed", @@ -33,41 +31,423 @@ const _pgfplotsx_legend_pos = KW( :topleft => "north west", :outertopright => "outer north east", ) + +const _pgfx_framestyles = [:box, :axes, :origin, :zerolines, :grid, :none] +const _pgfx_framestyle_defaults = Dict(:semi => :box) +## -------------------------------------------------------------------------------------- +function pgfx_framestyle(style::Symbol) + if style in _pgfx_framestyles + 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.") + default_style + end +end + +pgfx_thickness_scaling(plt::Plot) = plt[:thickness_scaling] +pgfx_thickness_scaling(sp::Subplot) = pgfx_thickness_scaling(sp.plt) +pgfx_thickness_scaling(series) = pgfx_thickness_scaling(series[:subplot]) + +function pgfx_fillstyle(plotattributes, i = 1) + cstr = get_fillcolor(plotattributes, i) + a = alpha(cstr) + fa = get_fillalpha(plotattributes, i) + if fa !== nothing + a = fa + end + fill => cstr, fill_opacity => a +end + +function pgfx_linestyle(linewidth::Real, color, α = 1, linestyle = "solid") + cstr = plot_color(color, α) + a = alpha(cstr) + return PGFPlotsX.Options( + "color" => cstr, + "draw opacity" => a, + "line width" => linewidth, + get(_pgfplotsx_linestyles, linestyle, "solid") => nothing + ) +end + +function pgfx_linestyle(plotattributes, i = 1) + lw = pgfx_thickness_scaling(plotattributes) * get_linewidth(plotattributes, i) + lc = get_linecolor(plotattributes, i) + la = get_linealpha(plotattributes, i) + ls = get_linestyle(plotattributes, i) + return pgfx_linestyle(lw, lc, la, ls) +end + +function pgfx_font(fontsize, thickness_scaling = 1, font = "\\selectfont") + fs = fontsize * thickness_scaling + return string("{\\fontsize{", fs, " pt}{", 1.3fs, " pt}", font, "}") +end + +function pgfx_marker(plotattributes, i = 1) + shape = _cycle(plotattributes[:markershape], i) + cstr = plot_color(get_markercolor(plotattributes, i), get_markeralpha(plotattributes, i)) + a = alpha(cstr) + cstr_stroke = plot_color(get_markerstrokecolor(plotattributes, i), get_markerstrokealpha(plotattributes, i)) + a_stroke = alpha(cstr_stroke) + return PGFPlotsX.Options( + "mark" => get(_pgfplotsx_markers, shape, "*"), + "mark size" => pgfx_thickness_scaling(plotattributes) * 0.5 * _cycle(plotattributes[:markersize], i), + "mark options" => PGFPlotsX.Options( + "color" => cstr_stroke, + "draw opacity" => a_stroke, + "fill" => cstr, + "fill opacity" => a, + "line width" => pgfx_thickness_scaling(plotattributes) * _cycle(plotattributes[:markerstrokewidth], i), + "rotate" => (shape == :dtriangle ? 180 : 0), + get(_pgfplotsx_linestyles, _cycle(plotattributes[:markerstrokestyle], i), "solid") => nothing + ) + ) +end + +function pgfx_add_annotation!(o, x, y, val, thickness_scaling = 1) + # Construct the style string. + # Currently supports color and orientation + cstr = val.font.color + a = alpha(cstr) + #TODO: translate this + push!(o, PGFPlots.Plots.Node(val.str, # Annotation Text + x, y, + style=""" + $(get(_pgfx_annotation_halign,val.font.halign,"")), + color=$cstr, draw opacity=$(convert(Float16,a)), + rotate=$(val.font.rotation), + font=$(pgfx_font(val.font.pointsize, thickness_scaling)) + """)) +end +## -------------------------------------------------------------------------------------- +# TODO: translate these if needed +function pgf_series(sp::Subplot, series::Series) + plotattributes = series.plotattributes + st = plotattributes[:seriestype] + series_collection = PGFPlots.Plot[] + + # function args + args = if st == :contour + plotattributes[:z].surf, plotattributes[:x], plotattributes[:y] + elseif is3d(st) + plotattributes[:x], plotattributes[:y], plotattributes[:z] + elseif st == :straightline + straightline_data(series) + elseif st == :shape + shape_data(series) + elseif ispolar(sp) + theta, r = plotattributes[:x], plotattributes[:y] + rad2deg.(theta), r + else + plotattributes[:x], plotattributes[:y] + end + + # PGFPlots can't handle non-Vector? + args = map(a -> if typeof(a) <: AbstractVector && typeof(a) != Vector + collect(a) + else + a + end, args) + + if st in (:contour, :histogram2d) + style = [] + kw = KW() + push!(style, pgf_linestyle(plotattributes)) + push!(style, pgf_marker(plotattributes)) + push!(style, "forget plot") + + kw[:style] = join(style, ',') + func = if st == :histogram2d + PGFPlots.Histogram2 + else + kw[:labels] = series[:contour_labels] + kw[:levels] = series[:levels] + PGFPlots.Contour + end + push!(series_collection, func(args...; kw...)) + + else + # series segments + segments = iter_segments(series) + for (i, rng) in enumerate(segments) + style = [] + kw = KW() + push!(style, pgf_linestyle(plotattributes, i)) + push!(style, pgf_marker(plotattributes, i)) + + if st == :shape + push!(style, pgf_fillstyle(plotattributes, i)) + end + + # add to legend? + if i == 1 && sp[:legend] != :none && should_add_to_legend(series) + if plotattributes[:fillrange] !== nothing + push!(style, "forget plot") + push!(series_collection, pgf_fill_legend_hack(plotattributes, args)) + else + kw[:legendentry] = plotattributes[:label] + if st == :shape # || plotattributes[:fillrange] !== nothing + push!(style, "area legend") + end + end + else + push!(style, "forget plot") + end + + seg_args = (arg[rng] for arg in args) + + # include additional style, then add to the kw + if haskey(_pgf_series_extrastyle, st) + push!(style, _pgf_series_extrastyle[st]) + end + kw[:style] = join(style, ',') + + # add fillrange + if series[:fillrange] !== nothing && st != :shape + push!(series_collection, pgf_fillrange_series(series, i, _cycle(series[:fillrange], rng), seg_args...)) + end + + # build/return the series object + func = if st == :path3d + PGFPlots.Linear3 + elseif st == :scatter + PGFPlots.Scatter + else + PGFPlots.Linear + end + push!(series_collection, func(seg_args...; kw...)) + end + end + series_collection +end + +function pgf_fillrange_series(series, i, fillrange, args...) + st = series[:seriestype] + style = [] + kw = KW() + push!(style, "line width = 0") + push!(style, "draw opacity = 0") + push!(style, pgf_fillstyle(series, i)) + push!(style, pgf_marker(series, i)) + push!(style, "forget plot") + if haskey(_pgf_series_extrastyle, st) + push!(style, _pgf_series_extrastyle[st]) + end + kw[:style] = join(style, ',') + func = is3d(series) ? PGFPlots.Linear3 : PGFPlots.Linear + return func(pgf_fillrange_args(fillrange, args...)...; kw...) +end + +function pgf_fillrange_args(fillrange, x, y) + n = length(x) + x_fill = [x; x[n:-1:1]; x[1]] + y_fill = [y; _cycle(fillrange, n:-1:1); y[1]] + return x_fill, y_fill +end + +function pgf_fillrange_args(fillrange, x, y, z) + n = length(x) + x_fill = [x; x[n:-1:1]; x[1]] + y_fill = [y; y[n:-1:1]; x[1]] + z_fill = [z; _cycle(fillrange, n:-1:1); z[1]] + return x_fill, y_fill, z_fill +end + +function pgf_fill_legend_hack(plotattributes, args) + style = [] + kw = KW() + push!(style, pgf_linestyle(plotattributes, 1)) + push!(style, pgf_marker(plotattributes, 1)) + push!(style, pgf_fillstyle(plotattributes, 1)) + push!(style, "area legend") + kw[:legendentry] = plotattributes[:label] + kw[:style] = join(style, ',') + st = plotattributes[:seriestype] + func = if st == :path3d + PGFPlots.Linear3 + elseif st == :scatter + PGFPlots.Scatter + else + PGFPlots.Linear + end + return func(([arg[1]] for arg in args)...; kw...) +end + +# -------------------------------------------------------------------------------------- +function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) + axis = sp[Symbol(letter,:axis)] + + # turn off scaled ticks + push!(opt, "scaled $(letter) ticks" => "false", + string(letter,:label) => axis[:guide], + ) + + # set to supported framestyle + framestyle = pgfx_framestyle(sp[:framestyle]) + + # axis label position + labelpos = "" + if letter == :x && axis[:guide_position] == :top + labelpos = "at={(0.5,1)},above," + elseif letter == :y && axis[:guide_position] == :right + labelpos = "at={(1,0.5)},below," + end + + # Add label font + cstr = plot_color(axis[:guidefontcolor]) + α = alpha(cstr) + push!(opt, string(letter, "label style") => PGFPlotsX.Options( + labelpos => nothing, + "font" => pgfx_font(axis[:guidefontsize], pgfx_thickness_scaling(sp)), + "color" => cstr, + "draw opacity" => α, + "rotate" => axis[:guidefontrotation], + ) + ) + + # flip/reverse? + axis[:flip] && push!(opt, "$letter dir" => "reverse") + + # scale + scale = axis[:scale] + if scale in (:log2, :ln, :log10) + push!(opt, string(letter,:mode) => "log") + scale == :ln || push!(opt, "log basis $letter" => "$(scale == :log2 ? 2 : 10)") + end + + # ticks on or off + if axis[:ticks] in (nothing, false, :none) || framestyle == :none + push!(opt, "$(letter)majorticks" => "false") + end + + # grid on or off + if axis[:grid] && framestyle != :none + push!(opt, "$(letter)majorgrids" => "true") + else + push!(opt, "$(letter)majorgrids" => "false") + end + + # limits + # TODO: support zlims + if letter != :z + lims = ispolar(sp) && letter == :x ? rad2deg.(axis_limits(sp, :x)) : axis_limits(sp, letter) + push!( opt, + string(letter,:min) => lims[1], + string(letter,:max) => lims[2] + ) + end + + if !(axis[:ticks] in (nothing, false, :none, :native)) && framestyle != :none + ticks = get_ticks(sp, axis) + #pgf plot ignores ticks with angle below 90 when xmin = 90 so shift values + tick_values = ispolar(sp) && letter == :x ? [rad2deg.(ticks[1])[3:end]..., 360, 405] : ticks[1] + push!(opt, string(letter, "tick") => string("{", join(tick_values,","), "}")) + if axis[:showaxis] && axis[:scale] in (:ln, :log2, :log10) && axis[:ticks] == :auto + # wrap the power part of label with } + tick_labels = Vector{String}(undef, length(ticks[2])) + for (i, label) in enumerate(ticks[2]) + base, power = split(label, "^") + power = string("{", power, "}") + tick_labels[i] = string(base, "^", power) + end + push!(opt, string(letter, "ticklabels") => string("{\$", join(tick_labels,"\$,\$"), "\$}")) + elseif axis[:showaxis] + tick_labels = ispolar(sp) && letter == :x ? [ticks[2][3:end]..., "0", "45"] : ticks[2] + if axis[:formatter] in (:scientific, :auto) + tick_labels = string.("\$", convert_sci_unicode.(tick_labels), "\$") + tick_labels = replace.(tick_labels, Ref("×" => "\\times")) + end + push!(opt, string(letter, "ticklabels") => string("{", join(tick_labels,","), "}")) + else + push!(opt, string(letter, "ticklabels") => "{}") + end + push!(opt, string(letter, "tick align") => (axis[:tick_direction] == :out ? "outside" : "inside")) + cstr = plot_color(axis[:tickfontcolor]) + α = alpha(cstr) + push!(opt, string(letter, "ticklabel style") => PGFPlotsX.Options( + "font" => pgfx_font(axis[:tickfontsize], pgfx_thickness_scaling(sp)), + "color" => cstr, + "draw opacity" => α, + "rotate" => axis[:tickfontrotation] + ) + ) + push!(opt, string(letter, " grid style") => pgfx_linestyle(pgfx_thickness_scaling(sp) * axis[:gridlinewidth], axis[:foreground_color_grid], axis[:gridalpha], axis[:gridstyle]) + ) + end + + # framestyle + if framestyle in (:axes, :origin) + axispos = framestyle == :axes ? "left" : "middle" + if axis[:draw_arrow] + push!(opt, string("axis ", letter, " line") => axispos) + else + # the * after line disables the arrow at the axis + push!(opt, string("axis ", letter, " line*") => axispos) + end + end + + if framestyle == :zerolines + push!(opt, string("extra ", letter, " ticks") => "0") + push!(opt, string("extra ", letter, " tick labels") => "") + push!(opt, string("extra ", letter, " tick style") => PGFPlotsX.Options( + "grid" => "major", + "major grid style" => pgfx_linestyle(pgfx_thickness_scaling(sp), axis[:foreground_color_border], 1.0) + ) + ) + end + + if !axis[:showaxis] + push!(opt, "separate axis lines") + end + if !axis[:showaxis] || framestyle in (:zerolines, :grid, :none) + push!(opt, string(letter, " axis line style") => "{draw opacity = 0}") + else + push!(opt, string(letter, " axis line style") => pgfx_linestyle(pgfx_thickness_scaling(sp), axis[:foreground_color_border], 1.0) + ) + end +end # -------------------------------------------------------------------------------------- # display calls this and then _display, its called 3 times for plot(1:5) function _update_plot_object(plt::Plot{PGFPlotsXBackend}) plt.o = PGFPlotsX.GroupPlot() - local axis for sp in plt.subplots bb = bbox(sp) - axis = PGFPlotsX.@pgf PGFPlotsX.Axis( - { - xlabel = sp.attr[:xaxis][:guide], - ylabel = sp.attr[:yaxis][:guide], - height = string(height(bb)), - width = string(width(bb)), - title = sp[:title], - }, + axis_opt = PGFPlotsX.Options( + "height" => string(height(bb)), + "width" => string(width(bb)), + "title" => sp[:title], + ) + for letter in (:x, :y, :z) + if letter != :z || is3d(sp) + pgfx_axis!(axis_opt, sp, letter) + end + end + axis = PGFPlotsX.Axis( + axis_opt ) for series in series_list(sp) opt = series.plotattributes - series_plot = PGFPlotsX.@pgf PGFPlotsX.Plot( - { - color = opt[:linecolor], - mark = _pgfplotsx_markers[opt[:markershape]], - mark_options = {color = opt[:markercolor]}, - }, - PGFPlotsX.Coordinates(series[:x],series[:y]) + segments = iter_segments(series) + for (i, rng) in enumerate(segments) + series_plot = PGFPlotsX.Plot( + merge( + PGFPlotsX.Options( + "color" => opt[:linecolor] + ), + pgfx_marker(opt, i) + ), + PGFPlotsX.Coordinates(series[:x],series[:y]) ) - push!( axis, series_plot ) + push!( axis, series_plot ) + end if opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) ) end end + push!( plt.o, axis ) end - push!( plt.o, axis ) end function _show(io::IO, mime::MIME"image/svg+xml", plt::Plot{PGFPlotsXBackend}) From cbc0419c6e1a9deac1af3450586826d6234e0986 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 15 Nov 2019 08:52:56 +0100 Subject: [PATCH 111/357] legend styling --- src/backends/pgfplotsx.jl | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 455f61cc..0a1f58f6 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -413,10 +413,21 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) for sp in plt.subplots bb = bbox(sp) + legpos = sp[:legend] + if haskey(_pgfplotsx_legend_pos, legpos) + legpos = _pgfplotsx_legend_pos[legpos] + end + cstr = plot_color(sp[:background_color_legend]) + a = alpha(cstr) axis_opt = PGFPlotsX.Options( "height" => string(height(bb)), "width" => string(width(bb)), "title" => sp[:title], + "legend style" => PGFPlotsX.Options( + pgfx_linestyle(pgfx_thickness_scaling(sp), sp[:foreground_color_legend], 1.0, "solid") => nothing, + "fill" => cstr, + "font" => pgfx_font(sp[:legendfontsize], pgfx_thickness_scaling(sp)) + ) ) for letter in (:x, :y, :z) if letter != :z || is3d(sp) From 6b6d589aa7ff34ffa4130959e918e4b3d5b708ad Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 15 Nov 2019 09:42:05 +0100 Subject: [PATCH 112/357] translate pgf_add_aanotation! --- src/backends/pgfplotsx.jl | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 0a1f58f6..fd1decac 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -34,6 +34,14 @@ const _pgfplotsx_legend_pos = KW( const _pgfx_framestyles = [:box, :axes, :origin, :zerolines, :grid, :none] const _pgfx_framestyle_defaults = Dict(:semi => :box) + +# we use the anchors to define orientations for example to align left +# one needs to use the right edge as anchor +const _pgfx_annotation_halign = KW( + :center => "", + :left => "right", + :right => "left" +) ## -------------------------------------------------------------------------------------- function pgfx_framestyle(style::Symbol) if style in _pgfx_framestyles @@ -109,15 +117,18 @@ function pgfx_add_annotation!(o, x, y, val, thickness_scaling = 1) # Currently supports color and orientation cstr = val.font.color a = alpha(cstr) - #TODO: translate this - push!(o, PGFPlots.Plots.Node(val.str, # Annotation Text - x, y, - style=""" - $(get(_pgfx_annotation_halign,val.font.halign,"")), - color=$cstr, draw opacity=$(convert(Float16,a)), - rotate=$(val.font.rotation), - font=$(pgfx_font(val.font.pointsize, thickness_scaling)) - """)) + push!(o, ["\\node", + PGFPlotsX.Options( + get(_pgfx_annotation_halign,val.font.halign,"") => nothing, + "color" => cstr, + "draw opacity" => convert(Float16, a), + "rotate" => val.font.rotation, + "font" => pgfx_font(val.font.pointsize, thickness_scaling) + ), + " at ", + PGFPlotsX.Coordinate(x, y), + "{$(val.str).};" + ]) end ## -------------------------------------------------------------------------------------- # TODO: translate these if needed From 86643058b6fad8434b56e80785fa252513fd06ea Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 15 Nov 2019 13:47:04 +0100 Subject: [PATCH 113/357] apply annotations --- src/backends/pgfplotsx.jl | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index fd1decac..becb538a 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -135,7 +135,7 @@ end function pgf_series(sp::Subplot, series::Series) plotattributes = series.plotattributes st = plotattributes[:seriestype] - series_collection = PGFPlots.Plot[] + series_collection = PGFPlotsX.Plot[] # function args args = if st == :contour @@ -154,11 +154,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 = [] @@ -452,17 +452,24 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) opt = series.plotattributes segments = iter_segments(series) for (i, rng) in enumerate(segments) - series_plot = PGFPlotsX.Plot( - merge( - PGFPlotsX.Options( - "color" => opt[:linecolor] - ), - pgfx_marker(opt, i) - ), - PGFPlotsX.Coordinates(series[:x],series[:y]) - ) - push!( axis, series_plot ) + # TODO: make segmented series end + # TODO: different seriestypes, histogramms, contours, etc. + series_plot = PGFPlotsX.Plot( + merge( + PGFPlotsX.Options( + "color" => opt[:linecolor] + ), + pgfx_marker(opt, i) + ), + PGFPlotsX.Coordinates(series[:x],series[:y]) + ) + # add series annotations + anns = series[:series_annotations] + for (xi,yi,str,fnt) in EachAnn(anns, series[:x], series[:y]) + pgfx_add_annotation!(series_plot, xi, yi, PlotText(str, fnt), pgfx_thickness_scaling(series)) + end + push!( axis, series_plot ) if opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) ) From 1f566294acac3ae87ee2a2ec811a8e4a0bdc6b40 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 15 Nov 2019 15:47:36 +0100 Subject: [PATCH 114/357] basic 3D --- src/backends/pgfplotsx.jl | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index becb538a..b094a4e8 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -451,18 +451,29 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) for series in series_list(sp) opt = series.plotattributes segments = iter_segments(series) + segment_opt = PGFPlotsX.Options() for (i, rng) in enumerate(segments) - # TODO: make segmented series + segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) end # TODO: different seriestypes, histogramms, contours, etc. - series_plot = PGFPlotsX.Plot( + # TODO: colorbars + # TOOD: gradients + if is3d(series) + series_func = opt -> PGFPlotsX.Plot3(opt, + PGFPlotsX.Coordinates(series[:x],series[:y],series[:z]) + ) + else + series_func = opt -> PGFPlotsX.Plot(opt, + PGFPlotsX.Coordinates(series[:x],series[:y]) + ) + end + series_plot = series_func( merge( PGFPlotsX.Options( "color" => opt[:linecolor] ), - pgfx_marker(opt, i) + segment_opt ), - PGFPlotsX.Coordinates(series[:x],series[:y]) ) # add series annotations anns = series[:series_annotations] From d8c48f1a8501d3fde652d588f6b387ddb77cb866 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 15 Nov 2019 16:13:54 +0100 Subject: [PATCH 115/357] translate pgf_fillrange_series --- src/backends/pgfplotsx.jl | 62 ++++++++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 21 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index b094a4e8..d7e8c3ea 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -32,6 +32,15 @@ const _pgfplotsx_legend_pos = KW( :outertopright => "outer north east", ) +const _pgfx_series_extrastyle = KW( + :steppre => "const plot mark right", + :stepmid => "const plot mark mid", + :steppost => "const plot", + :sticks => "ycomb", + :ysticks => "ycomb", + :xsticks => "xcomb", +) + const _pgfx_framestyles = [:box, :axes, :origin, :zerolines, :grid, :none] const _pgfx_framestyle_defaults = Dict(:semi => :box) @@ -64,7 +73,7 @@ function pgfx_fillstyle(plotattributes, i = 1) if fa !== nothing a = fa end - fill => cstr, fill_opacity => a + PGFPlotsX.Options("fill" => cstr, "fill opacity" => a) end function pgfx_linestyle(linewidth::Real, color, α = 1, linestyle = "solid") @@ -232,21 +241,18 @@ function pgf_series(sp::Subplot, series::Series) series_collection end -function pgf_fillrange_series(series, i, fillrange, args...) +function pgfx_fillrange_series!(opt, series, i, fillrange, args...) st = series[:seriestype] - style = [] - kw = KW() - push!(style, "line width = 0") - push!(style, "draw opacity = 0") - push!(style, pgf_fillstyle(series, i)) - push!(style, pgf_marker(series, i)) - push!(style, "forget plot") - if haskey(_pgf_series_extrastyle, st) - push!(style, _pgf_series_extrastyle[st]) + push!(opt, "line width" => 0) + push!(opt, "draw opacity" => 0) + push!(opt, pgfx_fillopt(series, i)) + push!(opt, pgfx_marker(series, i)) + push!(opt, "forget plot" => nothing) + if haskey(_pgfx_series_extraopt, st) + push!(opt, _pgfx_series_extrastyle[st] => nothing) end - kw[:style] = join(style, ',') - func = is3d(series) ? PGFPlots.Linear3 : PGFPlots.Linear - return func(pgf_fillrange_args(fillrange, args...)...; kw...) + # TODO: what are those fillrange_args about? + # return func(pgf_fillrange_args(fillrange, args...)...; kw...) end function pgf_fillrange_args(fillrange, x, y) @@ -450,14 +456,33 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) ) for series in series_list(sp) opt = series.plotattributes + st = series[:seriestype] + series_opt = PGFPlotsX.Options( + "color" => opt[:linecolor] + ) segments = iter_segments(series) segment_opt = PGFPlotsX.Options() for (i, rng) in enumerate(segments) + segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) + if st == :shape + segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) + end + # TODO: is this necessary? + # seg_args = (arg[rng] for arg in args) + # TODO: translate this + # # add fillrange + # if series[:fillrange] !== nothing && st != :shape + # push!(series_collection, pgf_fillrange_series(series, i, _cycle(series[:fillrange], rng), seg_args...)) + # end + end + #include additional style + if haskey(_pgfx_series_extrastyle, st) + push!(series_opt, _pgfx_series_extrastyle[st] => nothing) end # TODO: different seriestypes, histogramms, contours, etc. # TODO: colorbars - # TOOD: gradients + # TODO: gradients if is3d(series) series_func = opt -> PGFPlotsX.Plot3(opt, PGFPlotsX.Coordinates(series[:x],series[:y],series[:z]) @@ -468,12 +493,7 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) ) end series_plot = series_func( - merge( - PGFPlotsX.Options( - "color" => opt[:linecolor] - ), - segment_opt - ), + merge(series_opt, segment_opt), ) # add series annotations anns = series[:series_annotations] From 2bf3ddf45b062de7fe164d3a638b63729d58f894 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 15 Nov 2019 16:41:47 +0100 Subject: [PATCH 116/357] add guard against overexecution --- src/backends/pgfplotsx.jl | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index becb538a..228b3ea3 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -419,7 +419,13 @@ function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) end # -------------------------------------------------------------------------------------- # display calls this and then _display, its called 3 times for plot(1:5) +let n_calls = 0 +function _series_updated(plt::Plot{PGFPlotsXBackend}, series::Series) + n_calls = 0 +end + function _update_plot_object(plt::Plot{PGFPlotsXBackend}) +if n_calls === 0 plt.o = PGFPlotsX.GroupPlot() for sp in plt.subplots @@ -478,6 +484,8 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) push!( plt.o, axis ) end end +n_calls += 1 +end function _show(io::IO, mime::MIME"image/svg+xml", plt::Plot{PGFPlotsXBackend}) show(io, mime, plt.o) From 2c78f1ff7b540a4caa0b38fdaa038ff2227ed3fa Mon Sep 17 00:00:00 2001 From: daschw Date: Sat, 16 Nov 2019 10:03:04 +0100 Subject: [PATCH 117/357] pass correct xlims to adapted_grid --- src/series.jl | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/series.jl b/src/series.jl index 61da260f..9d63aaeb 100644 --- a/src/series.jl +++ b/src/series.jl @@ -379,12 +379,16 @@ end @recipe function f(f::FuncOrFuncs{F}) where F<:Function plt = plotattributes[:plot_object] - xmin, xmax = try - axis_limits(plt[1], :x) - catch - xinv = invscalefunc(get(plotattributes, :xscale, :identity)) - xm = tryrange(f, xinv.([-5,-1,0,0.01])) - xm, tryrange(f, filter(x->x>xm, xinv.([5,1,0.99, 0, -0.01]))) + xmin, xmax = if haskey(plotattributes, :xlims) + plotattributes[:xlims] + else + try + axis_limits(plt[1], :x) + catch + xinv = invscalefunc(get(plotattributes, :xscale, :identity)) + xm = tryrange(f, xinv.([-5,-1,0,0.01])) + xm, tryrange(f, filter(x->x>xm, xinv.([5,1,0.99, 0, -0.01]))) + end end f, xmin, xmax From cd55218a2c5419a4b189d75506b79a6f2fe65890 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 18 Nov 2019 11:51:03 +0100 Subject: [PATCH 118/357] translated pgf_fillrange_series --- src/backends/pgfplotsx.jl | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index f6c539f5..9f8678c8 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -241,8 +241,9 @@ function pgf_series(sp::Subplot, series::Series) series_collection end -function pgfx_fillrange_series!(opt, series, i, fillrange, args...) +function pgfx_fillrange_series(series, i, fillrange, args...) st = series[:seriestype] + opt = PGFPlotsX.Options() push!(opt, "line width" => 0) push!(opt, "draw opacity" => 0) push!(opt, pgfx_fillopt(series, i)) @@ -251,18 +252,18 @@ function pgfx_fillrange_series!(opt, series, i, fillrange, args...) if haskey(_pgfx_series_extraopt, st) push!(opt, _pgfx_series_extrastyle[st] => nothing) end - # TODO: what are those fillrange_args about? - # return func(pgf_fillrange_args(fillrange, args...)...; kw...) + func = is3d(series) ? PGFPlotsX.Plot3 : PGFPlotsX.Plot + return func(opt, pgfx_fillrange_args(fillrange, args...)...) end -function pgf_fillrange_args(fillrange, x, y) +function pgfx_fillrange_args(fillrange, x, y) n = length(x) x_fill = [x; x[n:-1:1]; x[1]] y_fill = [y; _cycle(fillrange, n:-1:1); y[1]] return x_fill, y_fill end -function pgf_fillrange_args(fillrange, x, y, z) +function pgfx_fillrange_args(fillrange, x, y, z) n = length(x) x_fill = [x; x[n:-1:1]; x[1]] y_fill = [y; y[n:-1:1]; x[1]] From 4a4f9dff6aa3858a12c6f7751d637d9cfcd78e68 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Mon, 18 Nov 2019 16:01:40 +0100 Subject: [PATCH 119/357] Revise.track conditionally loaded backends --- src/init.jl | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/src/init.jl b/src/init.jl index bffc99f2..2e1a3404 100644 --- a/src/init.jl +++ b/src/init.jl @@ -28,12 +28,41 @@ function __init__() insert!(Base.Multimedia.displays, findlast(x -> x isa REPL.REPLDisplay, Base.Multimedia.displays) + 1, PlotsDisplay()) end) - @require HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" include(joinpath(@__DIR__, "backends", "hdf5.jl")) - @require InspectDR = "d0351b0e-4b05-5898-87b3-e2a8edfddd1d" include(joinpath(@__DIR__, "backends", "inspectdr.jl")) - @require PGFPlots = "3b7a836e-365b-5785-a47d-02c71176b4aa" include(joinpath(@__DIR__, "backends", "pgfplots.jl")) - @require PlotlyJS = "f0f68f2c-4968-5e81-91da-67840de0976a" include(joinpath(@__DIR__, "backends", "plotlyjs.jl")) - @require PyPlot = "d330b81b-6aea-500a-939a-2ce795aea3ee" include(joinpath(@__DIR__, "backends", "pyplot.jl")) - @require UnicodePlots = "b8865327-cd53-5732-bb35-84acbb429228" include(joinpath(@__DIR__, "backends", "unicodeplots.jl")) + @require HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" begin + fn = joinpath(@__DIR__, "backends", "hdf5.jl") + include(fn) + @require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn) + end + + @require InspectDR = "d0351b0e-4b05-5898-87b3-e2a8edfddd1d" begin + fn = joinpath(@__DIR__, "backends", "inspectdr.jl") + include(fn) + @require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn) + end + + @require PGFPlots = "3b7a836e-365b-5785-a47d-02c71176b4aa" begin + fn = joinpath(@__DIR__, "backends", "pgfplots.jl") + include(fn) + @require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn) + end + + @require PlotlyJS = "f0f68f2c-4968-5e81-91da-67840de0976a" begin + fn = joinpath(@__DIR__, "backends", "plotlyjs.jl") + include(fn) + @require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn) + end + + @require PyPlot = "d330b81b-6aea-500a-939a-2ce795aea3ee" begin + fn = joinpath(@__DIR__, "backends", "pyplot.jl") + include(fn) + @require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn) + end + + @require UnicodePlots = "b8865327-cd53-5732-bb35-84acbb429228" begin + fn = joinpath(@__DIR__, "backends", "unicodeplots.jl") + include(fn) + @require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn) + end @require IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" begin if IJulia.inited From c39613ddd830c6edc7550f6d297c086520caacda Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 18 Nov 2019 16:13:56 +0100 Subject: [PATCH 120/357] translation of pgf_colormap --- src/backends/pgfplotsx.jl | 83 ++++++++++++++++++++++++++++++--------- 1 file changed, 65 insertions(+), 18 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 9f8678c8..0093e35a 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -52,6 +52,14 @@ const _pgfx_annotation_halign = KW( :right => "left" ) ## -------------------------------------------------------------------------------------- +# Generates a colormap for pgfplots based on a ColorGradient +# TODO: maybe obsolete +function pgfx_colormap(grad::ColorGradient) + join(map(grad.colors) do c + @sprintf("rgb=(%.8f,%.8f,%.8f)", red(c), green(c),blue(c)) + end,", ") +end + function pgfx_framestyle(style::Symbol) if style in _pgfx_framestyles return style @@ -426,13 +434,11 @@ function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) end # -------------------------------------------------------------------------------------- # display calls this and then _display, its called 3 times for plot(1:5) -let n_calls = 0 function _series_updated(plt::Plot{PGFPlotsXBackend}, series::Series) - n_calls = 0 + # TODO: don't rebuild plots so often end function _update_plot_object(plt::Plot{PGFPlotsXBackend}) -if n_calls === 0 plt.o = PGFPlotsX.GroupPlot() for sp in plt.subplots @@ -458,12 +464,60 @@ if n_calls === 0 pgfx_axis!(axis_opt, sp, letter) 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 + push!(axis_opt, + "colormap" => "{plots}{$(pgfx_colormap(series.plotattributes[col]))}") + + # TODO: is this needed? + # if sp[:colorbar] == :none + # kw[:colorbar] = "false" + # else + # kw[:colorbar] = "true" + # 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] + ) + ) axis = PGFPlotsX.Axis( axis_opt ) for series in series_list(sp) opt = series.plotattributes st = series[:seriestype] + # function args + args = if st == :contour + opt[:z].surf, opt[:x], opt[:y] + elseif is3d(st) + opt[:x], opt[:y], opt[:z] + elseif st == :straightline + straightline_data(series) + elseif st == :shape + shape_data(series) + elseif ispolar(sp) + theta, r = opt[:x], opt[:y] + rad2deg.(theta), r + else + opt[:x], opt[:y] + end series_opt = PGFPlotsX.Options( "color" => opt[:linecolor] ) @@ -475,13 +529,11 @@ if n_calls === 0 if st == :shape segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) end - # TODO: is this necessary? - # seg_args = (arg[rng] for arg in args) - # TODO: translate this - # # add fillrange - # if series[:fillrange] !== nothing && st != :shape - # push!(series_collection, pgf_fillrange_series(series, i, _cycle(series[:fillrange], rng), seg_args...)) - # end + seg_args = (arg[rng] for arg in args) + # add fillrange + if series[:fillrange] !== nothing && st != :shape + push!(axis, pgfx_fillrange_series(series, i, _cycle(series[:fillrange], rng), seg_args...)) + end end #include additional style if haskey(_pgfx_series_extrastyle, st) @@ -491,16 +543,13 @@ if n_calls === 0 # TODO: colorbars # TODO: gradients if is3d(series) - series_func = opt -> PGFPlotsX.Plot3(opt, - PGFPlotsX.Coordinates(series[:x],series[:y],series[:z]) - ) + series_func = PGFPlotsX.Plot3 else - series_func = opt -> PGFPlotsX.Plot(opt, - PGFPlotsX.Coordinates(series[:x],series[:y]) - ) + series_func = PGFPlotsX.Plot end series_plot = series_func( merge(series_opt, segment_opt), + PGFPlotsX.Coordinates(args...) ) # add series annotations anns = series[:series_annotations] @@ -516,8 +565,6 @@ if n_calls === 0 push!( plt.o, axis ) end end -n_calls += 1 -end function _show(io::IO, mime::MIME"image/svg+xml", plt::Plot{PGFPlotsXBackend}) show(io, mime, plt.o) From 1e2ea1614c5d5fc79c66e5a68f87cc38a12214bb Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 18 Nov 2019 17:16:27 +0100 Subject: [PATCH 121/357] add tests --- Project.toml | 3 ++- src/backends/pgfplotsx.jl | 4 ++++ test/runtests.jl | 2 ++ test/test_pgfplotsx.jl | 13 +++++++++++++ 4 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 test/test_pgfplotsx.jl diff --git a/Project.toml b/Project.toml index 087277df..e8ffda4a 100644 --- a/Project.toml +++ b/Project.toml @@ -47,6 +47,7 @@ ImageMagick = "6218d12a-5da1-5696-b52f-db25d2ecc6d1" Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0" LaTeXStrings = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" LibGit2 = "76f85450-5226-5b5a-8eaa-529ad045b433" +PGFPlotsX = "8314cec4-20b6-5062-9cdb-752b83310925" RDatasets = "ce6b1742-4840-55fa-b093-852dadbb1d8b" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" StatsPlots = "f3b207a7-027a-5e70-b257-86293d7955fd" @@ -55,4 +56,4 @@ UnicodePlots = "b8865327-cd53-5732-bb35-84acbb429228" VisualRegressionTests = "34922c18-7c2a-561c-bac1-01e79b2c4c92" [targets] -test = ["FileIO", "GeometryTypes", "Gtk", "ImageMagick", "Images", "LaTeXStrings", "LibGit2", "Random", "RDatasets", "StatsPlots", "Test", "UnicodePlots", "VisualRegressionTests"] +test = ["FileIO", "GeometryTypes", "Gtk", "ImageMagick", "Images", "LaTeXStrings", "LibGit2", "PGFPlotsX", "Random", "RDatasets", "StatsPlots", "Test", "UnicodePlots", "VisualRegressionTests"] diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 0093e35a..2b7ea449 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -567,18 +567,22 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) end function _show(io::IO, mime::MIME"image/svg+xml", plt::Plot{PGFPlotsXBackend}) + _update_plot_object(plt) show(io, mime, plt.o) end function _show(io::IO, mime::MIME"application/pdf", plt::Plot{PGFPlotsXBackend}) + _update_plot_object(plt) show(io, mime, plt.o) end function _show(io::IO, mime::MIME"image/png", plt::Plot{PGFPlotsXBackend}) + _update_plot_object(plt) show(io, mime, plt.o) end function _show(io::IO, mime::MIME"application/x-tex", plt::Plot{PGFPlotsXBackend}) + _update_plot_object(plt) PGFPlotsX.print_tex(plt.o) end diff --git a/test/runtests.jl b/test/runtests.jl index 55c7e963..16ad485f 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -8,6 +8,8 @@ using Gtk using LibGit2 using GeometryTypes +include("test_pgfplotsx.jl") + reference_dir(args...) = joinpath(homedir(), ".julia", "dev", "PlotReferenceImages", args...) function reference_file(backend, i, version) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl new file mode 100644 index 00000000..a46a0a35 --- /dev/null +++ b/test/test_pgfplotsx.jl @@ -0,0 +1,13 @@ +using Plots, Test +pgfplotsx() + +function create_plot( args...; kwargs... ) + pgfx_plot = plot(args..., kwargs...) + return pgfx_plot, repr("application/x-tex", pgfx_plot) +end + +@testset "PGFPlotsX" begin + pgfx_plot, pgfx_tex = create_plot(1:5) + + @test pgfx_plot.o isa PGFPlotsX.GroupPlot +end # testset From b6bd69055bf6f0b31758ede6da5c867183dcae2f Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 18 Nov 2019 19:05:49 +0100 Subject: [PATCH 122/357] tests for 3D colorbar --- src/backends/pgfplotsx.jl | 13 +++++++++++-- test/test_pgfplotsx.jl | 23 +++++++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 2b7ea449..c38f11a3 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -57,7 +57,7 @@ const _pgfx_annotation_halign = KW( function pgfx_colormap(grad::ColorGradient) join(map(grad.colors) do c @sprintf("rgb=(%.8f,%.8f,%.8f)", red(c), green(c),blue(c)) - end,", ") + end,"\n") end function pgfx_framestyle(style::Symbol) @@ -441,6 +441,8 @@ end function _update_plot_object(plt::Plot{PGFPlotsXBackend}) plt.o = PGFPlotsX.GroupPlot() + pushed_colormap = false + empty!(PGFPlotsX.CUSTOM_PREAMBLE) for sp in plt.subplots bb = bbox(sp) legpos = sp[:legend] @@ -477,8 +479,15 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) for series in series_list(sp) for col in (:markercolor, :fillcolor, :linecolor) if typeof(series.plotattributes[col]) == ColorGradient + # TODO: fix this + # pushed_colormap || push!(PGFPlotsX.CUSTOM_PREAMBLE, """\\pgfplotsset{ + # colormap={plots}{$(pgfx_colormap(series.plotattributes[col]))}, + # }""") + pushed_colormap = true push!(axis_opt, - "colormap" => "{plots}{$(pgfx_colormap(series.plotattributes[col]))}") + # "colormap" => nothing, + # "colormap name" => "plots", + ) # TODO: is this needed? # if sp[:colorbar] == :none diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index a46a0a35..a636fd91 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -2,12 +2,31 @@ using Plots, Test pgfplotsx() function create_plot( args...; kwargs... ) - pgfx_plot = plot(args..., kwargs...) + pgfx_plot = plot(args...; kwargs...) + return pgfx_plot, repr("application/x-tex", pgfx_plot) +end + +function create_plot!( args...; kwargs... ) + pgfx_plot = plot!(args...; kwargs...) return pgfx_plot, repr("application/x-tex", pgfx_plot) end @testset "PGFPlotsX" begin pgfx_plot, pgfx_tex = create_plot(1:5) - + @test pgfx_plot.o isa PGFPlotsX.GroupPlot + @testset "3D docs example" begin + n = 100 + ts = range(0, stop=8π, length=n) + x = ts .* map(cos, ts) + y = (0.1ts) .* map(sin, ts) + z = 1:n + pl = plot(x, y, z, zcolor=reverse(z), m=(10, 0.8, :blues, Plots.stroke(0)), leg=false, cbar=true, w=5) + @show PGFPlotsX.CUSTOM_PREAMBLE + @show PGFPlotsX.CUSTOM_PREAMBLE_PATH + pgfx_plot, pgfx_tex = create_plot!(pl, zeros(n), zeros(n), 1:n, w=10) + if @test_nowarn(haskey(pgfx_plot.o.contents[1].options.dict, "colormap") == true) + @test pgfx_plot.o.contents[1]["colormap"] === nothing + end + end # testset end # testset From 4486620918f66549a9ed01353268ae96a12f3fef Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 11:30:34 +0100 Subject: [PATCH 123/357] title styling --- src/backends/pgfplotsx.jl | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index c38f11a3..c3e13709 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -56,7 +56,7 @@ const _pgfx_annotation_halign = KW( # TODO: maybe obsolete function pgfx_colormap(grad::ColorGradient) join(map(grad.colors) do c - @sprintf("rgb=(%.8f,%.8f,%.8f)", red(c), green(c),blue(c)) + @sprintf("rgb=(%.8f,%.8f,%.8f)", red(c), green(c), blue(c)) end,"\n") end @@ -451,14 +451,26 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) end cstr = plot_color(sp[:background_color_legend]) a = alpha(cstr) + title_cstr = plot_color(sp[:titlefontcolor]) + title_a = alpha(cstr) + # TODO: aspect ratio, legend position axis_opt = PGFPlotsX.Options( "height" => string(height(bb)), "width" => string(width(bb)), "title" => sp[:title], + "title style" => PGFPlotsX.Options( + "font" => pgfx_font(sp[:titlefontsize], pgfx_thickness_scaling(sp)), + "color" => title_cstr, + "draw opacity" => title_a, + "rotate" => sp[:titlefontrotation] + ), "legend style" => PGFPlotsX.Options( - pgfx_linestyle(pgfx_thickness_scaling(sp), sp[:foreground_color_legend], 1.0, "solid") => nothing, - "fill" => cstr, - "font" => pgfx_font(sp[:legendfontsize], pgfx_thickness_scaling(sp)) + pgfx_linestyle(pgfx_thickness_scaling(sp), sp[:foreground_color_legend], 1.0, "solid") => nothing, + "fill" => cstr, + "font" => pgfx_font(sp[:legendfontsize], pgfx_thickness_scaling(sp)) + ), + "axis background/.style" => PGFPlotsX.Options( + "fill" => sp[:background_color_inside] ) ) for letter in (:x, :y, :z) From 5e0d42898cc8c277755ecf7fe0c7937cd82efca0 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 11:34:21 +0100 Subject: [PATCH 124/357] claim everything --- src/backends.jl | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/backends.jl b/src/backends.jl index f9b7ce12..dddeea47 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -711,7 +711,9 @@ const _pgfplotsx_seriestype = [ :contour, :path3d, :scatter3d, :surface, :wireframe, :volume, :shape ] +const _pgfplotsx_seriestype = [:path, :path3d, :scatter, :steppre, :stepmid, :steppost, :histogram2d, :ysticks, :xsticks, :contour, :shape, :straightline,] const _pgfplotsx_style = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] -const _pgfplotsx_marker = _allMarkers -const _pgfplotsx_scale = [:identity, :log10] -is_marker_supported(::PGFPlotsXBackend, shape::Shape) = false +const _pgfplotsx_marker = vcat(_allMarkers, Shape) + # [:none, :auto, :circle, :rect, :diamond, :utriangle, :dtriangle, :cross, :xcross, :star5, :pentagon, :hline, :vline] # +const _pgfplotsx_scale = [:identity, :ln, :log2, :log10] +is_marker_supported(::PGFPlotsXBackend, shape::Shape) = true From 64791017f85fce37a5c39096b931e358530967d9 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 11:35:35 +0100 Subject: [PATCH 125/357] adjust --- src/backends.jl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/backends.jl b/src/backends.jl index dddeea47..89fa83eb 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -705,12 +705,12 @@ const _pgfplotsx_attr = merge_with_base_supported([ :camera, :contour_labels, ]) -const _pgfplotsx_seriestype = [ - :path, :scatter, :straightline, - :heatmap, :pie, :image, - :contour, :path3d, :scatter3d, :surface, :wireframe, :volume, - :shape -] +# const _pgfplotsx_seriestype = [ +# :path, :scatter, :straightline, +# :heatmap, :pie, :image, +# :contour, :path3d, :scatter3d, :surface, :wireframe, :volume, +# :shape +# ] const _pgfplotsx_seriestype = [:path, :path3d, :scatter, :steppre, :stepmid, :steppost, :histogram2d, :ysticks, :xsticks, :contour, :shape, :straightline,] const _pgfplotsx_style = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] const _pgfplotsx_marker = vcat(_allMarkers, Shape) From 1819e3dd9966822180e8dea7a677d0222017c6c4 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 11:58:57 +0100 Subject: [PATCH 126/357] fix colorbar --- src/backends/pgfplotsx.jl | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index c3e13709..82a0bded 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -492,14 +492,16 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) for col in (:markercolor, :fillcolor, :linecolor) if typeof(series.plotattributes[col]) == ColorGradient # TODO: fix this - # pushed_colormap || push!(PGFPlotsX.CUSTOM_PREAMBLE, """\\pgfplotsset{ - # colormap={plots}{$(pgfx_colormap(series.plotattributes[col]))}, - # }""") - pushed_colormap = true - push!(axis_opt, - # "colormap" => nothing, - # "colormap name" => "plots", - ) + if !pushed_colormap + push!(PGFPlotsX.CUSTOM_PREAMBLE, """\\pgfplotsset{ + colormap={plots}{$(pgfx_colormap(series.plotattributes[col]))}, + }""") + pushed_colormap = true + push!(axis_opt, + "colorbar" => nothing, + "colormap name" => "plots", + ) + end # TODO: is this needed? # if sp[:colorbar] == :none From 3f70fdb3aaebe8053bdfc15c028fe469822dcd8e Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 12:05:43 +0100 Subject: [PATCH 127/357] correct test --- test/test_pgfplotsx.jl | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index a636fd91..4ee29dbd 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -22,11 +22,9 @@ end y = (0.1ts) .* map(sin, ts) z = 1:n pl = plot(x, y, z, zcolor=reverse(z), m=(10, 0.8, :blues, Plots.stroke(0)), leg=false, cbar=true, w=5) - @show PGFPlotsX.CUSTOM_PREAMBLE - @show PGFPlotsX.CUSTOM_PREAMBLE_PATH pgfx_plot, pgfx_tex = create_plot!(pl, zeros(n), zeros(n), 1:n, w=10) if @test_nowarn(haskey(pgfx_plot.o.contents[1].options.dict, "colormap") == true) - @test pgfx_plot.o.contents[1]["colormap"] === nothing + @test pgfx_plot.o.contents[1]["colorbar"] === nothing end end # testset end # testset From 2d100d826172ee03743b8007aa4c1b27d9780619 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 12:08:30 +0100 Subject: [PATCH 128/357] legend position --- src/backends/pgfplotsx.jl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 82a0bded..8fd07e4f 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -453,7 +453,7 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) a = alpha(cstr) title_cstr = plot_color(sp[:titlefontcolor]) title_a = alpha(cstr) - # TODO: aspect ratio, legend position + # TODO: aspect ratio axis_opt = PGFPlotsX.Options( "height" => string(height(bb)), "width" => string(width(bb)), @@ -464,6 +464,7 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) "draw opacity" => title_a, "rotate" => sp[:titlefontrotation] ), + "legend pos" => _pgfplotsx_legend_pos[sp[:legend]], "legend style" => PGFPlotsX.Options( pgfx_linestyle(pgfx_thickness_scaling(sp), sp[:foreground_color_legend], 1.0, "solid") => nothing, "fill" => cstr, From 1a751c7baec0640ba56cc9f2cac4ba7da4e4d8b3 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 14:47:54 +0100 Subject: [PATCH 129/357] reproduce 3D docs plot --- src/backends/pgfplotsx.jl | 23 +++++++++-------------- test/test_pgfplotsx.jl | 2 +- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 8fd07e4f..422e1c27 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,3 +1,5 @@ +PGFPlotsX.print_tex(io::IO, data::Symbol) = PGFPlotsX.print_tex(io, string(data)) + const _pgfplotsx_linestyles = KW( :solid => "solid", :dash => "dashed", @@ -445,10 +447,6 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) empty!(PGFPlotsX.CUSTOM_PREAMBLE) for sp in plt.subplots bb = bbox(sp) - legpos = sp[:legend] - if haskey(_pgfplotsx_legend_pos, legpos) - legpos = _pgfplotsx_legend_pos[legpos] - end cstr = plot_color(sp[:background_color_legend]) a = alpha(cstr) title_cstr = plot_color(sp[:titlefontcolor]) @@ -464,7 +462,7 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) "draw opacity" => title_a, "rotate" => sp[:titlefontrotation] ), - "legend pos" => _pgfplotsx_legend_pos[sp[:legend]], + "legend pos" => get(_pgfplotsx_legend_pos, sp[:legend], "outer north east"), "legend style" => PGFPlotsX.Options( pgfx_linestyle(pgfx_thickness_scaling(sp), sp[:foreground_color_legend], 1.0, "solid") => nothing, "fill" => cstr, @@ -492,7 +490,6 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) for series in series_list(sp) for col in (:markercolor, :fillcolor, :linecolor) if typeof(series.plotattributes[col]) == ColorGradient - # TODO: fix this if !pushed_colormap push!(PGFPlotsX.CUSTOM_PREAMBLE, """\\pgfplotsset{ colormap={plots}{$(pgfx_colormap(series.plotattributes[col]))}, @@ -504,12 +501,6 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) ) end - # TODO: is this needed? - # if sp[:colorbar] == :none - # kw[:colorbar] = "false" - # else - # kw[:colorbar] = "true" - # end # goto is needed to break out of col and series for @goto colorbar_end end @@ -543,8 +534,12 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) opt[:x], opt[:y] end series_opt = PGFPlotsX.Options( - "color" => opt[:linecolor] + "color" => opt[:linecolor], + "scatter" => nothing, ) + if opt[:marker_z] !== nothing + push!(series_opt, "point meta" => "explicit") + end segments = iter_segments(series) segment_opt = PGFPlotsX.Options() for (i, rng) in enumerate(segments) @@ -573,7 +568,7 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) end series_plot = series_func( merge(series_opt, segment_opt), - PGFPlotsX.Coordinates(args...) + PGFPlotsX.Coordinates(args..., meta = opt[:marker_z]) ) # add series annotations anns = series[:series_annotations] diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 4ee29dbd..12e3ae0e 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -23,7 +23,7 @@ end z = 1:n pl = plot(x, y, z, zcolor=reverse(z), m=(10, 0.8, :blues, Plots.stroke(0)), leg=false, cbar=true, w=5) pgfx_plot, pgfx_tex = create_plot!(pl, zeros(n), zeros(n), 1:n, w=10) - if @test_nowarn(haskey(pgfx_plot.o.contents[1].options.dict, "colormap") == true) + if @test_nowarn(haskey(pgfx_plot.o.contents[1].options.dict, "colorbar") == true) @test pgfx_plot.o.contents[1]["colorbar"] === nothing end end # testset From b6da96fb78d36d11c59d4d6bd9389900bc5e595b Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 14:58:03 +0100 Subject: [PATCH 130/357] add area legend for shapes --- src/backends/pgfplotsx.jl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 422e1c27..9b6dbbd5 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -537,6 +537,9 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) "color" => opt[:linecolor], "scatter" => nothing, ) + if st == :shape + push!(series_opt, "area legend" => nothing) + end if opt[:marker_z] !== nothing push!(series_opt, "point meta" => "explicit") end From fb418c87aca4901cb4c2b3bb45d702a96bc2564b Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 15:06:34 +0100 Subject: [PATCH 131/357] fix pgfx_fillrange_series --- src/backends/pgfplotsx.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 9b6dbbd5..46e38136 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -256,14 +256,14 @@ function pgfx_fillrange_series(series, i, fillrange, args...) opt = PGFPlotsX.Options() push!(opt, "line width" => 0) push!(opt, "draw opacity" => 0) - push!(opt, pgfx_fillopt(series, i)) - push!(opt, pgfx_marker(series, i)) + opt = merge(opt, pgfx_fillstyle(series, i)) + opt = merge(opt, pgfx_marker(series, i)) push!(opt, "forget plot" => nothing) - if haskey(_pgfx_series_extraopt, st) + if haskey(_pgfx_series_extrastyle, st) push!(opt, _pgfx_series_extrastyle[st] => nothing) end func = is3d(series) ? PGFPlotsX.Plot3 : PGFPlotsX.Plot - return func(opt, pgfx_fillrange_args(fillrange, args...)...) + return func(opt, PGFPlotsX.Coordinates(pgfx_fillrange_args(fillrange, args...)...)) end function pgfx_fillrange_args(fillrange, x, y) From c0fc671a83ece82f7c95b0ce0c199a74a1faf9fc Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 15:31:36 +0100 Subject: [PATCH 132/357] status quo --- src/backends/pgfplotsx.jl | 5 ++++- test/test_pgfplotsx.jl | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 46e38136..1308d243 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -535,13 +535,13 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) end series_opt = PGFPlotsX.Options( "color" => opt[:linecolor], - "scatter" => nothing, ) if st == :shape push!(series_opt, "area legend" => nothing) end if opt[:marker_z] !== nothing push!(series_opt, "point meta" => "explicit") + push!(series_opt, "scatter" => nothing) end segments = iter_segments(series) segment_opt = PGFPlotsX.Options() @@ -569,6 +569,9 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) else series_func = PGFPlotsX.Plot end + if st == :scatter + push!(series_opt, "only marks" => nothing) + end series_plot = series_func( merge(series_opt, segment_opt), PGFPlotsX.Coordinates(args..., meta = opt[:marker_z]) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 12e3ae0e..47f76ccf 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -27,4 +27,39 @@ end @test pgfx_plot.o.contents[1]["colorbar"] === nothing end end # testset + @testset "Color docs example" begin + y = rand(100) + plot(0:10:100, rand(11, 4), lab="lines", w=3, palette=:grays, fill=0, α=0.6) + scatter!(y, zcolor=abs.(y .- 0.5), m=(:heat, 0.8, Plots.stroke(1, :green)), ms=10 * abs.(y .- 0.5) .+ 4, lab="grad") + # TODO: marker size does not adjust + # TODO: marker stroke is incorrect + # TODO: fill legends + # TODO: adjust colorbar limits to data + end # testset + @testset "Plot in pieces" begin + plot(rand(100) / 3, reg=true, fill=(0, :green)) + scatter!(rand(100), markersize=6, c=:orange) + # TODO: legends should be different + end # testset + @testset "Marker types" begin + markers = filter((m->begin + m in Plots.supported_markers() + end), Plots._shape_keys) + markers = reshape(markers, 1, length(markers)) + n = length(markers) + x = (range(0, stop=10, length=n + 2))[2:end - 1] + y = repeat(reshape(reverse(x), 1, :), n, 1) + scatter(x, y, m=(8, :auto), lab=map(string, markers), bg=:linen, xlim=(0, 10), ylim=(0, 10)) + #TODO: fix markers that show up as circles + end # testset + @testset "Layout" begin + plot(Plots.fakedata(100, 10), layout=4, palette=[:grays :blues :heat :lightrainbow], bg_inside=[:orange :pink :darkblue :black]) + # TODO: add layouting + end # testset + @testset "Polar plots" begin + Θ = range(0, stop=1.5π, length=100) + r = abs.(0.1 * randn(100) + sin.(3Θ)) + plot(Θ, r, proj=:polar, m=2) + # TODO: handle polar plots + end # testset end # testset From ea790cc7c5071aaee3da2e58c82964c3e22f6b6f Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Tue, 19 Nov 2019 15:49:26 +0100 Subject: [PATCH 133/357] allow symbols in GR legendfontcolor --- src/backends/gr.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index e7ab5209..f64eab57 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -1326,10 +1326,10 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) nx, ny = length(series[:x]), length(series[:y]) z_normalized = map(x -> GR.jlgr.normalize_color(x, zmin, zmax), z) colors = Int32[round(Int32, 1000 + _i * 255) for _i in z_normalized] - xmin, xmax, ymin, ymax = xy_lims + xmin, xmax, ymin, ymax = xy_lims rmax = data_lims[4] GR.setwindow(-rmax, rmax, -rmax, rmax) - if ymin > 0 + if ymin > 0 @warn "'ymin[1] > 0' (rmin) is not yet supported." end if series[:y][end] != ny @@ -1337,7 +1337,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) end # GR.polarcellarray(0, 0, phimin, phimax, ymin, ymax, nx, ny, colors) GR.polarcellarray(0, 0, phimin, phimax, 0, ymax, nx, ny, colors) - # Right now only the maximum value of y (r) is taken into account. + # Right now only the maximum value of y (r) is taken into account. # This is certainly not perfect but nonuniform polar array is not yet supported in GR.jl end @@ -1526,7 +1526,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) lab = series[:label] GR.settextalign(GR.TEXT_HALIGN_LEFT, GR.TEXT_VALIGN_HALF) - gr_set_textcolor(sp[:legendfontcolor]) + gr_set_textcolor(plot_color(sp[:legendfontcolor])) gr_text(xpos, ypos, string(lab)) ypos -= dy end From 4902716a44c07902ae5a688403094c3f2e92eb72 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 16:30:53 +0100 Subject: [PATCH 134/357] use TikzDocument and its preamble --- src/backends/pgfplotsx.jl | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 1308d243..77d75e92 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -436,15 +436,20 @@ function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) end # -------------------------------------------------------------------------------------- # display calls this and then _display, its called 3 times for plot(1:5) -function _series_updated(plt::Plot{PGFPlotsXBackend}, series::Series) - # TODO: don't rebuild plots so often +function _create_backend_figure(plt::Plot{PGFPlotsXBackend}) + end +function _series_updated(plt::Plot{PGFPlotsXBackend}, series::Series) +end + +# TODO: don't rebuild plots so often +# IDEA: use functor to only build plot once function _update_plot_object(plt::Plot{PGFPlotsXBackend}) - plt.o = PGFPlotsX.GroupPlot() + plt.o = PGFPlotsX.TikzDocument() + push!(plt.o, PGFPlotsX.TikzPicture(PGFPlotsX.GroupPlot())) pushed_colormap = false - empty!(PGFPlotsX.CUSTOM_PREAMBLE) for sp in plt.subplots bb = bbox(sp) cstr = plot_color(sp[:background_color_legend]) @@ -491,7 +496,7 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) for col in (:markercolor, :fillcolor, :linecolor) if typeof(series.plotattributes[col]) == ColorGradient if !pushed_colormap - push!(PGFPlotsX.CUSTOM_PREAMBLE, """\\pgfplotsset{ + PGFPlotsX.push_preamble!(plt.o, """\\pgfplotsset{ colormap={plots}{$(pgfx_colormap(series.plotattributes[col]))}, }""") pushed_colormap = true @@ -587,7 +592,7 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) ) end end - push!( plt.o, axis ) + push!( plt.o.elements[1].elements[1], axis ) end end From 408db8dc4f60737e09ea9551a15966a0c2a9ea88 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 17:30:26 +0100 Subject: [PATCH 135/357] respect layout --- src/backends/pgfplotsx.jl | 9 ++++++++- test/test_pgfplotsx.jl | 20 +++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 77d75e92..933afbfa 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -447,7 +447,14 @@ end # IDEA: use functor to only build plot once function _update_plot_object(plt::Plot{PGFPlotsXBackend}) plt.o = PGFPlotsX.TikzDocument() - push!(plt.o, PGFPlotsX.TikzPicture(PGFPlotsX.GroupPlot())) + cols, rows = size(plt.layout.grid) + push!(plt.o, PGFPlotsX.TikzPicture(PGFPlotsX.GroupPlot( + PGFPlotsX.Options( + "group style" => PGFPlotsX.Options( + "group size" => string(cols)*" by "*string(rows) + ) + ) + ))) pushed_colormap = false for sp in plt.subplots diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 47f76ccf..748d1739 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -54,7 +54,7 @@ end end # testset @testset "Layout" begin plot(Plots.fakedata(100, 10), layout=4, palette=[:grays :blues :heat :lightrainbow], bg_inside=[:orange :pink :darkblue :black]) - # TODO: add layouting + # TODO: no extra space for outer legends end # testset @testset "Polar plots" begin Θ = range(0, stop=1.5π, length=100) @@ -62,4 +62,22 @@ end plot(Θ, r, proj=:polar, m=2) # TODO: handle polar plots end # testset + @testset "Histogram 2D" begin + histogram2d(randn(10000), randn(10000), nbins=20) + # TODO: totally broken, errors also for pgfplots + end # testset + @testset "Contours" begin + x = 1:0.5:20 + y = 1:0.5:10 + f(x, y) = begin + (3x + y ^ 2) * abs(sin(x) + cos(y)) + end + X = repeat(reshape(x, 1, :), length(y), 1) + Y = repeat(y, 1, length(x)) + Z = map(f, X, Y) + p1 = contour(x, y, f, fill=true) + p2 = contour(x, y, Z) + plot(p1, p2) + # TODO: totally broken, also errors for pgfplots + end # testset end # testset From 91aef718911dcfb2cb58f1b6523b7275d3b83167 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 17:46:05 +0100 Subject: [PATCH 136/357] broken polar --- src/backends/pgfplotsx.jl | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 933afbfa..46c90cbc 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -524,7 +524,15 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) "title" => sp[:colorbar_title] ) ) - axis = PGFPlotsX.Axis( + axisf = if sp[:projection] == :polar + # TODO: this errors for some reason + # push!(axis_opt, "xmin" => 90) + # push!(axis_opt, "xmax" => 450) + PGFPlotsX.PolarAxis + else + PGFPlotsX.Axis + end + axis = axisf( axis_opt ) for series in series_list(sp) From b6f7c8bc4b40363ef09a59ca315eff1d48560d78 Mon Sep 17 00:00:00 2001 From: Niklas Korsbo Date: Tue, 19 Nov 2019 17:16:50 +0000 Subject: [PATCH 137/357] Fix pgfplots legend fg/bg transparency. --- src/backends/pgfplots.jl | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/backends/pgfplots.jl b/src/backends/pgfplots.jl index 2893fd65..4ad995b1 100644 --- a/src/backends/pgfplots.jl +++ b/src/backends/pgfplots.jl @@ -477,7 +477,15 @@ function _update_plot_object(plt::Plot{PGFPlotsBackend}) kw[:legendPos] = _pgfplots_legend_pos[legpos] end cstr, a = pgf_color(plot_color(sp[:background_color_legend])) - push!(style, string("legend style = {", pgf_linestyle(pgf_thickness_scaling(sp), sp[:foreground_color_legend], 1.0, "solid"), ",", "fill = $cstr,", "font = ", pgf_font(sp[:legendfontsize], pgf_thickness_scaling(sp)), "}")) + a == 0 && (cstr = "none") + + if hasfield(typeof(sp[:foreground_color_legend]), :alpha) && sp[:foreground_color_legend].alpha == 0 + legend_linestyle = "draw = none" + else + legend_linestyle = pgf_linestyle(pgf_thickness_scaling(sp), sp[:foreground_color_legend], 1.0, "solid", ) + end + + push!(style, string("legend style = {", legend_linestyle, ",", "fill = $cstr,", "font = ", pgf_font(sp[:legendfontsize], pgf_thickness_scaling(sp)), "}")) if any(s[:seriestype] == :contour for s in series_list(sp)) kw[:view] = "{0}{90}" From e14733d46017f2318621885f99e16fc70b95f286 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 18:18:08 +0100 Subject: [PATCH 138/357] ltriangle, rtriangle --- src/backends.jl | 3 +-- src/backends/pgfplotsx.jl | 12 +++++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/backends.jl b/src/backends.jl index 89fa83eb..d2ae4894 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -713,7 +713,6 @@ const _pgfplotsx_attr = merge_with_base_supported([ # ] const _pgfplotsx_seriestype = [:path, :path3d, :scatter, :steppre, :stepmid, :steppost, :histogram2d, :ysticks, :xsticks, :contour, :shape, :straightline,] const _pgfplotsx_style = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] -const _pgfplotsx_marker = vcat(_allMarkers, Shape) - # [:none, :auto, :circle, :rect, :diamond, :utriangle, :dtriangle, :cross, :xcross, :star5, :pentagon, :hline, :vline] # +const _pgfplotsx_marker = [:none, :auto, :circle, :rect, :diamond, :utriangle, :dtriangle, :ltriangle, :rtriangle, :cross, :xcross, :star5, :pentagon, :hline, :vline, Shape] const _pgfplotsx_scale = [:identity, :ln, :log2, :log10] is_marker_supported(::PGFPlotsXBackend, shape::Shape) = true diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 46c90cbc..1d2c3587 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -16,6 +16,8 @@ const _pgfplotsx_markers = KW( :x => "x", :utriangle => "triangle*", :dtriangle => "triangle*", + :rtriangle => "triangle*", + :ltriangle => "triangle*", :circle => "*", :rect => "square*", :star5 => "star", @@ -125,7 +127,15 @@ function pgfx_marker(plotattributes, i = 1) "fill" => cstr, "fill opacity" => a, "line width" => pgfx_thickness_scaling(plotattributes) * _cycle(plotattributes[:markerstrokewidth], i), - "rotate" => (shape == :dtriangle ? 180 : 0), + "rotate" => if shape == :dtriangle + 180 + elseif shape == :rtriangle + 270 + elseif shape == :ltriangle + 90 + else + 0 + end, get(_pgfplotsx_linestyles, _cycle(plotattributes[:markerstrokestyle], i), "solid") => nothing ) ) From b66415a3383a83017fdf5b298d347379f9dd88e3 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Wed, 20 Nov 2019 10:35:48 +0100 Subject: [PATCH 139/357] translate pgf_fill_legend_hack --- src/backends/pgfplotsx.jl | 140 +++++++------------------------------- 1 file changed, 26 insertions(+), 114 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 1d2c3587..7bc0aef1 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -161,106 +161,6 @@ function pgfx_add_annotation!(o, x, y, val, thickness_scaling = 1) end ## -------------------------------------------------------------------------------------- # TODO: translate these if needed -function pgf_series(sp::Subplot, series::Series) - plotattributes = series.plotattributes - st = plotattributes[:seriestype] - series_collection = PGFPlotsX.Plot[] - - # function args - args = if st == :contour - plotattributes[:z].surf, plotattributes[:x], plotattributes[:y] - elseif is3d(st) - plotattributes[:x], plotattributes[:y], plotattributes[:z] - elseif st == :straightline - straightline_data(series) - elseif st == :shape - shape_data(series) - elseif ispolar(sp) - theta, r = plotattributes[:x], plotattributes[:y] - rad2deg.(theta), r - else - plotattributes[:x], plotattributes[:y] - end - - # PGFPlots can't handle non-Vector? - # args = map(a -> if typeof(a) <: AbstractVector && typeof(a) != Vector - # collect(a) - # else - # a - # end, args) - - if st in (:contour, :histogram2d) - style = [] - kw = KW() - push!(style, pgf_linestyle(plotattributes)) - push!(style, pgf_marker(plotattributes)) - push!(style, "forget plot") - - kw[:style] = join(style, ',') - func = if st == :histogram2d - PGFPlots.Histogram2 - else - kw[:labels] = series[:contour_labels] - kw[:levels] = series[:levels] - PGFPlots.Contour - end - push!(series_collection, func(args...; kw...)) - - else - # series segments - segments = iter_segments(series) - for (i, rng) in enumerate(segments) - style = [] - kw = KW() - push!(style, pgf_linestyle(plotattributes, i)) - push!(style, pgf_marker(plotattributes, i)) - - if st == :shape - push!(style, pgf_fillstyle(plotattributes, i)) - end - - # add to legend? - if i == 1 && sp[:legend] != :none && should_add_to_legend(series) - if plotattributes[:fillrange] !== nothing - push!(style, "forget plot") - push!(series_collection, pgf_fill_legend_hack(plotattributes, args)) - else - kw[:legendentry] = plotattributes[:label] - if st == :shape # || plotattributes[:fillrange] !== nothing - push!(style, "area legend") - end - end - else - push!(style, "forget plot") - end - - seg_args = (arg[rng] for arg in args) - - # include additional style, then add to the kw - if haskey(_pgf_series_extrastyle, st) - push!(style, _pgf_series_extrastyle[st]) - end - kw[:style] = join(style, ',') - - # add fillrange - if series[:fillrange] !== nothing && st != :shape - push!(series_collection, pgf_fillrange_series(series, i, _cycle(series[:fillrange], rng), seg_args...)) - end - - # build/return the series object - func = if st == :path3d - PGFPlots.Linear3 - elseif st == :scatter - PGFPlots.Scatter - else - PGFPlots.Linear - end - push!(series_collection, func(seg_args...; kw...)) - end - end - series_collection -end - function pgfx_fillrange_series(series, i, fillrange, args...) st = series[:seriestype] opt = PGFPlotsX.Options() @@ -291,24 +191,21 @@ function pgfx_fillrange_args(fillrange, x, y, z) return x_fill, y_fill, z_fill end -function pgf_fill_legend_hack(plotattributes, args) - style = [] - kw = KW() - push!(style, pgf_linestyle(plotattributes, 1)) - push!(style, pgf_marker(plotattributes, 1)) - push!(style, pgf_fillstyle(plotattributes, 1)) - push!(style, "area legend") - kw[:legendentry] = plotattributes[:label] - kw[:style] = join(style, ',') +function pgfx_fill_legend_hack(plotattributes, args) + opt = PGFPlotsX.Options("area legend" => nothing) + opt = merge(opt, pgfx_linestyle(plotattributes, 1)) + opt = merge(opt, pgfx_marker(plotattributes, 1)) + opt = merge(opt, pgfx_fillstyle(plotattributes, 1)) st = plotattributes[:seriestype] func = if st == :path3d - PGFPlots.Linear3 - elseif st == :scatter - PGFPlots.Scatter + PGFPlotsX.Plot3 else - PGFPlots.Linear + PGFPlotsX.Plot end - return func(([arg[1]] for arg in args)...; kw...) + if st == :scatter + push!(opt, "only marks" => nothing) + end + return func(opt, PGFPlotsX.Coordinates(([arg[1]] for arg in args)...)) end # -------------------------------------------------------------------------------------- @@ -586,6 +483,21 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) if series[:fillrange] !== nothing && st != :shape push!(axis, pgfx_fillrange_series(series, i, _cycle(series[:fillrange], rng), seg_args...)) end + + # add to legend? + if i == 1 && sp[:legend] != :none && should_add_to_legend(series) + if opt[:fillrange] !== nothing + push!(segment_opt, "forget plot" => nothing) + push!(axis, pgfx_fill_legend_hack(opt, args)) + else + if st == :shape + push!(segment_opt, "area legend" => nothing) + end + end + push!( axis, PGFPlotsX.LegendEntry( opt[:label] )) + else + push!(segment_opt, "forget plot" => nothing) + end end #include additional style if haskey(_pgfx_series_extrastyle, st) From faf6ea72e0ccb768f9603af39d7d5f3da993912e Mon Sep 17 00:00:00 2001 From: Niklas Korsbo Date: Wed, 20 Nov 2019 10:02:27 +0000 Subject: [PATCH 140/357] Allow legend opacity for pgfplots. --- src/backends/pgfplots.jl | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/backends/pgfplots.jl b/src/backends/pgfplots.jl index 4ad995b1..bce8e521 100644 --- a/src/backends/pgfplots.jl +++ b/src/backends/pgfplots.jl @@ -476,16 +476,10 @@ function _update_plot_object(plt::Plot{PGFPlotsBackend}) if haskey(_pgfplots_legend_pos, legpos) kw[:legendPos] = _pgfplots_legend_pos[legpos] end - cstr, a = pgf_color(plot_color(sp[:background_color_legend])) - a == 0 && (cstr = "none") + cstr, bg_alpha = pgf_color(plot_color(sp[:background_color_legend])) + fg_alpha = alpha(plot_color(sp[:foreground_color_legend])) - if hasfield(typeof(sp[:foreground_color_legend]), :alpha) && sp[:foreground_color_legend].alpha == 0 - legend_linestyle = "draw = none" - else - legend_linestyle = pgf_linestyle(pgf_thickness_scaling(sp), sp[:foreground_color_legend], 1.0, "solid", ) - end - - push!(style, string("legend style = {", legend_linestyle, ",", "fill = $cstr,", "font = ", pgf_font(sp[:legendfontsize], pgf_thickness_scaling(sp)), "}")) + push!(style, string("legend style = {", pgf_linestyle(pgf_thickness_scaling(sp), sp[:foreground_color_legend], fg_alpha, "solid", ), ",", "fill = $cstr,", "fill opacity = $bg_alpha,", "text opacity = 1,", "font = ", pgf_font(sp[:legendfontsize], pgf_thickness_scaling(sp)), "}")) if any(s[:seriestype] == :contour for s in series_list(sp)) kw[:view] = "{0}{90}" From 0b8f7d67dc8de889eecc3635de07ab673c56c9dc Mon Sep 17 00:00:00 2001 From: Niklas Korsbo Date: Wed, 20 Nov 2019 10:17:28 +0000 Subject: [PATCH 141/357] Allow legend font alpha with pgfplots. --- src/backends/pgfplots.jl | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/backends/pgfplots.jl b/src/backends/pgfplots.jl index bce8e521..69c85c64 100644 --- a/src/backends/pgfplots.jl +++ b/src/backends/pgfplots.jl @@ -479,7 +479,15 @@ function _update_plot_object(plt::Plot{PGFPlotsBackend}) cstr, bg_alpha = pgf_color(plot_color(sp[:background_color_legend])) fg_alpha = alpha(plot_color(sp[:foreground_color_legend])) - push!(style, string("legend style = {", pgf_linestyle(pgf_thickness_scaling(sp), sp[:foreground_color_legend], fg_alpha, "solid", ), ",", "fill = $cstr,", "fill opacity = $bg_alpha,", "text opacity = 1,", "font = ", pgf_font(sp[:legendfontsize], pgf_thickness_scaling(sp)), "}")) + push!(style, string( + "legend style = {", + pgf_linestyle(pgf_thickness_scaling(sp), sp[:foreground_color_legend], fg_alpha, "solid", ), ",", + "fill = $cstr,", + "fill opacity = $bg_alpha,", + "text opacity = $(alpha(plot_color(sp[:legendfontcolor]))),", + "font = ", pgf_font(sp[:legendfontsize], pgf_thickness_scaling(sp)), + "}", + )) if any(s[:seriestype] == :contour for s in series_list(sp)) kw[:view] = "{0}{90}" From 4964eb31fa5eba5bdd67558549eabcd6897291f8 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Wed, 20 Nov 2019 14:16:43 +0100 Subject: [PATCH 142/357] create plot only once --- src/backends/pgfplotsx.jl | 391 ++++++++++++++++++++------------------ 1 file changed, 208 insertions(+), 183 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 7bc0aef1..e9e49e73 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,4 +1,207 @@ -PGFPlotsX.print_tex(io::IO, data::Symbol) = PGFPlotsX.print_tex(io, string(data)) +# PGFPlotsX.print_tex(io::IO, data::Symbol) = PGFPlotsX.print_tex(io, string(data)) +Base.@kwdef mutable struct PGFPlotsXPlot + is_created::Bool = false + was_shown::Bool = false + the_plot::PGFPlotsX.TikzDocument = PGFPlotsX.TikzDocument() +end + +function Base.show(io::IO, mime::MIME, pgfx_plot::PGFPlotsXPlot) + show(io::IO, mime, pgfx_plot.the_plot) +end + +function Base.push!(pgfx_plot::PGFPlotsXPlot, item) + push!(pgfx_plot.the_plot, item) +end + +function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) + if !pgfx_plot.is_created + cols, rows = size(plt.layout.grid) + the_plot = PGFPlotsX.TikzPicture(PGFPlotsX.GroupPlot( + PGFPlotsX.Options( + "group style" => PGFPlotsX.Options( + "group size" => string(cols)*" by "*string(rows) + ) + ) + )) + + pushed_colormap = false + for sp in plt.subplots + bb = bbox(sp) + cstr = plot_color(sp[:background_color_legend]) + a = alpha(cstr) + title_cstr = plot_color(sp[:titlefontcolor]) + title_a = alpha(cstr) + # TODO: aspect ratio + axis_opt = PGFPlotsX.Options( + "height" => string(height(bb)), + "width" => string(width(bb)), + "title" => sp[:title], + "title style" => PGFPlotsX.Options( + "font" => pgfx_font(sp[:titlefontsize], pgfx_thickness_scaling(sp)), + "color" => title_cstr, + "draw opacity" => title_a, + "rotate" => sp[:titlefontrotation] + ), + "legend pos" => get(_pgfplotsx_legend_pos, sp[:legend], "outer north east"), + "legend style" => PGFPlotsX.Options( + pgfx_linestyle(pgfx_thickness_scaling(sp), sp[:foreground_color_legend], 1.0, "solid") => nothing, + "fill" => cstr, + "font" => pgfx_font(sp[:legendfontsize], pgfx_thickness_scaling(sp)) + ), + "axis background/.style" => PGFPlotsX.Options( + "fill" => sp[:background_color_inside] + ) + ) + for letter in (:x, :y, :z) + if letter != :z || is3d(sp) + pgfx_axis!(axis_opt, sp, letter) + 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 + if !pushed_colormap + PGFPlotsX.push_preamble!(pgfx_plot.the_plot, """\\pgfplotsset{ + colormap={plots}{$(pgfx_colormap(series.plotattributes[col]))}, + }""") + pushed_colormap = true + push!(axis_opt, + "colorbar" => nothing, + "colormap name" => "plots", + ) + 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] + ) + ) + axisf = if sp[:projection] == :polar + # TODO: this errors for some reason + # push!(axis_opt, "xmin" => 90) + # push!(axis_opt, "xmax" => 450) + PGFPlotsX.PolarAxis + else + PGFPlotsX.Axis + end + axis = axisf( + axis_opt + ) + for series in series_list(sp) + opt = series.plotattributes + st = series[:seriestype] + # function args + args = if st == :contour + opt[:z].surf, opt[:x], opt[:y] + elseif is3d(st) + opt[:x], opt[:y], opt[:z] + elseif st == :straightline + straightline_data(series) + elseif st == :shape + shape_data(series) + elseif ispolar(sp) + theta, r = opt[:x], opt[:y] + rad2deg.(theta), r + else + opt[:x], opt[:y] + end + series_opt = PGFPlotsX.Options( + "color" => opt[:linecolor], + ) + if st == :shape + push!(series_opt, "area legend" => nothing) + end + if opt[:marker_z] !== nothing + push!(series_opt, "point meta" => "explicit") + push!(series_opt, "scatter" => nothing) + end + segments = iter_segments(series) + segment_opt = PGFPlotsX.Options() + for (i, rng) in enumerate(segments) + segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) + segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) + if st == :shape + segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) + end + seg_args = (arg[rng] for arg in args) + # add fillrange + if series[:fillrange] !== nothing && st != :shape + push!(axis, pgfx_fillrange_series(series, i, _cycle(series[:fillrange], rng), seg_args...)) + end + + # add to legend? + if i == 1 && sp[:legend] != :none && should_add_to_legend(series) + if opt[:fillrange] !== nothing + push!(segment_opt, "forget plot" => nothing) + push!(axis, pgfx_fill_legend_hack(opt, args)) + else + if st == :shape + push!(segment_opt, "area legend" => nothing) + end + end + push!( axis, PGFPlotsX.LegendEntry( opt[:label] )) + else + push!(segment_opt, "forget plot" => nothing) + end + end + #include additional style + if haskey(_pgfx_series_extrastyle, st) + push!(series_opt, _pgfx_series_extrastyle[st] => nothing) + end + # TODO: different seriestypes, histogramms, contours, etc. + # TODO: colorbars + # TODO: gradients + if is3d(series) + series_func = PGFPlotsX.Plot3 + else + series_func = PGFPlotsX.Plot + end + if st == :scatter + push!(series_opt, "only marks" => nothing) + end + series_plot = series_func( + merge(series_opt, segment_opt), + PGFPlotsX.Coordinates(args..., meta = opt[:marker_z]) + ) + # add series annotations + anns = series[:series_annotations] + for (xi,yi,str,fnt) in EachAnn(anns, series[:x], series[:y]) + pgfx_add_annotation!(series_plot, xi, yi, PlotText(str, fnt), pgfx_thickness_scaling(series)) + end + push!( axis, series_plot ) + if opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) + push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) + ) + end + end + push!( the_plot.elements[1], 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 + pgfx_plot.is_created = true + end +end + +## const _pgfplotsx_linestyles = KW( :solid => "solid", @@ -344,193 +547,15 @@ end # -------------------------------------------------------------------------------------- # display calls this and then _display, its called 3 times for plot(1:5) function _create_backend_figure(plt::Plot{PGFPlotsXBackend}) - + plt.o = PGFPlotsXPlot() end -function _series_updated(plt::Plot{PGFPlotsXBackend}, series::Series) +function _series_added(plt::Plot{PGFPlotsXBackend}, series::Series) + plt.o.is_created = false end -# TODO: don't rebuild plots so often -# IDEA: use functor to only build plot once function _update_plot_object(plt::Plot{PGFPlotsXBackend}) - plt.o = PGFPlotsX.TikzDocument() - cols, rows = size(plt.layout.grid) - push!(plt.o, PGFPlotsX.TikzPicture(PGFPlotsX.GroupPlot( - PGFPlotsX.Options( - "group style" => PGFPlotsX.Options( - "group size" => string(cols)*" by "*string(rows) - ) - ) - ))) - - pushed_colormap = false - for sp in plt.subplots - bb = bbox(sp) - cstr = plot_color(sp[:background_color_legend]) - a = alpha(cstr) - title_cstr = plot_color(sp[:titlefontcolor]) - title_a = alpha(cstr) - # TODO: aspect ratio - axis_opt = PGFPlotsX.Options( - "height" => string(height(bb)), - "width" => string(width(bb)), - "title" => sp[:title], - "title style" => PGFPlotsX.Options( - "font" => pgfx_font(sp[:titlefontsize], pgfx_thickness_scaling(sp)), - "color" => title_cstr, - "draw opacity" => title_a, - "rotate" => sp[:titlefontrotation] - ), - "legend pos" => get(_pgfplotsx_legend_pos, sp[:legend], "outer north east"), - "legend style" => PGFPlotsX.Options( - pgfx_linestyle(pgfx_thickness_scaling(sp), sp[:foreground_color_legend], 1.0, "solid") => nothing, - "fill" => cstr, - "font" => pgfx_font(sp[:legendfontsize], pgfx_thickness_scaling(sp)) - ), - "axis background/.style" => PGFPlotsX.Options( - "fill" => sp[:background_color_inside] - ) - ) - for letter in (:x, :y, :z) - if letter != :z || is3d(sp) - pgfx_axis!(axis_opt, sp, letter) - 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 - if !pushed_colormap - PGFPlotsX.push_preamble!(plt.o, """\\pgfplotsset{ - colormap={plots}{$(pgfx_colormap(series.plotattributes[col]))}, - }""") - pushed_colormap = true - push!(axis_opt, - "colorbar" => nothing, - "colormap name" => "plots", - ) - 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] - ) - ) - axisf = if sp[:projection] == :polar - # TODO: this errors for some reason - # push!(axis_opt, "xmin" => 90) - # push!(axis_opt, "xmax" => 450) - PGFPlotsX.PolarAxis - else - PGFPlotsX.Axis - end - axis = axisf( - axis_opt - ) - for series in series_list(sp) - opt = series.plotattributes - st = series[:seriestype] - # function args - args = if st == :contour - opt[:z].surf, opt[:x], opt[:y] - elseif is3d(st) - opt[:x], opt[:y], opt[:z] - elseif st == :straightline - straightline_data(series) - elseif st == :shape - shape_data(series) - elseif ispolar(sp) - theta, r = opt[:x], opt[:y] - rad2deg.(theta), r - else - opt[:x], opt[:y] - end - series_opt = PGFPlotsX.Options( - "color" => opt[:linecolor], - ) - if st == :shape - push!(series_opt, "area legend" => nothing) - end - if opt[:marker_z] !== nothing - push!(series_opt, "point meta" => "explicit") - push!(series_opt, "scatter" => nothing) - end - segments = iter_segments(series) - segment_opt = PGFPlotsX.Options() - for (i, rng) in enumerate(segments) - segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) - segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) - if st == :shape - segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) - end - seg_args = (arg[rng] for arg in args) - # add fillrange - if series[:fillrange] !== nothing && st != :shape - push!(axis, pgfx_fillrange_series(series, i, _cycle(series[:fillrange], rng), seg_args...)) - end - - # add to legend? - if i == 1 && sp[:legend] != :none && should_add_to_legend(series) - if opt[:fillrange] !== nothing - push!(segment_opt, "forget plot" => nothing) - push!(axis, pgfx_fill_legend_hack(opt, args)) - else - if st == :shape - push!(segment_opt, "area legend" => nothing) - end - end - push!( axis, PGFPlotsX.LegendEntry( opt[:label] )) - else - push!(segment_opt, "forget plot" => nothing) - end - end - #include additional style - if haskey(_pgfx_series_extrastyle, st) - push!(series_opt, _pgfx_series_extrastyle[st] => nothing) - end - # TODO: different seriestypes, histogramms, contours, etc. - # TODO: colorbars - # TODO: gradients - if is3d(series) - series_func = PGFPlotsX.Plot3 - else - series_func = PGFPlotsX.Plot - end - if st == :scatter - push!(series_opt, "only marks" => nothing) - end - series_plot = series_func( - merge(series_opt, segment_opt), - PGFPlotsX.Coordinates(args..., meta = opt[:marker_z]) - ) - # add series annotations - anns = series[:series_annotations] - for (xi,yi,str,fnt) in EachAnn(anns, series[:x], series[:y]) - pgfx_add_annotation!(series_plot, xi, yi, PlotText(str, fnt), pgfx_thickness_scaling(series)) - end - push!( axis, series_plot ) - if opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) - push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) - ) - end - end - push!( plt.o.elements[1].elements[1], axis ) - end + plt.o(plt) end function _show(io::IO, mime::MIME"image/svg+xml", plt::Plot{PGFPlotsXBackend}) From 71720de7b2395a7ae36a357fe87abc898b7fa8a8 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Wed, 20 Nov 2019 15:20:33 +0100 Subject: [PATCH 143/357] update tests --- src/backends/pgfplotsx.jl | 5 +++-- test/test_pgfplotsx.jl | 24 +++++++++++++----------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index e9e49e73..90b823d8 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -5,6 +5,8 @@ Base.@kwdef mutable struct PGFPlotsXPlot the_plot::PGFPlotsX.TikzDocument = PGFPlotsX.TikzDocument() end +pgfx_axes(pgfx_plot::PGFPlotsXPlot) = pgfx_plot.the_plot.elements[1].elements[1].contents + function Base.show(io::IO, mime::MIME, pgfx_plot::PGFPlotsXPlot) show(io::IO, mime, pgfx_plot.the_plot) end @@ -31,7 +33,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) a = alpha(cstr) title_cstr = plot_color(sp[:titlefontcolor]) title_a = alpha(cstr) - # TODO: aspect ratio axis_opt = PGFPlotsX.Options( "height" => string(height(bb)), "width" => string(width(bb)), @@ -575,7 +576,7 @@ end function _show(io::IO, mime::MIME"application/x-tex", plt::Plot{PGFPlotsXBackend}) _update_plot_object(plt) - PGFPlotsX.print_tex(plt.o) + PGFPlotsX.print_tex(plt.o.the_plot) end function _display(plt::Plot{PGFPlotsXBackend}) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 748d1739..03e9dce2 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -12,34 +12,37 @@ function create_plot!( args...; kwargs... ) end @testset "PGFPlotsX" begin - pgfx_plot, pgfx_tex = create_plot(1:5) + pgfx_plot = plot(1:5) + Plots._update_plot_object(pgfx_plot) + @test pgfx_plot.o.the_plot isa PGFPlotsX.TikzDocument - @test pgfx_plot.o isa PGFPlotsX.GroupPlot - @testset "3D docs example" begin + @testset "3D docs example" begin n = 100 ts = range(0, stop=8π, length=n) x = ts .* map(cos, ts) y = (0.1ts) .* map(sin, ts) z = 1:n pl = plot(x, y, z, zcolor=reverse(z), m=(10, 0.8, :blues, Plots.stroke(0)), leg=false, cbar=true, w=5) - pgfx_plot, pgfx_tex = create_plot!(pl, zeros(n), zeros(n), 1:n, w=10) - if @test_nowarn(haskey(pgfx_plot.o.contents[1].options.dict, "colorbar") == true) - @test pgfx_plot.o.contents[1]["colorbar"] === nothing + pgfx_plot = plot!(pl, zeros(n), zeros(n), 1:n, w=10) + Plots._update_plot_object(pgfx_plot) + if @test_nowarn(haskey(Plots.pgfx_axes(pgfx_plot.o)[1].options.dict, "colorbar") == true) + @test Plots.pgfx_axes(pgfx_plot.o)[1]["colorbar"] === nothing end end # testset @testset "Color docs example" begin y = rand(100) plot(0:10:100, rand(11, 4), lab="lines", w=3, palette=:grays, fill=0, α=0.6) - scatter!(y, zcolor=abs.(y .- 0.5), m=(:heat, 0.8, Plots.stroke(1, :green)), ms=10 * abs.(y .- 0.5) .+ 4, lab="grad") + pl = scatter!(y, zcolor=abs.(y .- 0.5), m=(:heat, 0.8, Plots.stroke(1, :green)), ms=10 * abs.(y .- 0.5) .+ 4, lab="grad") + Plots._update_plot_object(pl) + axis = Plots.pgfx_axes(pl.o)[1] + @test count( x->x isa PGFPlotsX.LegendEntry, axis.contents ) == 5 + @test count( x->x isa PGFPlotsX.Plot, axis.contents ) == 5 # TODO: marker size does not adjust # TODO: marker stroke is incorrect - # TODO: fill legends - # TODO: adjust colorbar limits to data end # testset @testset "Plot in pieces" begin plot(rand(100) / 3, reg=true, fill=(0, :green)) scatter!(rand(100), markersize=6, c=:orange) - # TODO: legends should be different end # testset @testset "Marker types" begin markers = filter((m->begin @@ -50,7 +53,6 @@ end x = (range(0, stop=10, length=n + 2))[2:end - 1] y = repeat(reshape(reverse(x), 1, :), n, 1) scatter(x, y, m=(8, :auto), lab=map(string, markers), bg=:linen, xlim=(0, 10), ylim=(0, 10)) - #TODO: fix markers that show up as circles end # testset @testset "Layout" begin plot(Plots.fakedata(100, 10), layout=4, palette=[:grays :blues :heat :lightrainbow], bg_inside=[:orange :pink :darkblue :black]) From 2d947f4a9779e03f14ead8b76511b1748a29c5f3 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Wed, 20 Nov 2019 17:28:23 +0100 Subject: [PATCH 144/357] native fillrange --- src/backends/pgfplotsx.jl | 96 +++++++++++++++++++-------------------- test/test_pgfplotsx.jl | 12 +++-- 2 files changed, 55 insertions(+), 53 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 90b823d8..c0c6e05e 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -88,6 +88,10 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end end @label colorbar_end + # detect fillranges + # if any(series->series[:fillrange] != nothing, series_list(sp)) + # PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usepgfplotslibrary{fillbetween},\n") + # end push!(axis_opt, "colorbar style" => PGFPlotsX.Options( "title" => sp[:colorbar_title] @@ -125,71 +129,61 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) series_opt = PGFPlotsX.Options( "color" => opt[:linecolor], ) - if st == :shape - push!(series_opt, "area legend" => nothing) - end if opt[:marker_z] !== nothing push!(series_opt, "point meta" => "explicit") push!(series_opt, "scatter" => nothing) end - segments = iter_segments(series) - segment_opt = PGFPlotsX.Options() - for (i, rng) in enumerate(segments) - segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) - segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) - if st == :shape - segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) - end - seg_args = (arg[rng] for arg in args) - # add fillrange - if series[:fillrange] !== nothing && st != :shape - push!(axis, pgfx_fillrange_series(series, i, _cycle(series[:fillrange], rng), seg_args...)) - end - - # add to legend? - if i == 1 && sp[:legend] != :none && should_add_to_legend(series) - if opt[:fillrange] !== nothing - push!(segment_opt, "forget plot" => nothing) - push!(axis, pgfx_fill_legend_hack(opt, args)) - else - if st == :shape - push!(segment_opt, "area legend" => nothing) - end - end - push!( axis, PGFPlotsX.LegendEntry( opt[:label] )) - else - push!(segment_opt, "forget plot" => nothing) - end - end - #include additional style - if haskey(_pgfx_series_extrastyle, st) - push!(series_opt, _pgfx_series_extrastyle[st] => nothing) - end - # TODO: different seriestypes, histogramms, contours, etc. - # TODO: colorbars - # TODO: gradients if is3d(series) series_func = PGFPlotsX.Plot3 else series_func = PGFPlotsX.Plot end - if st == :scatter - push!(series_opt, "only marks" => nothing) + if series[:fillrange] !== nothing + series_opt = merge(series_opt, pgfx_fillstyle(opt)) + push!(series_opt, "area legend" => nothing) end - series_plot = series_func( - merge(series_opt, segment_opt), - PGFPlotsX.Coordinates(args..., meta = opt[:marker_z]) - ) + # include additional style + if haskey(_pgfx_series_extrastyle, st) + push!(series_opt, _pgfx_series_extrastyle[st] => nothing) + end + # treat segments + segments = iter_segments(series) + segment_opt = PGFPlotsX.Options() + # @show get_markerstrokecolor(opt, 1) + # @show get_markercolor(opt,1) + for (i, rng) in enumerate(segments) + seg_args = (arg[rng] for arg in args) + segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) + segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) + if st == :shape || series[:fillrange] !== nothing + segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) + end + segment_plot = series_func( + merge(series_opt, segment_opt), + PGFPlotsX.Coordinates(seg_args..., + meta = if !isnothing(opt[:marker_z]) + opt[:marker_z][rng] + else + nothing + end + ), + series[:fillrange] !== nothing ? "\\closedcycle" : "{}" + ) + push!(axis, segment_plot) + # add to legend? + if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) + push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) + ) + end + end + # TODO: different seriestypes, histogramms, contours, etc. + # TODO: colorbars + # TODO: gradients # add series annotations anns = series[:series_annotations] for (xi,yi,str,fnt) in EachAnn(anns, series[:x], series[:y]) pgfx_add_annotation!(series_plot, xi, yi, PlotText(str, fnt), pgfx_thickness_scaling(series)) end - push!( axis, series_plot ) - if opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) - push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) - ) - end end push!( the_plot.elements[1], axis ) if length(plt.o.the_plot.elements) > 0 @@ -247,6 +241,8 @@ const _pgfx_series_extrastyle = KW( :sticks => "ycomb", :ysticks => "ycomb", :xsticks => "xcomb", + :scatter => "only marks", + :shape => "area legends" ) const _pgfx_framestyles = [:box, :axes, :origin, :zerolines, :grid, :none] diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 03e9dce2..7a8c320a 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -36,9 +36,15 @@ end Plots._update_plot_object(pl) axis = Plots.pgfx_axes(pl.o)[1] @test count( x->x isa PGFPlotsX.LegendEntry, axis.contents ) == 5 - @test count( x->x isa PGFPlotsX.Plot, axis.contents ) == 5 - # TODO: marker size does not adjust - # TODO: marker stroke is incorrect + @test count( x->x isa PGFPlotsX.Plot, axis.contents ) == 104 # each marker is its own plot + marker = axis.contents[5] + @test marker isa PGFPlotsX.Plot + @show marker.options.dict |> keys + @test marker.options["mark"] == "none" + @test marker.options["mark options"]["color"] == convert(RGBA{Float64}, colorant"green") + @test marker.options["mark options"]["line width"] == 1 + + # TODO: marker stroke color is incorrect end # testset @testset "Plot in pieces" begin plot(rand(100) / 3, reg=true, fill=(0, :green)) From d43e53f8961c15d13150598d5a44bbced84866b0 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Wed, 20 Nov 2019 18:10:30 +0100 Subject: [PATCH 145/357] tests for marker-stroke-color --- src/backends/pgfplotsx.jl | 2 -- test/test_pgfplotsx.jl | 7 +++---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index c0c6e05e..4995feb5 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -149,8 +149,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) # treat segments segments = iter_segments(series) segment_opt = PGFPlotsX.Options() - # @show get_markerstrokecolor(opt, 1) - # @show get_markercolor(opt,1) for (i, rng) in enumerate(segments) seg_args = (arg[rng] for arg in args) segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 7a8c320a..5ffd62c8 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -37,11 +37,10 @@ end axis = Plots.pgfx_axes(pl.o)[1] @test count( x->x isa PGFPlotsX.LegendEntry, axis.contents ) == 5 @test count( x->x isa PGFPlotsX.Plot, axis.contents ) == 104 # each marker is its own plot - marker = axis.contents[5] + marker = axis.contents[14] @test marker isa PGFPlotsX.Plot - @show marker.options.dict |> keys - @test marker.options["mark"] == "none" - @test marker.options["mark options"]["color"] == convert(RGBA{Float64}, colorant"green") + @test marker.options["mark"] == "*" + @test marker.options["mark options"]["color"] == RGBA{Float64}( colorant"green", 0.8) @test marker.options["mark options"]["line width"] == 1 # TODO: marker stroke color is incorrect From e4e9cbf6cb069c724217a50b5105a637234fbfbe Mon Sep 17 00:00:00 2001 From: Niklas Korsbo Date: Wed, 20 Nov 2019 18:05:41 +0000 Subject: [PATCH 146/357] Remove line through marker in pgfplots legend. --- src/backends/pgfplots.jl | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/backends/pgfplots.jl b/src/backends/pgfplots.jl index 2893fd65..2187278c 100644 --- a/src/backends/pgfplots.jl +++ b/src/backends/pgfplots.jl @@ -128,16 +128,18 @@ function pgf_marker(plotattributes, i = 1) shape = _cycle(plotattributes[:markershape], i) cstr, a = pgf_color(plot_color(get_markercolor(plotattributes, i), get_markeralpha(plotattributes, i))) cstr_stroke, a_stroke = pgf_color(plot_color(get_markerstrokecolor(plotattributes, i), get_markerstrokealpha(plotattributes, i))) - """ - mark = $(get(_pgfplots_markers, shape, "*")), - mark size = $(pgf_thickness_scaling(plotattributes) * 0.5 * _cycle(plotattributes[:markersize], i)), - mark options = { - color = $cstr_stroke, draw opacity = $a_stroke, - fill = $cstr, fill opacity = $a, - line width = $(pgf_thickness_scaling(plotattributes) * _cycle(plotattributes[:markerstrokewidth], i)), - rotate = $(shape == :dtriangle ? 180 : 0), - $(get(_pgfplots_linestyles, _cycle(plotattributes[:markerstrokestyle], i), "solid")) - }""" + return string( + "mark = $(get(_pgfplots_markers, shape, "*")),\n", + "mark size = $(pgf_thickness_scaling(plotattributes) * 0.5 * _cycle(plotattributes[:markersize], i)),\n", + plotattributes[:seriestype] == :scatter ? "only marks,\n" : "", + "mark options = { + color = $cstr_stroke, draw opacity = $a_stroke, + fill = $cstr, fill opacity = $a, + line width = $(pgf_thickness_scaling(plotattributes) * _cycle(plotattributes[:markerstrokewidth], i)), + rotate = $(shape == :dtriangle ? 180 : 0), + $(get(_pgfplots_linestyles, _cycle(plotattributes[:markerstrokestyle], i), "solid")) + }" + ) end function pgf_add_annotation!(o, x, y, val, thickness_scaling = 1) From fe7765905829c49ae685779f634571cd926ce2f4 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 11:11:05 +0100 Subject: [PATCH 147/357] remove point meta --- src/backends/pgfplotsx.jl | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 4995feb5..ac088762 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -129,10 +129,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) series_opt = PGFPlotsX.Options( "color" => opt[:linecolor], ) - if opt[:marker_z] !== nothing - push!(series_opt, "point meta" => "explicit") - push!(series_opt, "scatter" => nothing) - end if is3d(series) series_func = PGFPlotsX.Plot3 else @@ -158,13 +154,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end segment_plot = series_func( merge(series_opt, segment_opt), - PGFPlotsX.Coordinates(seg_args..., - meta = if !isnothing(opt[:marker_z]) - opt[:marker_z][rng] - else - nothing - end - ), + PGFPlotsX.Coordinates(seg_args...), series[:fillrange] !== nothing ? "\\closedcycle" : "{}" ) push!(axis, segment_plot) From b6e641c035a8fa9900530ae2a9513a1e8b513ae9 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 11:31:33 +0100 Subject: [PATCH 148/357] adjust color bar limits --- src/backends/pgfplotsx.jl | 20 +++++++++++++++----- test/test_pgfplotsx.jl | 2 -- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index ac088762..53ffbfe7 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -88,13 +88,9 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end end @label colorbar_end - # detect fillranges - # if any(series->series[:fillrange] != nothing, series_list(sp)) - # PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usepgfplotslibrary{fillbetween},\n") - # end push!(axis_opt, "colorbar style" => PGFPlotsX.Options( - "title" => sp[:colorbar_title] + "title" => sp[:colorbar_title], ) ) axisf = if sp[:projection] == :polar @@ -110,6 +106,20 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) ) for series in series_list(sp) opt = series.plotattributes + if opt[:marker_z] !== nothing + cbar_style = axis_opt["colorbar style"] + if !haskey( cbar_style.dict, "point meta max" ) + append!( axis_opt["colorbar style"], + ( + "point meta max" => maximum(opt[:marker_z]), + "point meta min" => minimum(opt[:marker_z]) + ) + ) + else + cbar_style["point meta max"] = maximum(opt[:marker_z]) + cbar_style["point meta min"] = minimum(opt[:marker_z]) + end + end st = series[:seriestype] # function args args = if st == :contour diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 5ffd62c8..21074e93 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -42,8 +42,6 @@ end @test marker.options["mark"] == "*" @test marker.options["mark options"]["color"] == RGBA{Float64}( colorant"green", 0.8) @test marker.options["mark options"]["line width"] == 1 - - # TODO: marker stroke color is incorrect end # testset @testset "Plot in pieces" begin plot(rand(100) / 3, reg=true, fill=(0, :green)) From e1e8a480f9e5fbe5b63baff7b8db47cbb87ab26b Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 12:34:09 +0100 Subject: [PATCH 149/357] fix polar plots --- src/backends/pgfplotsx.jl | 31 ++++++++++++++++++++----------- test/test_pgfplotsx.jl | 1 - 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 53ffbfe7..66fc5f02 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -18,14 +18,18 @@ end function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) if !pgfx_plot.is_created cols, rows = size(plt.layout.grid) - the_plot = PGFPlotsX.TikzPicture(PGFPlotsX.GroupPlot( - PGFPlotsX.Options( - "group style" => PGFPlotsX.Options( - "group size" => string(cols)*" by "*string(rows) + the_plot = PGFPlotsX.TikzPicture() + # the combination of groupplot and polaraxis is broken in pgfplots + if !any( sp -> ispolar(sp), plt.subplots ) + push!( the_plot, PGFPlotsX.GroupPlot( + PGFPlotsX.Options( + "group style" => PGFPlotsX.Options( + "group size" => string(cols)*" by "*string(rows) + ) + ) ) ) - )) - + end pushed_colormap = false for sp in plt.subplots bb = bbox(sp) @@ -121,6 +125,9 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end end st = series[:seriestype] + series_opt = PGFPlotsX.Options( + "color" => opt[:linecolor], + ) # function args args = if st == :contour opt[:z].surf, opt[:x], opt[:y] @@ -136,9 +143,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) else opt[:x], opt[:y] end - series_opt = PGFPlotsX.Options( - "color" => opt[:linecolor], - ) if is3d(series) series_func = PGFPlotsX.Plot3 else @@ -183,7 +187,12 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) pgfx_add_annotation!(series_plot, xi, yi, PlotText(str, fnt), pgfx_thickness_scaling(series)) end end - push!( the_plot.elements[1], axis ) + 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 @@ -570,7 +579,7 @@ end function _show(io::IO, mime::MIME"application/x-tex", plt::Plot{PGFPlotsXBackend}) _update_plot_object(plt) - PGFPlotsX.print_tex(plt.o.the_plot) + PGFPlotsX.print_tex(io, plt.o.the_plot) end function _display(plt::Plot{PGFPlotsXBackend}) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 21074e93..4eeeddf7 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -65,7 +65,6 @@ end Θ = range(0, stop=1.5π, length=100) r = abs.(0.1 * randn(100) + sin.(3Θ)) plot(Θ, r, proj=:polar, m=2) - # TODO: handle polar plots end # testset @testset "Histogram 2D" begin histogram2d(randn(10000), randn(10000), nbins=20) From 92aafb1349e583ef1c5b1629a058b1dc81ce1ad3 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 13:03:37 +0100 Subject: [PATCH 150/357] padding of grouplots --- src/backends/pgfplotsx.jl | 11 ++++++++++- test/test_pgfplotsx.jl | 1 - 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 66fc5f02..0764606e 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -24,7 +24,9 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) push!( the_plot, PGFPlotsX.GroupPlot( PGFPlotsX.Options( "group style" => PGFPlotsX.Options( - "group size" => string(cols)*" by "*string(rows) + "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)), ) ) ) @@ -550,6 +552,13 @@ function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) end # -------------------------------------------------------------------------------------- # display calls this and then _display, its called 3 times for plot(1:5) +# Set the (left, top, right, bottom) minimum padding around the plot area +# to fit ticks, tick labels, guides, colorbars, etc. +function _update_min_padding!(sp::Subplot{PGFPlotsXBackend}) + # TODO: make padding more intelligent + sp.minpad = (20mm, 5mm, 2mm, 10mm) +end + function _create_backend_figure(plt::Plot{PGFPlotsXBackend}) plt.o = PGFPlotsXPlot() end diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 4eeeddf7..68002222 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -59,7 +59,6 @@ end end # testset @testset "Layout" begin plot(Plots.fakedata(100, 10), layout=4, palette=[:grays :blues :heat :lightrainbow], bg_inside=[:orange :pink :darkblue :black]) - # TODO: no extra space for outer legends end # testset @testset "Polar plots" begin Θ = range(0, stop=1.5π, length=100) From 48208998e2079d12cc222caee0416351cc654dc2 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 13:06:22 +0100 Subject: [PATCH 151/357] remove unneccesary code --- src/backends/pgfplotsx.jl | 49 --------------------------------------- 1 file changed, 49 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 0764606e..07da6b69 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -368,55 +368,6 @@ function pgfx_add_annotation!(o, x, y, val, thickness_scaling = 1) "{$(val.str).};" ]) end -## -------------------------------------------------------------------------------------- -# TODO: translate these if needed -function pgfx_fillrange_series(series, i, fillrange, args...) - st = series[:seriestype] - opt = PGFPlotsX.Options() - push!(opt, "line width" => 0) - push!(opt, "draw opacity" => 0) - opt = merge(opt, pgfx_fillstyle(series, i)) - opt = merge(opt, pgfx_marker(series, i)) - push!(opt, "forget plot" => nothing) - if haskey(_pgfx_series_extrastyle, st) - push!(opt, _pgfx_series_extrastyle[st] => nothing) - end - func = is3d(series) ? PGFPlotsX.Plot3 : PGFPlotsX.Plot - return func(opt, PGFPlotsX.Coordinates(pgfx_fillrange_args(fillrange, args...)...)) -end - -function pgfx_fillrange_args(fillrange, x, y) - n = length(x) - x_fill = [x; x[n:-1:1]; x[1]] - y_fill = [y; _cycle(fillrange, n:-1:1); y[1]] - return x_fill, y_fill -end - -function pgfx_fillrange_args(fillrange, x, y, z) - n = length(x) - x_fill = [x; x[n:-1:1]; x[1]] - y_fill = [y; y[n:-1:1]; x[1]] - z_fill = [z; _cycle(fillrange, n:-1:1); z[1]] - return x_fill, y_fill, z_fill -end - -function pgfx_fill_legend_hack(plotattributes, args) - opt = PGFPlotsX.Options("area legend" => nothing) - opt = merge(opt, pgfx_linestyle(plotattributes, 1)) - opt = merge(opt, pgfx_marker(plotattributes, 1)) - opt = merge(opt, pgfx_fillstyle(plotattributes, 1)) - st = plotattributes[:seriestype] - func = if st == :path3d - PGFPlotsX.Plot3 - else - PGFPlotsX.Plot - end - if st == :scatter - push!(opt, "only marks" => nothing) - end - return func(opt, PGFPlotsX.Coordinates(([arg[1]] for arg in args)...)) -end - # -------------------------------------------------------------------------------------- function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) axis = sp[Symbol(letter,:axis)] From 1e23b8d475a277c280b84dac5b09df9ea62a26c2 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 14:37:39 +0100 Subject: [PATCH 152/357] basic contour --- src/backends/pgfplotsx.jl | 66 ++++++++++++++++++++++----------------- test/test_pgfplotsx.jl | 9 +++++- 2 files changed, 46 insertions(+), 29 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 07da6b69..bdb7b7f9 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,4 +1,5 @@ -# PGFPlotsX.print_tex(io::IO, data::Symbol) = PGFPlotsX.print_tex(io, string(data)) +using Contour: Contour +# PGFPlotsX.print_tex(io::IO, data::ColorGradient) = write(io, pgfx_colormap(data)) Base.@kwdef mutable struct PGFPlotsXPlot is_created::Bool = false was_shown::Bool = false @@ -132,7 +133,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) ) # function args args = if st == :contour - opt[:z].surf, opt[:x], opt[:y] + opt[:x], opt[:y], opt[:z].surf' elseif is3d(st) opt[:x], opt[:y], opt[:z] elseif st == :straightline @@ -158,35 +159,44 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) if haskey(_pgfx_series_extrastyle, st) push!(series_opt, _pgfx_series_extrastyle[st] => nothing) end - # treat segments - segments = iter_segments(series) - segment_opt = PGFPlotsX.Options() - for (i, rng) in enumerate(segments) - seg_args = (arg[rng] for arg in args) - segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) - segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) - if st == :shape || series[:fillrange] !== nothing - segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) - end - segment_plot = series_func( - merge(series_opt, segment_opt), - PGFPlotsX.Coordinates(seg_args...), - series[:fillrange] !== nothing ? "\\closedcycle" : "{}" + if st == :contour + surface_opt = PGFPlotsX.Options( + "contour prepared" => nothing ) - push!(axis, segment_plot) - # add to legend? - if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) - push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) + surface_plot = series_func( + # merge(series_opt, surface_opt), + surface_opt, + PGFPlotsX.Table(Contour.contours(args...)) + ) + push!(axis, surface_plot) + else + # treat segments + segments = iter_segments(series) + segment_opt = PGFPlotsX.Options() + for (i, rng) in enumerate(segments) + seg_args = (arg[rng] for arg in args) + segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) + segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) + if st == :shape || series[:fillrange] !== nothing + segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) + end + segment_plot = series_func( + merge(series_opt, segment_opt), + PGFPlotsX.Coordinates(seg_args...), + series[:fillrange] !== nothing ? "\\closedcycle" : "{}" ) + push!(axis, segment_plot) + # add to legend? + if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) + push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) + ) + end + 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 - # TODO: different seriestypes, histogramms, contours, etc. - # TODO: colorbars - # TODO: gradients - # add series annotations - anns = series[:series_annotations] - for (xi,yi,str,fnt) in EachAnn(anns, series[:x], series[:y]) - pgfx_add_annotation!(series_plot, xi, yi, PlotText(str, fnt), pgfx_thickness_scaling(series)) end end if ispolar(sp) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 68002222..de775c32 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -65,6 +65,13 @@ end r = abs.(0.1 * randn(100) + sin.(3Θ)) plot(Θ, r, proj=:polar, m=2) end # testset + @testset "Drawing shapes" begin + verts = [(-1.0, 1.0), (-1.28, 0.6), (-0.2, -1.4), (0.2, -1.4), (1.28, 0.6), (1.0, 1.0), (-1.0, 1.0), (-0.2, -0.6), (0.0, -0.2), (-0.4, 0.6), (1.28, 0.6), (0.2, -1.4), (-0.2, -1.4), (0.6, 0.2), (-0.2, 0.2), (0.0, -0.2), (0.2, 0.2), (-0.2, -0.6)] + x = 0.1:0.2:0.9 + y = 0.7 * rand(5) .+ 0.15 + plot(x, y, line=(3, :dash, :lightblue), marker=(Shape(verts), 30, RGBA(0, 0, 0, 0.2)), bg=:pink, fg=:darkblue, xlim=(0, 1), ylim=(0, 1), leg=false) + # TODO: draw those polygons + end # testset @testset "Histogram 2D" begin histogram2d(randn(10000), randn(10000), nbins=20) # TODO: totally broken, errors also for pgfplots @@ -78,8 +85,8 @@ end X = repeat(reshape(x, 1, :), length(y), 1) Y = repeat(y, 1, length(x)) Z = map(f, X, Y) - p1 = contour(x, y, f, fill=true) p2 = contour(x, y, Z) + p1 = contour(x, y, f, fill=true) plot(p1, p2) # TODO: totally broken, also errors for pgfplots end # testset From 31bc74e2b1b5dc7ec2c9eaf8b78d3648f11229e8 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 15:07:48 +0100 Subject: [PATCH 153/357] filled contours are difficult --- src/backends/pgfplotsx.jl | 20 ++++++++++++++++---- test/test_pgfplotsx.jl | 2 +- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index bdb7b7f9..a523cc48 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -151,7 +151,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) else series_func = PGFPlotsX.Plot end - if series[:fillrange] !== nothing + if series[:fillrange] !== nothing && st != :contour series_opt = merge(series_opt, pgfx_fillstyle(opt)) push!(series_opt, "area legend" => nothing) end @@ -160,13 +160,25 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) push!(series_opt, _pgfx_series_extrastyle[st] => nothing) end if st == :contour + if !isfilledcontour(series) surface_opt = PGFPlotsX.Options( - "contour prepared" => nothing - ) + "contour prepared" => PGFPlotsX.Options( + "labels" => opt[:contour_labels], + ) + ) + else + error("PGFPlotsX backend does not support filled contours at the moment.") + surface_opt = PGFPlotsX.Options( + "contour filled" => PGFPlotsX.Options( + # "levels" => opt[:levels], + # "labels" => opt[:contour_labels], + ) + ) + end surface_plot = series_func( # merge(series_opt, surface_opt), surface_opt, - PGFPlotsX.Table(Contour.contours(args...)) + PGFPlotsX.Table(Contour.contours(args..., opt[:levels])) ) push!(axis, surface_plot) else diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index de775c32..e0a2eacd 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -88,6 +88,6 @@ end p2 = contour(x, y, Z) p1 = contour(x, y, f, fill=true) plot(p1, p2) - # TODO: totally broken, also errors for pgfplots + # TODO: filled contours end # testset end # testset From 48c04a5a44150202557f85f1ff317c7409b54c3f Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 15:45:35 +0100 Subject: [PATCH 154/357] more than one colorbar --- src/backends/pgfplotsx.jl | 42 +++++++++++---------------------------- test/test_pgfplotsx.jl | 12 +++++++++++ 2 files changed, 24 insertions(+), 30 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index a523cc48..54f8b341 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,4 +1,5 @@ using Contour: Contour +using StatsBase: Histogram, fit # PGFPlotsX.print_tex(io::IO, data::ColorGradient) = write(io, pgfx_colormap(data)) Base.@kwdef mutable struct PGFPlotsXPlot is_created::Bool = false @@ -33,7 +34,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) ) ) end - pushed_colormap = false for sp in plt.subplots bb = bbox(sp) cstr = plot_color(sp[:background_color_legend]) @@ -65,36 +65,16 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) pgfx_axis!(axis_opt, sp, letter) 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 - if !pushed_colormap - PGFPlotsX.push_preamble!(pgfx_plot.the_plot, """\\pgfplotsset{ - colormap={plots}{$(pgfx_colormap(series.plotattributes[col]))}, - }""") - pushed_colormap = true - push!(axis_opt, - "colorbar" => nothing, - "colormap name" => "plots", - ) - end - - # goto is needed to break out of col and series for - @goto colorbar_end - end - end + if hascolorbar(sp) + PGFPlotsX.push_preamble!(pgfx_plot.the_plot, """\\pgfplotsset{ + colormap={plots$(sp.attr[:subplot_index])}{$(pgfx_colormap(series.plotattributes[col]))}, + }""") + pushed_colormap = true + push!(axis_opt, + "colorbar" => nothing, + "colormap name" => "plots$(sp.attr[:subplot_index])", + ) end - @label colorbar_end push!(axis_opt, "colorbar style" => PGFPlotsX.Options( "title" => sp[:colorbar_title], @@ -181,6 +161,8 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) PGFPlotsX.Table(Contour.contours(args..., opt[:levels])) ) push!(axis, surface_plot) + elseif st == :histogram2d + hist_ else # treat segments segments = iter_segments(series) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index e0a2eacd..3d96360d 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -90,4 +90,16 @@ end plot(p1, p2) # TODO: filled contours end # testset + @testset "Varying colors" begin + t = range(0, stop=1, length=100) + θ = (6π) .* t + x = t .* cos.(θ) + y = t .* sin.(θ) + p1 = plot(x, y, line_z=t, linewidth=3, legend=false) + p2 = scatter(x, y, marker_z=((x, y)->begin + x + y + end), color=:bluesreds, legend=false) + plot(p1, p2) + # TODO: handle gradients as color + end # testset end # testset From d47e8c0f44fe597300f4c72913af48af3450a9a8 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 16:07:08 +0100 Subject: [PATCH 155/357] simplifications --- src/backends/pgfplotsx.jl | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 54f8b341..33a2d98a 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -78,6 +78,8 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) 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] ) ) axisf = if sp[:projection] == :polar @@ -93,20 +95,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) ) for series in series_list(sp) opt = series.plotattributes - if opt[:marker_z] !== nothing - cbar_style = axis_opt["colorbar style"] - if !haskey( cbar_style.dict, "point meta max" ) - append!( axis_opt["colorbar style"], - ( - "point meta max" => maximum(opt[:marker_z]), - "point meta min" => minimum(opt[:marker_z]) - ) - ) - else - cbar_style["point meta max"] = maximum(opt[:marker_z]) - cbar_style["point meta min"] = minimum(opt[:marker_z]) - end - end st = series[:seriestype] series_opt = PGFPlotsX.Options( "color" => opt[:linecolor], @@ -147,7 +135,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) ) ) else - error("PGFPlotsX backend does not support filled contours at the moment.") + notimpl() surface_opt = PGFPlotsX.Options( "contour filled" => PGFPlotsX.Options( # "levels" => opt[:levels], From 7bf89d86141e4f3c9629fd5138f7053755daab2d Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 16:46:15 +0100 Subject: [PATCH 156/357] subplot annotations --- src/backends/pgfplotsx.jl | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 33a2d98a..325d1047 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -18,6 +18,7 @@ function Base.push!(pgfx_plot::PGFPlotsXPlot, item) end function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) + # TODO: annotations! does not trigger _series_added ... if !pgfx_plot.is_created cols, rows = size(plt.layout.grid) the_plot = PGFPlotsX.TikzPicture() @@ -180,6 +181,11 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) 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) + end end if ispolar(sp) axes = the_plot From 0e94e572633074d10bdb496e4bf9db89cda18b69 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 16:52:35 +0100 Subject: [PATCH 157/357] total plot size --- src/backends/pgfplotsx.jl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 325d1047..267915d7 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -24,13 +24,16 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) the_plot = PGFPlotsX.TikzPicture() # the combination of groupplot and polaraxis is broken in pgfplots 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)), - ) + ), + "height" => pl_height > 0 ? string(pl_height)*"px" : "{}", + "width" => pl_width > 0 ? string(pl_width)*"px" : "{}", ) ) ) From 4dd4d5eb5f0a490813192d0f78d24c7d4f588abb Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 19:10:58 +0100 Subject: [PATCH 158/357] working heatmap --- src/backends.jl | 2 +- src/backends/pgfplotsx.jl | 75 ++++++++++++++++++++++++++++++++------- test/test_pgfplotsx.jl | 15 +++++++- 3 files changed, 77 insertions(+), 15 deletions(-) diff --git a/src/backends.jl b/src/backends.jl index d2ae4894..87f4dda8 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -711,7 +711,7 @@ const _pgfplotsx_attr = merge_with_base_supported([ # :contour, :path3d, :scatter3d, :surface, :wireframe, :volume, # :shape # ] -const _pgfplotsx_seriestype = [:path, :path3d, :scatter, :steppre, :stepmid, :steppost, :histogram2d, :ysticks, :xsticks, :contour, :shape, :straightline,] +const _pgfplotsx_seriestype = [:path, :path3d, :scatter, :steppre, :heatmap, :stepmid, :steppost, :histogram2d, :ysticks, :xsticks, :contour, :shape, :straightline,] const _pgfplotsx_style = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] const _pgfplotsx_marker = [:none, :auto, :circle, :rect, :diamond, :utriangle, :dtriangle, :ltriangle, :rtriangle, :cross, :xcross, :star5, :pentagon, :hline, :vline, Shape] const _pgfplotsx_scale = [:identity, :ln, :log2, :log10] diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 267915d7..81cabf23 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -9,6 +9,19 @@ end pgfx_axes(pgfx_plot::PGFPlotsXPlot) = pgfx_plot.the_plot.elements[1].elements[1].contents +function surface_to_vecs(x::AVec, y::AVec, s::Union{AMat, Surface}) + a = Array(s) + xn = Vector{eltype(x)}(undef, length(a)) + yn = Vector{eltype(y)}(undef, length(a)) + zn = Vector{eltype(s)}(undef, length(a)) + for (n, (i, j)) in enumerate(Tuple.(CartesianIndices(a))) + xn[n] = x[j] + yn[n] = y[i] + zn[n] = a[i,j] + end + return xn, yn, zn +end + function Base.show(io::IO, mime::MIME, pgfx_plot::PGFPlotsXPlot) show(io::IO, mime, pgfx_plot.the_plot) end @@ -69,16 +82,32 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) pgfx_axis!(axis_opt, sp, letter) end end - if hascolorbar(sp) - PGFPlotsX.push_preamble!(pgfx_plot.the_plot, """\\pgfplotsset{ - colormap={plots$(sp.attr[:subplot_index])}{$(pgfx_colormap(series.plotattributes[col]))}, - }""") - pushed_colormap = true - push!(axis_opt, - "colorbar" => nothing, - "colormap name" => "plots$(sp.attr[:subplot_index])", - ) - 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 + PGFPlotsX.push_preamble!(pgfx_plot.the_plot, """\\pgfplotsset{ + colormap={plots$(sp.attr[:subplot_index])}{$(pgfx_colormap(series.plotattributes[col]))}, + }""") + push!(axis_opt, + "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 push!(axis_opt, "colorbar style" => PGFPlotsX.Options( "title" => sp[:colorbar_title], @@ -101,11 +130,13 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) opt = series.plotattributes st = series[:seriestype] series_opt = PGFPlotsX.Options( - "color" => opt[:linecolor], + "color" => single_color(opt[:linecolor]), ) # function args args = if st == :contour opt[:x], opt[:y], opt[:z].surf' + elseif st == :heatmap + surface_to_vecs(opt[:x], opt[:y], opt[:z]) elseif is3d(st) opt[:x], opt[:y], opt[:z] elseif st == :straightline @@ -153,8 +184,21 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) PGFPlotsX.Table(Contour.contours(args..., opt[:levels])) ) push!(axis, surface_plot) - elseif st == :histogram2d - hist_ + elseif st == :heatmap + # TODO: global view setting + push!(axis.options, + "view" => "{0}{90}", + "shader" => "flat corner", + ) + heatmap_opt = PGFPlotsX.Options( + "surf" => nothing, + "mesh/rows" => length(opt[:x]) + ) + heatmap_plot = PGFPlotsX.Plot3( + merge(series_opt, heatmap_opt), + PGFPlotsX.Table(args) + ) + push!(axis, heatmap_plot) else # treat segments segments = iter_segments(series) @@ -273,6 +317,11 @@ function pgfx_colormap(grad::ColorGradient) @sprintf("rgb=(%.8f,%.8f,%.8f)", red(c), green(c), blue(c)) end,"\n") end +function pgfx_colormap(grad::Vector{<:Colorant}) + join(map(grad) do c + @sprintf("rgb=(%.8f,%.8f,%.8f)", red(c), green(c), blue(c)) + end,"\n") +end function pgfx_framestyle(style::Symbol) if style in _pgfx_framestyles diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 3d96360d..aa21ef71 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -74,7 +74,20 @@ end end # testset @testset "Histogram 2D" begin histogram2d(randn(10000), randn(10000), nbins=20) - # TODO: totally broken, errors also for pgfplots + # TODO: should work, when heatmaps works? + end # testset + @testset "Heatmap" begin + xs = [string("x", i) for i = 1:10] + ys = [string("y", i) for i = 1:4] + z = float((1:4) * reshape(1:10, 1, :)) + pgfx_plot = heatmap(xs, ys, z, aspect_ratio=1) + Plots._update_plot_object(pgfx_plot) + if @test_nowarn(haskey(Plots.pgfx_axes(pgfx_plot.o)[1].options.dict, "colorbar") == true) + @test Plots.pgfx_axes(pgfx_plot.o)[1]["colorbar"] === nothing + @test Plots.pgfx_axes(pgfx_plot.o)[1]["colormap name"] == "plots1" + end + # TODO: wrong colors + # TODO: lines instead of patches end # testset @testset "Contours" begin x = 1:0.5:20 From 5694ce53f65b12994d70b40c142f315f3cbe37c8 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 22:28:36 +0100 Subject: [PATCH 159/357] 3D view --- src/backends/pgfplotsx.jl | 4 ++++ test/test_pgfplotsx.jl | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 81cabf23..e2c08795 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -115,6 +115,10 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) "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 # TODO: this errors for some reason # push!(axis_opt, "xmin" => 90) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index aa21ef71..125ee529 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -86,8 +86,6 @@ end @test Plots.pgfx_axes(pgfx_plot.o)[1]["colorbar"] === nothing @test Plots.pgfx_axes(pgfx_plot.o)[1]["colormap name"] == "plots1" end - # TODO: wrong colors - # TODO: lines instead of patches end # testset @testset "Contours" begin x = 1:0.5:20 From e2306868512525674fa29baa3d160ea9ee1a9779 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 22:34:14 +0100 Subject: [PATCH 160/357] fix gradient scatter plot --- src/backends/pgfplotsx.jl | 2 +- test/test_pgfplotsx.jl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index e2c08795..560b559a 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -364,7 +364,7 @@ end function pgfx_linestyle(plotattributes, i = 1) lw = pgfx_thickness_scaling(plotattributes) * get_linewidth(plotattributes, i) - lc = get_linecolor(plotattributes, i) + lc = single_color(get_linecolor(plotattributes, i)) la = get_linealpha(plotattributes, i) ls = get_linestyle(plotattributes, i) return pgfx_linestyle(lw, lc, la, ls) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 125ee529..a2a96681 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -111,6 +111,6 @@ end x + y end), color=:bluesreds, legend=false) plot(p1, p2) - # TODO: handle gradients as color + # TODO: questionable tiling end # testset end # testset From 04e5ff7ebacb156443e183768a5e8642100dc672 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 22 Nov 2019 00:23:47 +0100 Subject: [PATCH 161/357] quiver plots --- src/backends/pgfplotsx.jl | 44 ++++++++++++++++++++++++++++++++++++--- test/test_pgfplotsx.jl | 12 +++++++++++ 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 560b559a..616c2756 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -5,6 +5,11 @@ Base.@kwdef mutable struct PGFPlotsXPlot is_created::Bool = false was_shown::Bool = false the_plot::PGFPlotsX.TikzDocument = PGFPlotsX.TikzDocument() + function PGFPlotsXPlot(is_created, was_shown, the_plot) + pgfx_plot = new(is_created, was_shown, the_plot) + PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usetikzlibrary{arrows.meta}") + pgfx_plot + end end pgfx_axes(pgfx_plot::PGFPlotsXPlot) = pgfx_plot.the_plot.elements[1].elements[1].contents @@ -214,9 +219,21 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) if st == :shape || series[:fillrange] !== nothing segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) end + x, y = collect(seg_args) + coordinates = if opt[:quiver] !== nothing + push!(segment_opt, "quiver" => PGFPlotsX.Options( + "u" => "\\thisrow{u}", + "v" => "\\thisrow{v}", + pgfx_arrow(opt[:arrow]) => nothing + ), + ) + PGFPlotsX.Table([:x => x, :y => y, :u => opt[:quiver][1], :v => opt[:quiver][2]]) + else + PGFPlotsX.Coordinates(seg_args...) + end segment_plot = series_func( merge(series_opt, segment_opt), - PGFPlotsX.Coordinates(seg_args...), + coordinates, series[:fillrange] !== nothing ? "\\closedcycle" : "{}" ) push!(axis, segment_plot) @@ -255,7 +272,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end ## - const _pgfplotsx_linestyles = KW( :solid => "solid", :dash => "dashed", @@ -316,6 +332,27 @@ const _pgfx_annotation_halign = KW( ## -------------------------------------------------------------------------------------- # Generates a colormap for pgfplots based on a ColorGradient # TODO: maybe obsolete +pgfx_arrow(::Nothing) = "-" +function pgfx_arrow( arr::Arrow ) + components = String[] + head = String[] + push!(head, "{stealth[length = $(arr.headlength)pt, width = $(arr.headwidth)pt") + if arr.style == :open + push!(head, ", open") + end + push!(head, "]}") + head = join(head, "") + if arr.side == :both || arr.side == :tail + push!( components, head ) + end + push!(components, "-") + if arr.side == :both || arr.side == :head + push!( components, head ) + end + components = join( components, "" ) + return "every arrow/.append style={$(components)}" +end + function pgfx_colormap(grad::ColorGradient) join(map(grad.colors) do c @sprintf("rgb=(%.8f,%.8f,%.8f)", red(c), green(c), blue(c)) @@ -561,7 +598,8 @@ end # to fit ticks, tick labels, guides, colorbars, etc. function _update_min_padding!(sp::Subplot{PGFPlotsXBackend}) # TODO: make padding more intelligent - sp.minpad = (20mm, 5mm, 2mm, 10mm) + # order: right, top, left, bottom + sp.minpad = (20mm, 12mm, 2mm, 10mm) end function _create_backend_figure(plt::Plot{PGFPlotsXBackend}) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index a2a96681..35a1b05f 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -113,4 +113,16 @@ end plot(p1, p2) # TODO: questionable tiling end # testset + @testset "Framestyles" begin + scatter(fill(randn(10), 6), fill(randn(10), 6), framestyle=[:box :semi :origin :zerolines :grid :none], title=[":box" ":semi" ":origin" ":zerolines" ":grid" ":none"], color=permutedims(1:6), layout=6, label="", markerstrokewidth=0, ticks=-2:2) + # TODO: support :semi + end # testset + @testset "Quiver" begin + x = -2pi:0.2:2*pi + y = sin.(x) + + u = ones(length(x)) + v = cos.(x) + plot( x, y, quiver = (u, v), arrow = true ) + end # testset end # testset From 5482cfac3f2b789075360bb8b2b86ccd9068256b Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 22 Nov 2019 00:45:14 +0100 Subject: [PATCH 162/357] extra styles for 3dTypes --- src/backends.jl | 13 ++++++------- src/backends/pgfplotsx.jl | 6 +++++- test/test_pgfplotsx.jl | 1 + 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/backends.jl b/src/backends.jl index 87f4dda8..1d4b3482 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -705,13 +705,12 @@ const _pgfplotsx_attr = merge_with_base_supported([ :camera, :contour_labels, ]) -# const _pgfplotsx_seriestype = [ -# :path, :scatter, :straightline, -# :heatmap, :pie, :image, -# :contour, :path3d, :scatter3d, :surface, :wireframe, :volume, -# :shape -# ] -const _pgfplotsx_seriestype = [:path, :path3d, :scatter, :steppre, :heatmap, :stepmid, :steppost, :histogram2d, :ysticks, :xsticks, :contour, :shape, :straightline,] +const _pgfplotsx_seriestype = + [:path, :scatter, :straightline, + :path3d, :scatter3d, :surface, :wireframe, :volume, + :heatmap, :contour, :histogram2d, + :shape, + :steppre, :stepmid, :steppost, :ysticks, :xsticks] const _pgfplotsx_style = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] const _pgfplotsx_marker = [:none, :auto, :circle, :rect, :diamond, :utriangle, :dtriangle, :ltriangle, :rtriangle, :cross, :xcross, :star5, :pentagon, :hline, :vline, Shape] const _pgfplotsx_scale = [:identity, :ln, :log2, :log10] diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 616c2756..af67917b 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -316,7 +316,11 @@ const _pgfx_series_extrastyle = KW( :ysticks => "ycomb", :xsticks => "xcomb", :scatter => "only marks", - :shape => "area legends" + :shape => "area legends", + :scatter3D => "only marks" + :surface => "surf", + :wireframe => "mesh", + :volume => "patch" ) const _pgfx_framestyles = [:box, :axes, :origin, :zerolines, :grid, :none] diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 35a1b05f..5af30606 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -124,5 +124,6 @@ end u = ones(length(x)) v = cos.(x) plot( x, y, quiver = (u, v), arrow = true ) + # TODO: could adjust limits to fit arrows if too long, but how? end # testset end # testset From 3b56977c498697e241b206acaba4a1403cbc9e30 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 22 Nov 2019 00:54:16 +0100 Subject: [PATCH 163/357] fix arrow = false --- 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 af67917b..f97f6e4a 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -336,7 +336,7 @@ const _pgfx_annotation_halign = KW( ## -------------------------------------------------------------------------------------- # Generates a colormap for pgfplots based on a ColorGradient # TODO: maybe obsolete -pgfx_arrow(::Nothing) = "-" +pgfx_arrow(::Nothing) = "every arrow/.append style={-}" function pgfx_arrow( arr::Arrow ) components = String[] head = String[] From e176c6c315c377842212821d8acd30ebdd27ccc7 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 22 Nov 2019 00:58:03 +0100 Subject: [PATCH 164/357] add patchlibrary --- src/backends/pgfplotsx.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index f97f6e4a..90d97d35 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -8,6 +8,7 @@ Base.@kwdef mutable struct PGFPlotsXPlot function PGFPlotsXPlot(is_created, was_shown, the_plot) pgfx_plot = new(is_created, was_shown, the_plot) PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usetikzlibrary{arrows.meta}") + PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usepgfplotslibrary{patchplots}") pgfx_plot end end From fa324561dacbcf2178f82714123b3326dbaccd6e Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 22 Nov 2019 13:50:18 +0100 Subject: [PATCH 165/357] restructure --- src/backends/pgfplotsx.jl | 232 ++++++++++++++++++++++---------------- test/test_pgfplotsx.jl | 6 + 2 files changed, 138 insertions(+), 100 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 90d97d35..17129cbd 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -142,24 +142,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) series_opt = PGFPlotsX.Options( "color" => single_color(opt[:linecolor]), ) - # function args - args = if st == :contour - opt[:x], opt[:y], opt[:z].surf' - elseif st == :heatmap - surface_to_vecs(opt[:x], opt[:y], opt[:z]) - elseif is3d(st) - opt[:x], opt[:y], opt[:z] - elseif st == :straightline - straightline_data(series) - elseif st == :shape - shape_data(series) - elseif ispolar(sp) - theta, r = opt[:x], opt[:y] - rad2deg.(theta), r - else - opt[:x], opt[:y] - end - if is3d(series) + if is3d(series) || st == :heatmap series_func = PGFPlotsX.Plot3 else series_func = PGFPlotsX.Plot @@ -168,82 +151,56 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) series_opt = merge(series_opt, pgfx_fillstyle(opt)) push!(series_opt, "area legend" => nothing) end - # include additional style - if haskey(_pgfx_series_extrastyle, st) - push!(series_opt, _pgfx_series_extrastyle[st] => nothing) - end - if st == :contour - if !isfilledcontour(series) - surface_opt = PGFPlotsX.Options( - "contour prepared" => PGFPlotsX.Options( - "labels" => opt[:contour_labels], - ) - ) - else - notimpl() - surface_opt = PGFPlotsX.Options( - "contour filled" => PGFPlotsX.Options( - # "levels" => opt[:levels], - # "labels" => opt[:contour_labels], - ) - ) - end - surface_plot = series_func( - # merge(series_opt, surface_opt), - surface_opt, - PGFPlotsX.Table(Contour.contours(args..., opt[:levels])) - ) - push!(axis, surface_plot) - elseif st == :heatmap - # TODO: global view setting + if st == :heatmap push!(axis.options, "view" => "{0}{90}", "shader" => "flat corner", ) - heatmap_opt = PGFPlotsX.Options( - "surf" => nothing, - "mesh/rows" => length(opt[:x]) - ) - heatmap_plot = PGFPlotsX.Plot3( - merge(series_opt, heatmap_opt), - PGFPlotsX.Table(args) - ) - push!(axis, heatmap_plot) - else - # treat segments - segments = iter_segments(series) - segment_opt = PGFPlotsX.Options() - for (i, rng) in enumerate(segments) - seg_args = (arg[rng] for arg in args) - segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) + end + # treat segments + segments = if iscontour(series) || st == :heatmap + iter_segments(series[:x], series[:y]) + else + iter_segments(series) + end + segment_opt = PGFPlotsX.Options() + for (i, rng) in enumerate(segments) + segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) + if !iscontour(series) && !(st == :heatmap) segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) - if st == :shape || series[:fillrange] !== nothing - segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) - end - x, y = collect(seg_args) - coordinates = if opt[:quiver] !== nothing - push!(segment_opt, "quiver" => PGFPlotsX.Options( - "u" => "\\thisrow{u}", - "v" => "\\thisrow{v}", - pgfx_arrow(opt[:arrow]) => nothing - ), - ) - PGFPlotsX.Table([:x => x, :y => y, :u => opt[:quiver][1], :v => opt[:quiver][2]]) - else - PGFPlotsX.Coordinates(seg_args...) - end - segment_plot = series_func( - merge(series_opt, segment_opt), - coordinates, - series[:fillrange] !== nothing ? "\\closedcycle" : "{}" + end + if st == :shape || series[:fillrange] !== nothing + segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) + end + if iscontour(series) + if !isfilledcontour(series) + push!(series_opt, + "contour prepared" => PGFPlotsX.Options( + "labels" => opt[:contour_labels], + ) ) - push!(axis, segment_plot) - # add to legend? - if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) - push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) + else + notimpl() + push!(series_opt, + "contour filled" => PGFPlotsX.Options( + # "levels" => opt[:levels], + # "labels" => opt[:contour_labels], + ) ) end end + coordinates = pgfx_series_coordinates!( sp, st, segment_opt, opt, rng ) + segment_plot = series_func( + merge(series_opt, segment_opt), + coordinates, + series[:fillrange] !== nothing ? "\\closedcycle" : "{}" + ) + push!(axis, segment_plot) + # add to legend? + if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) + push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) + ) + end # add series annotations anns = series[:series_annotations] for (xi,yi,str,fnt) in EachAnn(anns, series[:x], series[:y]) @@ -271,6 +228,96 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) pgfx_plot.is_created = true end end +## seriestype specifics +@inline function pgfx_series_coordinates!(sp, st, segment_opt, opt, rng) + # function args + args = if st == :contour + opt[:x], opt[:y], opt[:z].surf' + elseif st == :heatmap + surface_to_vecs(opt[:x], opt[:y], opt[:z]) + elseif is3d(st) + opt[:x], opt[:y], opt[:z] + elseif st == :straightline + straightline_data(series) + elseif st == :shape + shape_data(series) + elseif ispolar(sp) + theta, r = opt[:x], opt[:y] + rad2deg.(theta), r + else + opt[:x], opt[:y] + end + seg_args = if st == :contour || st == :heatmap + args + else + (arg[rng] for arg in args) + end + if opt[:quiver] !== nothing + push!(segment_opt, "quiver" => PGFPlotsX.Options( + "u" => "\\thisrow{u}", + "v" => "\\thisrow{v}", + pgfx_arrow(opt[:arrow]) => nothing + ), + ) + x, y = collect(seg_args) + return PGFPlotsX.Table([:x => x, :y => y, :u => opt[:quiver][1], :v => opt[:quiver][2]]) + else + pgfx_series_coordinates!(Val(st), segment_opt, opt, seg_args) + end +end +function pgfx_series_coordinates!(st_val::Union{Val{:path}, Val{:path3d}}, segment_opt, opt, args) + return PGFPlotsX.Coordinates(args...) +end +function pgfx_series_coordinates!(st_val::Union{Val{:scatter}, Val{:scatter3d}}, segment_opt, opt, args) + push!( segment_opt, "only marks" => nothing ) + return PGFPlotsX.Coordinates(args...) +end +function pgfx_series_coordinates!(st_val::Val{:heatmap}, segment_opt, opt, args) + push!(segment_opt, + "surf" => nothing, + "mesh/rows" => length(opt[:x]) + ) + return PGFPlotsX.Table(args...) +end +function pgfx_series_coordinates!(st_val::Val{:stepre}, segment_opt, opt, args) + push!( segment_opt, "const plot mark right" => nothing ) + return PGFPlotsX.Coordinates(args...) +end +function pgfx_series_coordinates!(st_val::Val{:stepmid}, segment_opt, opt, args) + push!( segment_opt, "const plot mark mid" => nothing ) + return PGFPlotsX.Coordinates(args...) +end +function pgfx_series_coordinates!(st_val::Val{:steppost}, segment_opt, opt, args) + push!( segment_opt, "const plot" => nothing ) + return PGFPlotsX.Coordinates(args...) +end +function pgfx_series_coordinates!(st_val::Union{Val{:ysticks},Val{:sticks}}, segment_opt, opt, args) + push!( segment_opt, "ycomb" => nothing ) + return PGFPlotsX.Coordinates(args...) +end +function pgfx_series_coordinates!(st_val::Val{:xsticks}, segment_opt, opt, args) + push!( segment_opt, "xcomb" => nothing ) + return PGFPlotsX.Coordinates(args...) +end +function pgfx_series_coordinates!(st_val::Val{:surface}, segment_opt, opt, args) + push!( segment_opt, "surf" => nothing ) + return PGFPlotsX.Coordinates(args...) +end +function pgfx_series_coordinates!(st_val::Val{:volume}, segment_opt, opt, args) + push!( segment_opt, "patch" => nothing ) + return PGFPlotsX.Coordinates(args...) +end +function pgfx_series_coordinates!(st_val::Val{:wireframe}, segment_opt, opt, args) + push!( segment_opt, "mesh" => nothing ) + return PGFPlotsX.Coordinates(args...) +end +function pgfx_series_coordinates!(st_val::Val{:shape}, segment_opt, opt, args) + push!( segment_opt, "area legends" => nothing, "patch" => nothing ) + return PGFPlotsX.Coordinates(args...) +end +function pgfx_series_coordinates!(st_val::Val{:contour}, segment_opt, opt, args) + return PGFPlotsX.Table(Contour.contours(args..., opt[:levels])) +end ## const _pgfplotsx_linestyles = KW( @@ -309,21 +356,6 @@ const _pgfplotsx_legend_pos = KW( :outertopright => "outer north east", ) -const _pgfx_series_extrastyle = KW( - :steppre => "const plot mark right", - :stepmid => "const plot mark mid", - :steppost => "const plot", - :sticks => "ycomb", - :ysticks => "ycomb", - :xsticks => "xcomb", - :scatter => "only marks", - :shape => "area legends", - :scatter3D => "only marks" - :surface => "surf", - :wireframe => "mesh", - :volume => "patch" -) - const _pgfx_framestyles = [:box, :axes, :origin, :zerolines, :grid, :none] const _pgfx_framestyle_defaults = Dict(:semi => :box) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 5af30606..b8f6b146 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -126,4 +126,10 @@ end plot( x, y, quiver = (u, v), arrow = true ) # TODO: could adjust limits to fit arrows if too long, but how? end # testset + @testset "Annotations" begin + y = rand(10) + plot(y, annotations=(3, y[3], Plots.text("this is \\#3", :left)), leg=false) + annotate!([(5, y[5], Plots.text("this is \\#5", 16, :red, :center)), (10, y[10], Plots.text("this is \\#10", :right, 20, "courier"))]) + scatter!(range(2, stop=8, length=6), rand(6), marker=(50, 0.2, :orange), series_annotations=["series", "annotations", "map", "to", "series", Plots.text("data", :green)]) + end # testset end # testset From 229f74e370b304ae7babf9dd3fc58b99c906549c Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 22 Nov 2019 14:05:34 +0100 Subject: [PATCH 166/357] surface plots --- src/backends/pgfplotsx.jl | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 17129cbd..ecf0833a 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -166,7 +166,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) segment_opt = PGFPlotsX.Options() for (i, rng) in enumerate(segments) segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) - if !iscontour(series) && !(st == :heatmap) + if opt[:markershape] != :none #|| !iscontour(series) && !(st == :heatmap) segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) end if st == :shape || series[:fillrange] !== nothing @@ -233,7 +233,10 @@ end # function args args = if st == :contour opt[:x], opt[:y], opt[:z].surf' - elseif st == :heatmap + elseif st == :heatmap || st == :surface + @show opt[:x] + @show opt[:y] + @show opt[:z] surface_to_vecs(opt[:x], opt[:y], opt[:z]) elseif is3d(st) opt[:x], opt[:y], opt[:z] @@ -300,7 +303,9 @@ function pgfx_series_coordinates!(st_val::Val{:xsticks}, segment_opt, opt, args) return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Val{:surface}, segment_opt, opt, args) - push!( segment_opt, "surf" => nothing ) + push!( segment_opt, "surf" => nothing, + "mesh/rows" => length(opt[:x]) + ) return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Val{:volume}, segment_opt, opt, args) From 1c854519c87a78d932565ecb03c379853c6327b7 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 22 Nov 2019 14:08:45 +0100 Subject: [PATCH 167/357] wireframes --- src/backends/pgfplotsx.jl | 9 ++++----- test/test_pgfplotsx.jl | 5 ++++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index ecf0833a..c2b1ef51 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -233,10 +233,7 @@ end # function args args = if st == :contour opt[:x], opt[:y], opt[:z].surf' - elseif st == :heatmap || st == :surface - @show opt[:x] - @show opt[:y] - @show opt[:z] + elseif st in (:heatmap, :surface, :wireframe) surface_to_vecs(opt[:x], opt[:y], opt[:z]) elseif is3d(st) opt[:x], opt[:y], opt[:z] @@ -313,7 +310,9 @@ function pgfx_series_coordinates!(st_val::Val{:volume}, segment_opt, opt, args) return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Val{:wireframe}, segment_opt, opt, args) - push!( segment_opt, "mesh" => nothing ) + push!( segment_opt, "mesh" => nothing, + "mesh/rows" => length(opt[:x]) + ) return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Val{:shape}, segment_opt, opt, args) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index b8f6b146..70f51a72 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -76,7 +76,7 @@ end histogram2d(randn(10000), randn(10000), nbins=20) # TODO: should work, when heatmaps works? end # testset - @testset "Heatmap" begin + @testset "Heatmap-like" begin xs = [string("x", i) for i = 1:10] ys = [string("y", i) for i = 1:4] z = float((1:4) * reshape(1:10, 1, :)) @@ -86,6 +86,9 @@ end @test Plots.pgfx_axes(pgfx_plot.o)[1]["colorbar"] === nothing @test Plots.pgfx_axes(pgfx_plot.o)[1]["colormap name"] == "plots1" end + + pgfx_plot = wireframe(xs, ys, z, aspect_ratio=1) + # TODO: clims are wrong end # testset @testset "Contours" begin x = 1:0.5:20 From d50c28ebe7ce8c61f9adce1266c13f2c78879b75 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 22 Nov 2019 14:11:43 +0100 Subject: [PATCH 168/357] straightline --- 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 c2b1ef51..f9b9c9a9 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -265,7 +265,7 @@ end pgfx_series_coordinates!(Val(st), segment_opt, opt, seg_args) end end -function pgfx_series_coordinates!(st_val::Union{Val{:path}, Val{:path3d}}, segment_opt, opt, args) +function pgfx_series_coordinates!(st_val::Union{Val{:path}, Val{:path3d}, Val{:straightline}}, segment_opt, opt, args) return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Union{Val{:scatter}, Val{:scatter3d}}, segment_opt, opt, args) From 20f6d559c374810aa357e724e8290efee839a6fa Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Sat, 23 Nov 2019 20:10:08 +0100 Subject: [PATCH 169/357] free shapes --- src/backends/pgfplotsx.jl | 77 ++++++++++++++++++++++++--------------- 1 file changed, 48 insertions(+), 29 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index f9b9c9a9..e3441d0b 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -89,31 +89,31 @@ 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 - PGFPlotsX.push_preamble!(pgfx_plot.the_plot, """\\pgfplotsset{ - colormap={plots$(sp.attr[:subplot_index])}{$(pgfx_colormap(series.plotattributes[col]))}, - }""") - push!(axis_opt, - "colorbar" => nothing, - "colormap name" => "plots$(sp.attr[:subplot_index])", - ) - # goto is needed to break out of col and series for - @goto colorbar_end - end + # 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]))}, + }""") + push!(axis_opt, + "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 - @label colorbar_end + end + @label colorbar_end push!(axis_opt, "colorbar style" => PGFPlotsX.Options( "title" => sp[:colorbar_title], @@ -158,8 +158,8 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) ) end # treat segments - segments = if iscontour(series) || st == :heatmap - iter_segments(series[:x], series[:y]) + segments = if st in (:wireframe, :heatmap, :contour, :surface) + iter_segments(surface_to_vecs(series[:x], series[:y], series[:z])...) else iter_segments(series) end @@ -167,6 +167,21 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) for (i, rng) in enumerate(segments) segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) if opt[:markershape] != :none #|| !iscontour(series) && !(st == :heatmap) + 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)], " -- ") + PGFPlotsX.push_preamble!(pgfx_plot.the_plot, + """ + \\pgfdeclareplotmark{PlotsShape}{ + \\draw $path; + } + """ + ) + end segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) end if st == :shape || series[:fillrange] !== nothing @@ -300,8 +315,11 @@ function pgfx_series_coordinates!(st_val::Val{:xsticks}, segment_opt, opt, args) return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Val{:surface}, segment_opt, opt, args) + @show collect(args)[3] |> length + @show args push!( segment_opt, "surf" => nothing, - "mesh/rows" => length(opt[:x]) + "mesh/rows" => length(opt[:x]), + "mesh/cols" => length(opt[:y]), ) return PGFPlotsX.Coordinates(args...) end @@ -316,7 +334,7 @@ function pgfx_series_coordinates!(st_val::Val{:wireframe}, segment_opt, opt, arg return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Val{:shape}, segment_opt, opt, args) - push!( segment_opt, "area legends" => nothing, "patch" => nothing ) + push!( segment_opt, "area legends" => nothing ) return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Val{:contour}, segment_opt, opt, args) @@ -459,9 +477,10 @@ function pgfx_marker(plotattributes, i = 1) a = alpha(cstr) cstr_stroke = plot_color(get_markerstrokecolor(plotattributes, i), get_markerstrokealpha(plotattributes, i)) a_stroke = alpha(cstr_stroke) + mark_size = pgfx_thickness_scaling(plotattributes) * 0.5 * _cycle(plotattributes[:markersize], i) return PGFPlotsX.Options( - "mark" => get(_pgfplotsx_markers, shape, "*"), - "mark size" => pgfx_thickness_scaling(plotattributes) * 0.5 * _cycle(plotattributes[:markersize], i), + "mark" => shape isa Shape ? "PlotsShape" : get(_pgfplotsx_markers, shape, "*"), + "mark size" => "$mark_size pt", "mark options" => PGFPlotsX.Options( "color" => cstr_stroke, "draw opacity" => a_stroke, From 8553bef132fb76699d8cb9f7c765ec42ee66db33 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Sat, 23 Nov 2019 20:45:21 +0100 Subject: [PATCH 170/357] filled contour, histogram2d --- src/backends.jl | 2 +- src/backends/pgfplotsx.jl | 11 ----------- test/test_pgfplotsx.jl | 3 --- 3 files changed, 1 insertion(+), 15 deletions(-) diff --git a/src/backends.jl b/src/backends.jl index 1d4b3482..9bf596fd 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -707,7 +707,7 @@ const _pgfplotsx_attr = merge_with_base_supported([ ]) const _pgfplotsx_seriestype = [:path, :scatter, :straightline, - :path3d, :scatter3d, :surface, :wireframe, :volume, + :path3d, :scatter3d, :surface, :wireframe, :heatmap, :contour, :histogram2d, :shape, :steppre, :stepmid, :steppost, :ysticks, :xsticks] diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index e3441d0b..c7a3889b 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -37,7 +37,6 @@ function Base.push!(pgfx_plot::PGFPlotsXPlot, item) end function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) - # TODO: annotations! does not trigger _series_added ... if !pgfx_plot.is_created cols, rows = size(plt.layout.grid) the_plot = PGFPlotsX.TikzPicture() @@ -126,7 +125,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) push!( axis_opt, "view" => (azim, elev) ) end axisf = if sp[:projection] == :polar - # TODO: this errors for some reason # push!(axis_opt, "xmin" => 90) # push!(axis_opt, "xmax" => 450) PGFPlotsX.PolarAxis @@ -194,14 +192,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) "labels" => opt[:contour_labels], ) ) - else - notimpl() - push!(series_opt, - "contour filled" => PGFPlotsX.Options( - # "levels" => opt[:levels], - # "labels" => opt[:contour_labels], - ) - ) end end coordinates = pgfx_series_coordinates!( sp, st, segment_opt, opt, rng ) @@ -390,7 +380,6 @@ const _pgfx_annotation_halign = KW( ) ## -------------------------------------------------------------------------------------- # Generates a colormap for pgfplots based on a ColorGradient -# TODO: maybe obsolete pgfx_arrow(::Nothing) = "every arrow/.append style={-}" function pgfx_arrow( arr::Arrow ) components = String[] diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 70f51a72..4192e354 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -70,11 +70,9 @@ end x = 0.1:0.2:0.9 y = 0.7 * rand(5) .+ 0.15 plot(x, y, line=(3, :dash, :lightblue), marker=(Shape(verts), 30, RGBA(0, 0, 0, 0.2)), bg=:pink, fg=:darkblue, xlim=(0, 1), ylim=(0, 1), leg=false) - # TODO: draw those polygons end # testset @testset "Histogram 2D" begin histogram2d(randn(10000), randn(10000), nbins=20) - # TODO: should work, when heatmaps works? end # testset @testset "Heatmap-like" begin xs = [string("x", i) for i = 1:10] @@ -102,7 +100,6 @@ end p2 = contour(x, y, Z) p1 = contour(x, y, f, fill=true) plot(p1, p2) - # TODO: filled contours end # testset @testset "Varying colors" begin t = range(0, stop=1, length=100) From 8cb32b1f14fb39cd6cae30feb06e47eab1c65cb5 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Sun, 24 Nov 2019 16:46:20 +0100 Subject: [PATCH 171/357] filled contour (really) --- src/backends.jl | 4 +- src/backends/pgfplotsx.jl | 85 ++++++++++++++++++++++++++------------- test/test_pgfplotsx.jl | 1 + 3 files changed, 59 insertions(+), 31 deletions(-) diff --git a/src/backends.jl b/src/backends.jl index 9bf596fd..623a057c 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -707,8 +707,8 @@ const _pgfplotsx_attr = merge_with_base_supported([ ]) const _pgfplotsx_seriestype = [:path, :scatter, :straightline, - :path3d, :scatter3d, :surface, :wireframe, - :heatmap, :contour, :histogram2d, + :path3d, :scatter3d, :surface, :wireframe, + :heatmap, :contour, :contour3d, :histogram2d, :shape, :steppre, :stepmid, :steppost, :ysticks, :xsticks] const _pgfplotsx_style = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index c7a3889b..c6efba0e 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,5 +1,4 @@ using Contour: Contour -using StatsBase: Histogram, fit # PGFPlotsX.print_tex(io::IO, data::ColorGradient) = write(io, pgfx_colormap(data)) Base.@kwdef mutable struct PGFPlotsXPlot is_created::Bool = false @@ -140,13 +139,18 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) series_opt = PGFPlotsX.Options( "color" => single_color(opt[:linecolor]), ) - if is3d(series) || st == :heatmap + if is3d(series) || st == :heatmap #|| isfilledcontour(series) series_func = PGFPlotsX.Plot3 else series_func = PGFPlotsX.Plot end - if series[:fillrange] !== nothing && st != :contour - series_opt = merge(series_opt, pgfx_fillstyle(opt)) + if isfilledcontour(series) + # push!(series_opt, "contour filled" => nothing) + # st = :surface + # axis_opt["view"] = (0, 90) + # push!(series_opt, "shader" => "interp") + end + if series[:fillrange] !== nothing && !isfilledcontour(series) push!(series_opt, "area legend" => nothing) end if st == :heatmap @@ -156,7 +160,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) ) end # treat segments - segments = if st in (:wireframe, :heatmap, :contour, :surface) + segments = if st in (:wireframe, :heatmap, :contour, :surface, :contour3d) iter_segments(surface_to_vecs(series[:x], series[:y], series[:z])...) else iter_segments(series) @@ -164,7 +168,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) segment_opt = PGFPlotsX.Options() for (i, rng) in enumerate(segments) segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) - if opt[:markershape] != :none #|| !iscontour(series) && !(st == :heatmap) + if opt[:markershape] != :none marker = opt[:markershape] if marker isa Shape x = marker.x @@ -182,23 +186,17 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) end - if st == :shape || series[:fillrange] !== nothing + if st == :shape || + (series[:fillrange] !== nothing && !isfilledcontour(series)) segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) end - if iscontour(series) - if !isfilledcontour(series) - push!(series_opt, - "contour prepared" => PGFPlotsX.Options( - "labels" => opt[:contour_labels], - ) - ) - end - end - coordinates = pgfx_series_coordinates!( sp, st, segment_opt, opt, rng ) + coordinates = pgfx_series_coordinates!( sp, + isfilledcontour(series) ? :filledcontour : st, + segment_opt, opt, rng ) segment_plot = series_func( merge(series_opt, segment_opt), coordinates, - series[:fillrange] !== nothing ? "\\closedcycle" : "{}" + (series[:fillrange] !== nothing && !isfilledcontour(series)) ? "\\closedcycle" : "{}" ) push!(axis, segment_plot) # add to legend? @@ -236,10 +234,10 @@ end ## seriestype specifics @inline function pgfx_series_coordinates!(sp, st, segment_opt, opt, rng) # function args - args = if st == :contour - opt[:x], opt[:y], opt[:z].surf' + args = if st in (:contour, :contour3d, :filledcontour) + opt[:x], opt[:y], Array(opt[:z])' elseif st in (:heatmap, :surface, :wireframe) - surface_to_vecs(opt[:x], opt[:y], opt[:z]) + surface_to_vecs(opt[:x], opt[:y], opt[:z]) elseif is3d(st) opt[:x], opt[:y], opt[:z] elseif st == :straightline @@ -252,7 +250,7 @@ end else opt[:x], opt[:y] end - seg_args = if st == :contour || st == :heatmap + seg_args = if st in (:contour, :contour3d, :heatmap, :filledcontour) args else (arg[rng] for arg in args) @@ -305,8 +303,6 @@ function pgfx_series_coordinates!(st_val::Val{:xsticks}, segment_opt, opt, args) return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Val{:surface}, segment_opt, opt, args) - @show collect(args)[3] |> length - @show args push!( segment_opt, "surf" => nothing, "mesh/rows" => length(opt[:x]), "mesh/cols" => length(opt[:y]), @@ -327,10 +323,42 @@ function pgfx_series_coordinates!(st_val::Val{:shape}, segment_opt, opt, args) push!( segment_opt, "area legends" => nothing ) return PGFPlotsX.Coordinates(args...) end -function pgfx_series_coordinates!(st_val::Val{:contour}, segment_opt, opt, args) +function pgfx_series_coordinates!(st_val::Union{Val{:contour}, Val{:contour3d}}, segment_opt, opt, args) + push!(segment_opt, + "contour prepared" => PGFPlotsX.Options( + "labels" => opt[:contour_labels], + ), + ) return PGFPlotsX.Table(Contour.contours(args..., opt[:levels])) end +function pgfx_series_coordinates!(st_val::Val{:filledcontour}, segment_opt, opt, args) + xs, ys, zs = collect(args) + push!(segment_opt, + "contour filled" => PGFPlotsX.Options( + "labels" => opt[:contour_labels], + ), + "point meta" => "explicit", + "shader" => "flat" + ) + if opt[:levels] isa Number + push!(segment_opt["contour filled"], + "number" => opt[:levels], + ) + elseif opt[:levels] isa AVec + push!(segment_opt["contour filled"], + "levels" => opt[:levels], + ) + end + cs = join([ + join(["($x, $y) [$(zs[j, i])]" for (j, x) in enumerate(xs)], " ") for (i, y) in enumerate(ys)], "\n\n" + ) + """ +coordinates { +$cs +}; + """ +end ## const _pgfplotsx_linestyles = KW( :solid => "solid", @@ -428,10 +456,9 @@ pgfx_thickness_scaling(series) = pgfx_thickness_scaling(series[:subplot]) function pgfx_fillstyle(plotattributes, i = 1) cstr = get_fillcolor(plotattributes, i) - a = alpha(cstr) - fa = get_fillalpha(plotattributes, i) - if fa !== nothing - a = fa + a = get_fillalpha(plotattributes, i) + if a === nothing + a = alpha(single_color(cstr)) end PGFPlotsX.Options("fill" => cstr, "fill opacity" => a) end diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 4192e354..f38b115b 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -100,6 +100,7 @@ end p2 = contour(x, y, Z) p1 = contour(x, y, f, fill=true) plot(p1, p2) + # TODO: colorbar for filled contours end # testset @testset "Varying colors" begin t = range(0, stop=1, length=100) From e2a4b0eb30d3940470e4d75a87293f2036219c10 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Sun, 24 Nov 2019 18:03:08 +0100 Subject: [PATCH 172/357] rely on recipe for histogram2d --- src/backends.jl | 2 +- src/backends/pgfplotsx.jl | 27 +++++++++++++-------------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/backends.jl b/src/backends.jl index 623a057c..9bcba334 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -708,7 +708,7 @@ const _pgfplotsx_attr = merge_with_base_supported([ const _pgfplotsx_seriestype = [:path, :scatter, :straightline, :path3d, :scatter3d, :surface, :wireframe, - :heatmap, :contour, :contour3d, :histogram2d, + :heatmap, :contour, :contour3d, :shape, :steppre, :stepmid, :steppost, :ysticks, :xsticks] const _pgfplotsx_style = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index c6efba0e..684253de 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,5 +1,4 @@ using Contour: Contour -# PGFPlotsX.print_tex(io::IO, data::ColorGradient) = write(io, pgfx_colormap(data)) Base.@kwdef mutable struct PGFPlotsXPlot is_created::Bool = false was_shown::Bool = false @@ -250,7 +249,8 @@ end else opt[:x], opt[:y] end - seg_args = if st in (:contour, :contour3d, :heatmap, :filledcontour) + seg_args = if st in (:contour, :contour3d, :filledcontour) + args else (arg[rng] for arg in args) @@ -278,10 +278,12 @@ end function pgfx_series_coordinates!(st_val::Val{:heatmap}, segment_opt, opt, args) push!(segment_opt, "surf" => nothing, - "mesh/rows" => length(opt[:x]) + "mesh/rows" => length(opt[:x]), + "mesh/cols" => length(opt[:y]) ) return PGFPlotsX.Table(args...) end + function pgfx_series_coordinates!(st_val::Val{:stepre}, segment_opt, opt, args) push!( segment_opt, "const plot mark right" => nothing ) return PGFPlotsX.Coordinates(args...) @@ -354,9 +356,9 @@ function pgfx_series_coordinates!(st_val::Val{:filledcontour}, segment_opt, opt, join(["($x, $y) [$(zs[j, i])]" for (j, x) in enumerate(xs)], " ") for (i, y) in enumerate(ys)], "\n\n" ) """ -coordinates { -$cs -}; + coordinates { + $cs + }; """ end ## @@ -590,14 +592,11 @@ function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) end # limits - # TODO: support zlims - if letter != :z - lims = ispolar(sp) && letter == :x ? rad2deg.(axis_limits(sp, :x)) : axis_limits(sp, letter) - push!( opt, - string(letter,:min) => lims[1], - string(letter,:max) => lims[2] - ) - end + lims = ispolar(sp) && letter == :x ? rad2deg.(axis_limits(sp, :x)) : axis_limits(sp, letter) + push!( opt, + string(letter,:min) => lims[1], + string(letter,:max) => lims[2] + ) if !(axis[:ticks] in (nothing, false, :none, :native)) && framestyle != :none ticks = get_ticks(sp, axis) From 44341d1ff54f64bd8c24d3c23aa8342871eacccb Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Sun, 24 Nov 2019 18:04:13 +0100 Subject: [PATCH 173/357] fix steppre --- 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 684253de..4d2921da 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -284,7 +284,7 @@ function pgfx_series_coordinates!(st_val::Val{:heatmap}, segment_opt, opt, args) return PGFPlotsX.Table(args...) end -function pgfx_series_coordinates!(st_val::Val{:stepre}, segment_opt, opt, args) +function pgfx_series_coordinates!(st_val::Val{:steppre}, segment_opt, opt, args) push!( segment_opt, "const plot mark right" => nothing ) return PGFPlotsX.Coordinates(args...) end From a9cbe354c14228e3f4fa22b4c7b1d87d5031a09c Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Sun, 24 Nov 2019 18:10:34 +0100 Subject: [PATCH 174/357] fix bar --- src/backends/pgfplotsx.jl | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 4d2921da..373d9ca3 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -143,12 +143,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) else series_func = PGFPlotsX.Plot end - if isfilledcontour(series) - # push!(series_opt, "contour filled" => nothing) - # st = :surface - # axis_opt["view"] = (0, 90) - # push!(series_opt, "shader" => "interp") - end if series[:fillrange] !== nothing && !isfilledcontour(series) push!(series_opt, "area legend" => nothing) end @@ -189,9 +183,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) (series[:fillrange] !== nothing && !isfilledcontour(series)) segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) end - coordinates = pgfx_series_coordinates!( sp, - isfilledcontour(series) ? :filledcontour : st, - segment_opt, opt, rng ) + coordinates = pgfx_series_coordinates!( sp, series, segment_opt, opt, rng ) segment_plot = series_func( merge(series_opt, segment_opt), coordinates, @@ -231,9 +223,10 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end end ## seriestype specifics -@inline function pgfx_series_coordinates!(sp, st, segment_opt, opt, rng) +@inline function pgfx_series_coordinates!(sp, series, segment_opt, opt, rng) + st = series[:seriestype] # function args - args = if st in (:contour, :contour3d, :filledcontour) + args = if st in (:contour, :contour3d) opt[:x], opt[:y], Array(opt[:z])' elseif st in (:heatmap, :surface, :wireframe) surface_to_vecs(opt[:x], opt[:y], opt[:z]) @@ -249,8 +242,7 @@ end else opt[:x], opt[:y] end - seg_args = if st in (:contour, :contour3d, :filledcontour) - + seg_args = if st in (:contour, :contour3d) args else (arg[rng] for arg in args) @@ -265,6 +257,9 @@ end x, y = collect(seg_args) return PGFPlotsX.Table([:x => x, :y => y, :u => opt[:quiver][1], :v => opt[:quiver][2]]) else + if isfilledcontour(series) + st = :filledcontour + end pgfx_series_coordinates!(Val(st), segment_opt, opt, seg_args) end end @@ -322,7 +317,7 @@ function pgfx_series_coordinates!(st_val::Val{:wireframe}, segment_opt, opt, arg return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Val{:shape}, segment_opt, opt, args) - push!( segment_opt, "area legends" => nothing ) + # push!( segment_opt, "area legend" => nothing ) return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Union{Val{:contour}, Val{:contour3d}}, segment_opt, opt, args) From 077f1ddb84fbee5689b2cabf5cebf26211ff588b Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Sun, 24 Nov 2019 18:11:52 +0100 Subject: [PATCH 175/357] fix bar2 --- 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 373d9ca3..2be8ec56 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -317,7 +317,7 @@ function pgfx_series_coordinates!(st_val::Val{:wireframe}, segment_opt, opt, arg return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Val{:shape}, segment_opt, opt, args) - # push!( segment_opt, "area legend" => nothing ) + push!( segment_opt, "area legend" => nothing ) return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Union{Val{:contour}, Val{:contour3d}}, segment_opt, opt, args) From c600cb0294b9ce5a26060d91964c30f7f1727571 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Sun, 24 Nov 2019 18:18:10 +0100 Subject: [PATCH 176/357] fix display --- src/backends/pgfplotsx.jl | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 2be8ec56..27067035 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -26,6 +26,7 @@ function surface_to_vecs(x::AVec, y::AVec, s::Union{AMat, Surface}) return xn, yn, zn end +Base.display(pgfx_plot::PGFPlotsXPlot) = display(pgfx_plot.the_plot) function Base.show(io::IO, mime::MIME, pgfx_plot::PGFPlotsXPlot) show(io::IO, mime, pgfx_plot.the_plot) end @@ -705,8 +706,5 @@ function _show(io::IO, mime::MIME"application/x-tex", plt::Plot{PGFPlotsXBackend end function _display(plt::Plot{PGFPlotsXBackend}) - # fn = string(tempname(),".svg") - # PGFPlotsX.pgfsave(fn, plt.o) - # open_browser_window(fn) plt.o end From d409ad22a0e3a9fcb39b4b68c7d849d6e11156f7 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Sun, 24 Nov 2019 19:12:31 +0100 Subject: [PATCH 177/357] filled custom marker --- src/backends/pgfplotsx.jl | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 27067035..8e21ebcb 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -133,7 +133,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) axis = axisf( axis_opt ) - for series in series_list(sp) + for (series_index, series) in enumerate(series_list(sp)) opt = series.plotattributes st = series[:seriestype] series_opt = PGFPlotsX.Options( @@ -170,10 +170,13 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) 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}{ - \\draw $path; + \\pgfdeclareplotmark{PlotsShape$(series_index)}{ + \\filldraw + $path; } """ ) @@ -493,7 +496,7 @@ function pgfx_marker(plotattributes, i = 1) a_stroke = alpha(cstr_stroke) mark_size = pgfx_thickness_scaling(plotattributes) * 0.5 * _cycle(plotattributes[:markersize], i) return PGFPlotsX.Options( - "mark" => shape isa Shape ? "PlotsShape" : get(_pgfplotsx_markers, shape, "*"), + "mark" => shape isa Shape ? "PlotsShape$i" : get(_pgfplotsx_markers, shape, "*"), "mark size" => "$mark_size pt", "mark options" => PGFPlotsX.Options( "color" => cstr_stroke, From 33390a2c2d8db0fa9ac0293ae829e27a57e0515a Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Sun, 24 Nov 2019 19:18:45 +0100 Subject: [PATCH 178/357] increase right padding --- 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 8e21ebcb..54393377 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -673,7 +673,7 @@ end function _update_min_padding!(sp::Subplot{PGFPlotsXBackend}) # TODO: make padding more intelligent # order: right, top, left, bottom - sp.minpad = (20mm, 12mm, 2mm, 10mm) + sp.minpad = (22mm, 12mm, 2mm, 10mm) end function _create_backend_figure(plt::Plot{PGFPlotsXBackend}) From 024a11f35b0f2602cd833af4b24507abfd7306e4 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 25 Nov 2019 12:21:12 +0100 Subject: [PATCH 179/357] robust pgfx_axes --- src/backends/pgfplotsx.jl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 54393377..52fbe121 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -11,7 +11,11 @@ Base.@kwdef mutable struct PGFPlotsXPlot end end -pgfx_axes(pgfx_plot::PGFPlotsXPlot) = pgfx_plot.the_plot.elements[1].elements[1].contents +function pgfx_axes(pgfx_plot::PGFPlotsXPlot) + gp = pgfx_plot.the_plot.elements[1] + return gp isa PGFPlotsX.GroupPlot ? gp.elements[1].contents : gp +end + function surface_to_vecs(x::AVec, y::AVec, s::Union{AMat, Surface}) a = Array(s) From c056f8525d80a6868e07d475853106b15865c309 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 25 Nov 2019 12:38:54 +0100 Subject: [PATCH 180/357] add background_color_outside --- src/backends/pgfplotsx.jl | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 52fbe121..fd276505 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -5,7 +5,26 @@ Base.@kwdef mutable struct PGFPlotsXPlot the_plot::PGFPlotsX.TikzDocument = PGFPlotsX.TikzDocument() function PGFPlotsXPlot(is_created, was_shown, the_plot) pgfx_plot = new(is_created, was_shown, the_plot) + # tikz libraries PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usetikzlibrary{arrows.meta}") + PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usetikzlibrary{backgrounds}") + PGFPlotsX.push_preamble!(pgfx_plot.the_plot, + """ + \\pgfkeys{/tikz/.cd, + background color/.initial=white, + background color/.get=\\backcol, + background color/.store in=\\backcol, + } + \\tikzset{background rectangle/.style={ + fill=\\backcol, + }, + use background/.style={ + show background rectangle + } + } + """ + ) + # pgfplots libraries PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usepgfplotslibrary{patchplots}") pgfx_plot end @@ -41,8 +60,19 @@ end function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) if !pgfx_plot.is_created + the_plot = PGFPlotsX.TikzPicture(PGFPlotsX.Options()) cols, rows = size(plt.layout.grid) - the_plot = PGFPlotsX.TikzPicture() + bgc = plt.attr[:background_color_outside] + if bgc isa Colors.Colorant + cstr = plot_color(bgc) + a = alpha(cstr) + push!(the_plot.options, + "draw opacity" => a, + "background color" => cstr, + "use background" => nothing, + ) + end + # the combination of groupplot and polaraxis is broken in pgfplots if !any( sp -> ispolar(sp), plt.subplots ) pl_height, pl_width = plt.attr[:size] From eb7ac6ea3dd4bf8eaa8798adc845d0192b4da5db Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 25 Nov 2019 14:18:25 +0100 Subject: [PATCH 181/357] add ribbons --- src/backends/pgfplotsx.jl | 266 ++++++++++++++++++++++---------------- 1 file changed, 156 insertions(+), 110 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index fd276505..47b9fa9a 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -26,6 +26,7 @@ Base.@kwdef mutable struct PGFPlotsXPlot ) # pgfplots libraries PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usepgfplotslibrary{patchplots}") + PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usepgfplotslibrary{fillbetween}") pgfx_plot end end @@ -147,116 +148,122 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) 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 #|| isfilledcontour(series) - series_func = PGFPlotsX.Plot3 - else - series_func = PGFPlotsX.Plot - end - if series[:fillrange] !== nothing && !isfilledcontour(series) - push!(series_opt, "area legend" => nothing) - end - if st == :heatmap - push!(axis.options, - "view" => "{0}{90}", - "shader" => "flat corner", - ) - 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 - segment_opt = PGFPlotsX.Options() - for (i, rng) in enumerate(segments) - 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 || - (series[:fillrange] !== nothing && !isfilledcontour(series)) - segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) - end - coordinates = pgfx_series_coordinates!( sp, series, segment_opt, opt, rng ) - segment_plot = series_func( - merge(series_opt, segment_opt), - coordinates, - (series[:fillrange] !== nothing && !isfilledcontour(series)) ? "\\closedcycle" : "{}" - ) - push!(axis, segment_plot) - # add to legend? - if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) - push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) - ) - 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) - 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)) + opt = series.plotattributes + st = series[:seriestype] + series_opt = PGFPlotsX.Options( + "color" => single_color(opt[:linecolor]), + ) + if is3d(series) || st == :heatmap #|| isfilledcontour(series) + series_func = PGFPlotsX.Plot3 + else + series_func = PGFPlotsX.Plot + end + if series[:fillrange] !== nothing && !isfilledcontour(series) + push!(series_opt, "area legend" => nothing) + end + if st == :heatmap + push!(axis.options, + "view" => "{0}{90}", + "shader" => "flat corner", + ) + 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 + segment_opt = PGFPlotsX.Options() + for (i, rng) in enumerate(segments) + 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 || + (series[:fillrange] !== nothing && !isfilledcontour(series)) && + series[:ribbon] === nothing + segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) + end + coordinates = pgfx_series_coordinates!( sp, series, segment_opt, opt, rng ) + segment_plot = series_func( + merge(series_opt, segment_opt), + coordinates, + (series[:fillrange] !== nothing && !isfilledcontour(series) && series[:ribbon] === nothing) ? "\\closedcycle" : "{}" + ) + 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) + push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) + ) + 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) + 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 pgfx_plot.is_created = true end end @@ -570,6 +577,45 @@ function pgfx_add_annotation!(o, x, y, val, thickness_scaling = 1) "{$(val.str).};" ]) end + +function pgfx_add_ribbons!( axis, series, segment_plot, series_func, series_index ) + ribbon = series[:ribbon] + opt = series.plotattributes + ribbon_n = length(opt[:y]) ÷ length(ribbon) + ribbon_y = repeat(ribbon, outer = ribbon_n) + # upper ribbon + ribbon_name_plus = "plots_rib_p$series_index" + ribbon_opt_plus = merge(segment_plot.options, PGFPlotsX.Options( + "name path" => ribbon_name_plus, + "color" => opt[:fillcolor], + "draw opacity" => opt[:fillalpha] + )) + coordinates_plus = PGFPlotsX.Coordinates(opt[:x], opt[:y] + ribbon_y) + ribbon_plot_plus = series_func( + ribbon_opt_plus, + coordinates_plus + ) + push!(axis, ribbon_plot_plus) + # lower ribbon + ribbon_name_minus = "plots_rib_m$series_index" + ribbon_opt_minus = merge(segment_plot.options, PGFPlotsX.Options( + "name path" => ribbon_name_minus, + "color" => opt[:fillcolor], + "draw opacity" => opt[:fillalpha] + )) + coordinates_plus = PGFPlotsX.Coordinates(opt[:x], opt[:y] - ribbon_y) + ribbon_plot_plus = series_func( + ribbon_opt_minus, + coordinates_plus + ) + push!(axis, ribbon_plot_plus) + # fill + push!(axis, series_func( + pgfx_fillstyle(opt, series_index), + "fill between [of=$(ribbon_name_plus) and $(ribbon_name_minus)]" + )) + return axis +end # -------------------------------------------------------------------------------------- function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) axis = sp[Symbol(letter,:axis)] From ab8b57ed490fa5f52c052c8a1d343443be0fcf3e Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 25 Nov 2019 14:37:48 +0100 Subject: [PATCH 182/357] fix scalar ribbons --- src/backends/pgfplotsx.jl | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 47b9fa9a..012b2dfd 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -579,10 +579,12 @@ function pgfx_add_annotation!(o, x, y, val, thickness_scaling = 1) end function pgfx_add_ribbons!( axis, series, segment_plot, series_func, series_index ) - ribbon = series[:ribbon] + ribbon_y = series[:ribbon] opt = series.plotattributes - ribbon_n = length(opt[:y]) ÷ length(ribbon) - ribbon_y = repeat(ribbon, outer = ribbon_n) + if ribbon_y isa AVec + ribbon_n = length(opt[:y]) ÷ length(ribbon) + ribbon_y = repeat(ribbon, outer = ribbon_n) + end # upper ribbon ribbon_name_plus = "plots_rib_p$series_index" ribbon_opt_plus = merge(segment_plot.options, PGFPlotsX.Options( @@ -590,7 +592,7 @@ function pgfx_add_ribbons!( axis, series, segment_plot, series_func, series_inde "color" => opt[:fillcolor], "draw opacity" => opt[:fillalpha] )) - coordinates_plus = PGFPlotsX.Coordinates(opt[:x], opt[:y] + ribbon_y) + coordinates_plus = PGFPlotsX.Coordinates(opt[:x], opt[:y] .+ ribbon_y) ribbon_plot_plus = series_func( ribbon_opt_plus, coordinates_plus @@ -603,7 +605,7 @@ function pgfx_add_ribbons!( axis, series, segment_plot, series_func, series_inde "color" => opt[:fillcolor], "draw opacity" => opt[:fillalpha] )) - coordinates_plus = PGFPlotsX.Coordinates(opt[:x], opt[:y] - ribbon_y) + coordinates_plus = PGFPlotsX.Coordinates(opt[:x], opt[:y] .- ribbon_y) ribbon_plot_plus = series_func( ribbon_opt_minus, coordinates_plus From 3272f72df00c71443c5ec9ef6942537fe8624e87 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 25 Nov 2019 14:51:53 +0100 Subject: [PATCH 183/357] arbitrary legend position --- src/backends/pgfplotsx.jl | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 012b2dfd..09fc06bc 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -106,7 +106,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) "draw opacity" => title_a, "rotate" => sp[:titlefontrotation] ), - "legend pos" => get(_pgfplotsx_legend_pos, sp[:legend], "outer north east"), "legend style" => PGFPlotsX.Options( pgfx_linestyle(pgfx_thickness_scaling(sp), sp[:foreground_color_legend], 1.0, "solid") => nothing, "fill" => cstr, @@ -116,6 +115,14 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) "fill" => sp[:background_color_inside] ) ) + # legend position + if sp[:legend] isa Tuple + x, y = sp[:legend] + push!(axis_opt["legend style"], "at={($x, $y)}" ) + else + push!(axis_opt, "legend pos" => get(_pgfplotsx_legend_pos, sp[:legend], "outer north east"), + ) + end for letter in (:x, :y, :z) if letter != :z || is3d(sp) pgfx_axis!(axis_opt, sp, letter) From 7fc7471f81669d76e04debb344e07e649738c75d Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 25 Nov 2019 15:49:25 +0100 Subject: [PATCH 184/357] respect user margins --- src/backends/pgfplotsx.jl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 09fc06bc..66dfe4e5 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -762,7 +762,10 @@ end function _update_min_padding!(sp::Subplot{PGFPlotsXBackend}) # TODO: make padding more intelligent # order: right, top, left, bottom - sp.minpad = (22mm, 12mm, 2mm, 10mm) + sp.minpad = (22mm + sp[:right_margin], + 12mm + sp[:top_margin], + 2mm + sp[:left_margin], + 10mm + sp[:bottom_margin]) end function _create_backend_figure(plt::Plot{PGFPlotsXBackend}) From 26905b18ac0b34c9fd824866652ee32581005a99 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 25 Nov 2019 17:44:25 +0100 Subject: [PATCH 185/357] respect standalone flag --- src/backends/pgfplotsx.jl | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 66dfe4e5..b13125fe 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -36,6 +36,14 @@ function pgfx_axes(pgfx_plot::PGFPlotsXPlot) return gp isa PGFPlotsX.GroupPlot ? gp.elements[1].contents : gp end +function pgfx_preample(pgfx_plot::Plots.Plot{Plots.PGFPlotsXBackend}) + old_flag = pgfx_plot.attr[:tex_output_standalone] + pgfx_plot.attr[:tex_output_standalone] = true + fulltext = String(repr("application/x-tex", pgfx_plot)) + preamble = fulltext[1:first(findfirst("\\begin{document}", fulltext)) - 1] + pgfx_plot.attr[:tex_output_standalone] = old_flag + preamble +end function surface_to_vecs(x::AVec, y::AVec, s::Union{AMat, Surface}) a = Array(s) @@ -797,7 +805,7 @@ end function _show(io::IO, mime::MIME"application/x-tex", plt::Plot{PGFPlotsXBackend}) _update_plot_object(plt) - PGFPlotsX.print_tex(io, plt.o.the_plot) + PGFPlotsX.print_tex(io, plt.o.the_plot, include_preamble = plt.attr[:tex_output_standalone]) end function _display(plt::Plot{PGFPlotsXBackend}) From d796812161cb65b042ffd06883004f4333f646e1 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 25 Nov 2019 18:56:20 +0100 Subject: [PATCH 186/357] line legend for ribbon plots --- src/backends/pgfplotsx.jl | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index b13125fe..09496a67 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -194,7 +194,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) else series_func = PGFPlotsX.Plot end - if series[:fillrange] !== nothing && !isfilledcontour(series) + if series[:fillrange] !== nothing && !isfilledcontour(series) && series[:ribbon] === nothing push!(series_opt, "area legend" => nothing) end if st == :heatmap @@ -252,8 +252,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end # add to legend? if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) - push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) - ) + push!( axis, PGFPlotsX.LegendEntry(opt[:label]) ) end # add series annotations anns = series[:series_annotations] From 0c5e561eace1b2687f7931ce32003925d2295120 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 25 Nov 2019 20:10:09 +0100 Subject: [PATCH 187/357] legend opacity --- src/backends/pgfplotsx.jl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 09496a67..94a76b3b 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -102,8 +102,9 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) bb = bbox(sp) cstr = plot_color(sp[:background_color_legend]) a = alpha(cstr) + fg_alpha = alpha(plot_color(sp[:foreground_color_legend])) title_cstr = plot_color(sp[:titlefontcolor]) - title_a = alpha(cstr) + title_a = alpha(title_cstr) axis_opt = PGFPlotsX.Options( "height" => string(height(bb)), "width" => string(width(bb)), @@ -115,8 +116,10 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) "rotate" => sp[:titlefontrotation] ), "legend style" => PGFPlotsX.Options( - pgfx_linestyle(pgfx_thickness_scaling(sp), sp[:foreground_color_legend], 1.0, "solid") => nothing, + pgfx_linestyle(pgfx_thickness_scaling(sp), sp[:foreground_color_legend], fg_alpha, "solid") => nothing, "fill" => cstr, + "fill opacity" => a, + "text opacity" => alpha(plot_color(sp[:legendfontcolor])), "font" => pgfx_font(sp[:legendfontsize], pgfx_thickness_scaling(sp)) ), "axis background/.style" => PGFPlotsX.Options( From 568c4a02285b658007534bab55c220ebb1734c72 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 25 Nov 2019 23:05:27 +0100 Subject: [PATCH 188/357] fix background color --- 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 94a76b3b..2e210ab3 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -71,7 +71,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) if !pgfx_plot.is_created the_plot = PGFPlotsX.TikzPicture(PGFPlotsX.Options()) cols, rows = size(plt.layout.grid) - bgc = plt.attr[:background_color_outside] + bgc = plt.attr[:background_color_outside] == :match ? plt.attr[:background_color] : plt.attr[:background_color] if bgc isa Colors.Colorant cstr = plot_color(bgc) a = alpha(cstr) From ce5c36ded5e5b1974c90265dea57cf7142ec9f0a Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 25 Nov 2019 23:12:20 +0100 Subject: [PATCH 189/357] fix pgfx_axes --- src/backends/pgfplotsx.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 2e210ab3..056405eb 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -32,8 +32,8 @@ Base.@kwdef mutable struct PGFPlotsXPlot end function pgfx_axes(pgfx_plot::PGFPlotsXPlot) - gp = pgfx_plot.the_plot.elements[1] - return gp isa PGFPlotsX.GroupPlot ? gp.elements[1].contents : gp + gp = pgfx_plot.the_plot.elements[1].elements[1] + return gp isa PGFPlotsX.GroupPlot ? gp.contents : gp end function pgfx_preample(pgfx_plot::Plots.Plot{Plots.PGFPlotsXBackend}) From 1e216291ab99fc5e0587dcf62be1e45f8222c3ec Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 26 Nov 2019 00:07:45 +0100 Subject: [PATCH 190/357] direct colormap access --- src/backends/pgfplotsx.jl | 13 +++++++------ test/test_pgfplotsx.jl | 3 ++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 056405eb..ec210aab 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -158,6 +158,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) push!(axis_opt, "colorbar" => nothing, "colormap name" => "plots$(sp.attr[:subplot_index])", + "colormap access" => "direct", ) # goto is needed to break out of col and series for @goto colorbar_end @@ -167,10 +168,10 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) @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] - ) + "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] @@ -192,7 +193,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) series_opt = PGFPlotsX.Options( "color" => single_color(opt[:linecolor]), ) - if is3d(series) || st == :heatmap #|| isfilledcontour(series) + if is3d(series) || st == :heatmap series_func = PGFPlotsX.Plot3 else series_func = PGFPlotsX.Plot @@ -336,7 +337,7 @@ function pgfx_series_coordinates!(st_val::Val{:heatmap}, segment_opt, opt, args) push!(segment_opt, "surf" => nothing, "mesh/rows" => length(opt[:x]), - "mesh/cols" => length(opt[:y]) + "mesh/cols" => length(opt[:y]), ) return PGFPlotsX.Table(args...) end diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index f38b115b..4c62ef4f 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -80,7 +80,8 @@ end z = float((1:4) * reshape(1:10, 1, :)) pgfx_plot = heatmap(xs, ys, z, aspect_ratio=1) Plots._update_plot_object(pgfx_plot) - if @test_nowarn(haskey(Plots.pgfx_axes(pgfx_plot.o)[1].options.dict, "colorbar") == true) + if + @test_nowarn(haskey(Plots.pgfx_axes(pgfx_plot.o)[1].options.dict, "colorbar") == true) @test Plots.pgfx_axes(pgfx_plot.o)[1]["colorbar"] === nothing @test Plots.pgfx_axes(pgfx_plot.o)[1]["colormap name"] == "plots1" end From e29edc9e97cfaf57d120eec590ef2554c742b4be Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 26 Nov 2019 00:15:54 +0100 Subject: [PATCH 191/357] flip layout --- 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 ec210aab..4ae9370f 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -70,7 +70,7 @@ end function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) if !pgfx_plot.is_created the_plot = PGFPlotsX.TikzPicture(PGFPlotsX.Options()) - cols, rows = size(plt.layout.grid) + rows, cols = size(plt.layout.grid) bgc = plt.attr[:background_color_outside] == :match ? plt.attr[:background_color] : plt.attr[:background_color] if bgc isa Colors.Colorant cstr = plot_color(bgc) From 7de8d302fa83e0fbce1d24038e77862b3601ce20 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 26 Nov 2019 00:28:11 +0100 Subject: [PATCH 192/357] fix framestyle error --- 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 4ae9370f..82ca9e32 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -646,7 +646,7 @@ function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) ) # set to supported framestyle - framestyle = pgfx_framestyle(sp[:framestyle]) + framestyle = pgfx_framestyle(sp[:framestyle] == false ? :none : sp[:framestyle]) # axis label position labelpos = "" From a37d9768a04fc22b3aeb499fdc633d98f109faff Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 26 Nov 2019 01:41:54 +0100 Subject: [PATCH 193/357] add quiver bug test --- test/test_pgfplotsx.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 4c62ef4f..289a5c93 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -15,6 +15,7 @@ end pgfx_plot = plot(1:5) Plots._update_plot_object(pgfx_plot) @test pgfx_plot.o.the_plot isa PGFPlotsX.TikzDocument + @test pgfx_plot.series_list[1].plotattributes[:quiver] === nothing @testset "3D docs example" begin n = 100 @@ -80,8 +81,7 @@ end z = float((1:4) * reshape(1:10, 1, :)) pgfx_plot = heatmap(xs, ys, z, aspect_ratio=1) Plots._update_plot_object(pgfx_plot) - if - @test_nowarn(haskey(Plots.pgfx_axes(pgfx_plot.o)[1].options.dict, "colorbar") == true) + if @test_nowarn(haskey(Plots.pgfx_axes(pgfx_plot.o)[1].options.dict, "colorbar") == true) @test Plots.pgfx_axes(pgfx_plot.o)[1]["colorbar"] === nothing @test Plots.pgfx_axes(pgfx_plot.o)[1]["colormap name"] == "plots1" end From 9cdc72662f946fdbfb143493dbee036fdbb0b3d3 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 26 Nov 2019 13:22:37 +0100 Subject: [PATCH 194/357] fifty shades of show --- src/backends/pgfplotsx.jl | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 82ca9e32..9dbfb1a1 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -59,6 +59,7 @@ function surface_to_vecs(x::AVec, y::AVec, s::Union{AMat, Surface}) end Base.display(pgfx_plot::PGFPlotsXPlot) = display(pgfx_plot.the_plot) + function Base.show(io::IO, mime::MIME, pgfx_plot::PGFPlotsXPlot) show(io::IO, mime, pgfx_plot.the_plot) end @@ -284,6 +285,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end pgfx_plot.is_created = true end + return pgfx_plot end ## seriestype specifics @inline function pgfx_series_coordinates!(sp, series, segment_opt, opt, rng) @@ -791,26 +793,21 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) plt.o(plt) end -function _show(io::IO, mime::MIME"image/svg+xml", plt::Plot{PGFPlotsXBackend}) - _update_plot_object(plt) - show(io, mime, plt.o) +for mime in ("application/pdf", "image/png", "image/svg+xml") + @eval function _show(io::IO, mime::MIME{Symbol($mime)}, plt::Plot{PGFPlotsXBackend}) + show(io, mime, plt.o.the_plot) + end end -function _show(io::IO, mime::MIME"application/pdf", plt::Plot{PGFPlotsXBackend}) - _update_plot_object(plt) - show(io, mime, plt.o) -end - -function _show(io::IO, mime::MIME"image/png", plt::Plot{PGFPlotsXBackend}) - _update_plot_object(plt) - show(io, mime, plt.o) -end - -function _show(io::IO, mime::MIME"application/x-tex", plt::Plot{PGFPlotsXBackend}) - _update_plot_object(plt) +function _show(io::IO, mime::MIME{Symbol("application/x-tex")}, plt::Plot{PGFPlotsXBackend}) PGFPlotsX.print_tex(io, plt.o.the_plot, include_preamble = plt.attr[:tex_output_standalone]) end -function _display(plt::Plot{PGFPlotsXBackend}) - plt.o +Base.show(io::IO, ::MIME{Symbol("text/plain")}, plt::Plot{PGFPlotsXBackend}) = show(io, plt) + +function Base.show(io::IO, plt::Plot{PGFPlotsXBackend}) display(PGFPlotsX.PGFPlotsXDisplay(), plt.o.the_plot) +end + +function _display(plt::Plot{PGFPlotsXBackend}) + display(PGFPlotsX.PGFPlotsXDisplay(), plt.o.the_plot) end From 0b71f55b29cb435ec783e0ff72ade04b7a013162 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 26 Nov 2019 13:30:04 +0100 Subject: [PATCH 195/357] fix typo --- 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 9dbfb1a1..172c4470 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -36,7 +36,7 @@ function pgfx_axes(pgfx_plot::PGFPlotsXPlot) return gp isa PGFPlotsX.GroupPlot ? gp.contents : gp end -function pgfx_preample(pgfx_plot::Plots.Plot{Plots.PGFPlotsXBackend}) +function pgfx_preamble(pgfx_plot::Plot{PGFPlotsXBackend}) old_flag = pgfx_plot.attr[:tex_output_standalone] pgfx_plot.attr[:tex_output_standalone] = true fulltext = String(repr("application/x-tex", pgfx_plot)) From 0d2ccfddfb2c1da658cba03414ea722bafe745f8 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 26 Nov 2019 18:55:44 +0100 Subject: [PATCH 196/357] fix show --- src/backends/pgfplotsx.jl | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 172c4470..b3007bc7 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -31,6 +31,7 @@ Base.@kwdef mutable struct PGFPlotsXPlot end end +## end user utility functions function pgfx_axes(pgfx_plot::PGFPlotsXPlot) gp = pgfx_plot.the_plot.elements[1].elements[1] return gp isa PGFPlotsX.GroupPlot ? gp.contents : gp @@ -44,6 +45,7 @@ function pgfx_preamble(pgfx_plot::Plot{PGFPlotsXBackend}) pgfx_plot.attr[:tex_output_standalone] = old_flag preamble end +## function surface_to_vecs(x::AVec, y::AVec, s::Union{AMat, Surface}) a = Array(s) @@ -58,12 +60,6 @@ function surface_to_vecs(x::AVec, y::AVec, s::Union{AMat, Surface}) return xn, yn, zn end -Base.display(pgfx_plot::PGFPlotsXPlot) = display(pgfx_plot.the_plot) - -function Base.show(io::IO, mime::MIME, pgfx_plot::PGFPlotsXPlot) - show(io::IO, mime, pgfx_plot.the_plot) -end - function Base.push!(pgfx_plot::PGFPlotsXPlot, item) push!(pgfx_plot.the_plot, item) end @@ -803,11 +799,6 @@ function _show(io::IO, mime::MIME{Symbol("application/x-tex")}, plt::Plot{PGFPlo PGFPlotsX.print_tex(io, plt.o.the_plot, include_preamble = plt.attr[:tex_output_standalone]) end -Base.show(io::IO, ::MIME{Symbol("text/plain")}, plt::Plot{PGFPlotsXBackend}) = show(io, plt) - -function Base.show(io::IO, plt::Plot{PGFPlotsXBackend}) display(PGFPlotsX.PGFPlotsXDisplay(), plt.o.the_plot) -end - function _display(plt::Plot{PGFPlotsXBackend}) display(PGFPlotsX.PGFPlotsXDisplay(), plt.o.the_plot) end From be5cd7de2e4eb2e5e267bf3d3ea8a5d6666351dd Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 26 Nov 2019 19:10:25 +0100 Subject: [PATCH 197/357] improved fillrange --- src/backends/pgfplotsx.jl | 57 ++++++++++++++++++++++++++++++++++----- test/test_pgfplotsx.jl | 1 - 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index b3007bc7..4cc09fc4 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -210,8 +210,8 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) else iter_segments(series) end - segment_opt = PGFPlotsX.Options() 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] @@ -235,15 +235,28 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) end if st == :shape || - (series[:fillrange] !== nothing && !isfilledcontour(series)) && - series[:ribbon] === nothing + isfilledcontour(series) || + series[:ribbon] !== nothing 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) + # add to legend? + if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) + io = IOBuffer() + PGFPlotsX.print_tex(io, pgfx_fillstyle(opt, i)) + style = strip(String(take!(io)),['[',']', ' ']) + push!( segment_opt, "legend image code/.code" => """{ + \\draw[##1,/tikz/.cd, $style] (0cm,-0.1cm) rectangle (0.6cm,0.1cm); + }""" ) + end + end + # series coordinates = pgfx_series_coordinates!( sp, series, segment_opt, opt, rng ) segment_plot = series_func( - merge(series_opt, segment_opt), - coordinates, - (series[:fillrange] !== nothing && !isfilledcontour(series) && series[:ribbon] === nothing) ? "\\closedcycle" : "{}" + merge(series_opt, segment_opt), + coordinates, ) push!(axis, segment_plot) # add ribbons? @@ -253,7 +266,8 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end # add to legend? if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) - push!( axis, PGFPlotsX.LegendEntry(opt[:label]) ) + legend = PGFPlotsX.LegendEntry(PGFPlotsX.Options(), opt[:label], true) + push!( axis, legend ) end # add series annotations anns = series[:series_annotations] @@ -634,6 +648,35 @@ function pgfx_add_ribbons!( axis, series, segment_plot, series_func, series_inde )) return axis end + +function pgfx_fillrange_series!(axis, series, series_func, i, fillrange, rng) + fillrange_opt = PGFPlotsX.Options( + "line width" => "0", + "draw opacity" => "0", + ) + fillrange_opt = merge( fillrange_opt, pgfx_fillstyle(series, i) ) + fillrange_opt = merge( fillrange_opt, pgfx_marker(series, i) ) + push!( fillrange_opt, "forget plot" => nothing ) + opt = series.plotattributes + args = is3d(series) ? (opt[:x][rng], opt[:y][rng], opt[:z][rng]) : (opt[:x][rng], opt[:y][rng]) + push!(axis, PGFPlotsX.PlotInc(fillrange_opt, pgfx_fillrange_args(fillrange, args...))) + return axis +end + +function pgfx_fillrange_args(fillrange, x, y) + n = length(x) + x_fill = [x; x[n:-1:1]; x[1]] + y_fill = [y; _cycle(fillrange, n:-1:1); y[1]] + return PGFPlotsX.Coordinates(x_fill, y_fill) +end + +function pgfx_fillrange_args(fillrange, x, y, z) + n = length(x) + x_fill = [x; x[n:-1:1]; x[1]] + y_fill = [y; y[n:-1:1]; x[1]] + z_fill = [z; _cycle(fillrange, n:-1:1); z[1]] + return PGFPlotsX.Coordiantes(x_fill, y_fill, z_fill) +end # -------------------------------------------------------------------------------------- function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) axis = sp[Symbol(letter,:axis)] diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 289a5c93..fc27f0e8 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -113,7 +113,6 @@ end x + y end), color=:bluesreds, legend=false) plot(p1, p2) - # TODO: questionable tiling end # testset @testset "Framestyles" begin scatter(fill(randn(10), 6), fill(randn(10), 6), framestyle=[:box :semi :origin :zerolines :grid :none], title=[":box" ":semi" ":origin" ":zerolines" ":grid" ":none"], color=permutedims(1:6), layout=6, label="", markerstrokewidth=0, ticks=-2:2) From cc4750688e35d47a4f3f571551fc3885de79a6a1 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 26 Nov 2019 21:28:15 +0100 Subject: [PATCH 198/357] improve annotations --- src/backends/pgfplotsx.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 4cc09fc4..c7e8e7e1 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -278,7 +278,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) # add subplot annotations anns = sp.attr[:annotations] for (xi,yi,txt) in anns - pgfx_add_annotation!(axis, xi, yi, txt) + pgfx_add_annotation!(axis, xi, yi, txt, pgfx_thickness_scaling(sp)) end end if ispolar(sp) @@ -604,7 +604,7 @@ function pgfx_add_annotation!(o, x, y, val, thickness_scaling = 1) ), " at ", PGFPlotsX.Coordinate(x, y), - "{$(val.str).};" + "{$(val.str)};" ]) end From 4c3002e72d1ee8d1d38f9a51b0164f316cd10f9b Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 27 Nov 2019 10:23:12 +0100 Subject: [PATCH 199/357] Create CompatHelper.yml --- .github/workflows/CompatHelper.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/workflows/CompatHelper.yml diff --git a/.github/workflows/CompatHelper.yml b/.github/workflows/CompatHelper.yml new file mode 100644 index 00000000..68dbe39c --- /dev/null +++ b/.github/workflows/CompatHelper.yml @@ -0,0 +1,24 @@ +name: CompatHelper + +on: + schedule: + - cron: '00 * * * *' + +jobs: + CompatHelper: + runs-on: ${{ matrix.os }} + strategy: + matrix: + julia-version: [1.2.0] + julia-arch: [x86] + os: [ubuntu-latest] + steps: + - uses: julia-actions/setup-julia@latest + with: + version: ${{ matrix.julia-version }} + - name: Pkg.add("CompatHelper") + run: julia -e 'using Pkg; Pkg.add("CompatHelper")' + - name: CompatHelper.main() + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: julia -e 'using CompatHelper; CompatHelper.main()' From 6d148b05a3e38a0417c681c8a574cd9681c24a06 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 27 Nov 2019 10:40:37 +0100 Subject: [PATCH 200/357] add bounds to all dependencies --- Project.toml | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/Project.toml b/Project.toml index 4ab91544..e3c3bfb6 100644 --- a/Project.toml +++ b/Project.toml @@ -31,13 +31,22 @@ StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" [compat] -FixedPointNumbers = "≥ 0.3.0" -GR = "≥ 0.31.0" -PlotThemes = "≥ 0.1.3" -PlotUtils = "≥ 0.6.1" -RecipesBase = "≥ 0.6.0" -StatsBase = "≥ 0.14.0" -julia = "≥ 1.0.0" +Contour = "0, 0.5" +FFMPEG = "0, 0.2" +FixedPointNumbers = "0.3, 0.6" +GR = "0.31, 0.44" +GeometryTypes = "0, 0.7" +JSON = "0, 0.21" +Measures = "0, 0.3" +NaNMath = "0, 0.3" +PlotThemes = "0.2, 0.4" +PlotUtils = "0.6.1" +RecipesBase = "0.6, 0.7" +Reexport = "0, 0.2" +Requires = "0, 0.5" +Showoff = "0.3.1" +StatsBase = "0.14, 0.32" +julia = "1" [extras] FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" From 25fec470a7c243d8d4eaa42f9b77fa589488ccef Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 27 Nov 2019 10:43:37 +0100 Subject: [PATCH 201/357] up version --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index e3c3bfb6..a1448523 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.27.1" +version = "0.27.2" [deps] Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" From fe7989798c54ee0145323270aeb0d78d409e6e24 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 27 Nov 2019 11:29:26 +0100 Subject: [PATCH 202/357] add bounds as suggested by CompatHelper --- Project.toml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Project.toml b/Project.toml index a1448523..1657c52c 100644 --- a/Project.toml +++ b/Project.toml @@ -31,19 +31,19 @@ StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" [compat] -Contour = "0, 0.5" -FFMPEG = "0, 0.2" +Contour = "0.5" +FFMPEG = "0.2" FixedPointNumbers = "0.3, 0.6" GR = "0.31, 0.44" -GeometryTypes = "0, 0.7" -JSON = "0, 0.21" -Measures = "0, 0.3" -NaNMath = "0, 0.3" +GeometryTypes = "0.7" +JSON = "0.21" +Measures = "0.3" +NaNMath = "0.3" PlotThemes = "0.2, 0.4" PlotUtils = "0.6.1" RecipesBase = "0.6, 0.7" -Reexport = "0, 0.2" -Requires = "0, 0.5" +Reexport = "0.2" +Requires = "0.5" Showoff = "0.3.1" StatsBase = "0.14, 0.32" julia = "1" From e5b678f4a8ec7a79469819a0dd39a874f5c9d2bf Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 27 Nov 2019 11:31:51 +0100 Subject: [PATCH 203/357] minor release --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 1657c52c..2a0bb25b 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.27.2" +version = "0.28.0" [deps] Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" From cc2e8ed5136e0a214e325bf3f47dcdcbac32bb5b Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Wed, 27 Nov 2019 12:23:39 +0100 Subject: [PATCH 204/357] axis cs for annotations --- src/backends/pgfplotsx.jl | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index c7e8e7e1..5f487c8c 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -591,20 +591,17 @@ end function pgfx_add_annotation!(o, x, y, val, thickness_scaling = 1) # Construct the style string. - # Currently supports color and orientation cstr = val.font.color a = alpha(cstr) push!(o, ["\\node", PGFPlotsX.Options( - get(_pgfx_annotation_halign,val.font.halign,"") => nothing, + get(_pgfx_annotation_halign, val.font.halign, "") => nothing, "color" => cstr, "draw opacity" => convert(Float16, a), "rotate" => val.font.rotation, "font" => pgfx_font(val.font.pointsize, thickness_scaling) ), - " at ", - PGFPlotsX.Coordinate(x, y), - "{$(val.str)};" + " at (axis cs:$x, $y) {$(val.str)};" ]) end From 243ff2d59e125181c32170f9714a86b17f175555 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Tue, 26 Nov 2019 14:43:22 +0100 Subject: [PATCH 205/357] replace gradiend with colorgradient in theme to avoid confusion with Plots' quiver alias 'gradient' --- src/themes.jl | 43 +++++++++++-------------------------------- 1 file changed, 11 insertions(+), 32 deletions(-) diff --git a/src/themes.jl b/src/themes.jl index e2d41e57..b85c6ca9 100644 --- a/src/themes.jl +++ b/src/themes.jl @@ -4,37 +4,16 @@ Specify the colour theme for plots. """ function theme(s::Symbol; kw...) - defaults = _get_defaults(s) + defaults = PlotThemes._themes[s].defaults _theme(s, defaults; kw...) end -function _get_defaults(s::Symbol) - thm = PlotThemes._themes[s] - if :defaults in fieldnames(typeof(thm)) - return thm.defaults - else # old PlotTheme type - defaults = KW( - :bg => thm.bg_secondary, - :bginside => thm.bg_primary, - :fg => thm.lines, - :fgtext => thm.text, - :fgguide => thm.text, - :fglegend => thm.text, - :palette => thm.palette, - ) - if thm.gradient !== nothing - push!(defaults, :gradient => thm.gradient) - end - return defaults - end -end - function _theme(s::Symbol, defaults::KW; kw...) # Reset to defaults to overwrite active theme reset_defaults() # Set the theme's gradient as default - if haskey(defaults, :gradient) + if haskey(defaults, :colorgradient) PlotUtils.clibrary(:misc) PlotUtils.default_cgrad(default = :sequential, sequential = PlotThemes.gradient_name(s)) else @@ -44,8 +23,8 @@ function _theme(s::Symbol, defaults::KW; kw...) # maybe overwrite the theme's gradient kw = KW(kw) - if haskey(kw, :gradient) - kwgrad = pop!(kw, :gradient) + if haskey(kw, :colorgradient) + kwgrad = pop!(kw, :colorgradient) for clib in clibraries() if kwgrad in cgradients(clib) PlotUtils.clibrary(clib) @@ -74,11 +53,11 @@ _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func @recipe function showtheme(st::ShowTheme) thm, cfunc = _get_showtheme_args(st.args...) - defaults = _get_defaults(thm) + defaults = PlotThemes._themes[thm].defaults # get the gradient - gradient_colors = get(defaults, :gradient, cgrad(:inferno).colors) - gradient = cgrad(cfunc.(RGB.(gradient_colors))) + gradient_colors = get(defaults, :colorgradient, cgrad(:inferno).colors) + colorgradient = cgrad(cfunc.(RGB.(gradient_colors))) # get the palette palette = get(defaults, :palette, get_color_palette(:auto, plot_color(:white), 17)) @@ -86,7 +65,7 @@ _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func # apply the theme for k in keys(defaults) - k in (:gradient, :palette) && continue + k in (:colorgradient, :palette) && continue def = defaults[k] arg = get(_keyAliases, k, k) plotattributes[arg] = if typeof(def) <: Colorant @@ -139,7 +118,7 @@ _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func @series begin subplot := 4 seriestype := :heatmap - seriescolor := gradient + seriescolor := colorgradient ticks := -5:5:5 x, y, z end @@ -147,7 +126,7 @@ _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func @series begin subplot := 5 seriestype := :surface - seriescolor := gradient + seriescolor := colorgradient x, y, z end @@ -159,7 +138,7 @@ _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func @series begin subplot := 6 - seriescolor := gradient + seriescolor := colorgradient linewidth := 3 line_z := z x, y, z From ec4420cb38420ebc453aba26ca926ae519617dc8 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 27 Nov 2019 10:35:53 +0100 Subject: [PATCH 206/357] make theme compatible with old PlotThemes --- src/themes.jl | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/themes.jl b/src/themes.jl index b85c6ca9..2c6a4ed9 100644 --- a/src/themes.jl +++ b/src/themes.jl @@ -13,6 +13,7 @@ function _theme(s::Symbol, defaults::KW; kw...) reset_defaults() # Set the theme's gradient as default + fix_colorgradient!(defaults) if haskey(defaults, :colorgradient) PlotUtils.clibrary(:misc) PlotUtils.default_cgrad(default = :sequential, sequential = PlotThemes.gradient_name(s)) @@ -39,6 +40,13 @@ function _theme(s::Symbol, defaults::KW; kw...) return end +# be compatible with old PlotThemes specifying the colorgradient with `:gradient` +function fix_colorgradient!(defaults) + if haskey(defaults, :gradient) && !haskey(defaults, :colorgradient) + defaults[:colorgradient] = pop!(defaults, :gradient) + end +end + @deprecate set_theme(s) theme(s) @userplot ShowTheme @@ -56,6 +64,7 @@ _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func defaults = PlotThemes._themes[thm].defaults # get the gradient + fix_colorgradient!(defaults) gradient_colors = get(defaults, :colorgradient, cgrad(:inferno).colors) colorgradient = cgrad(cfunc.(RGB.(gradient_colors))) From 4d9dc31c5e1a535985b7c262becf2d6b0de459dc Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 27 Nov 2019 18:11:14 +0100 Subject: [PATCH 207/357] update PlotThemes bounds and up version --- Project.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Project.toml b/Project.toml index 2a0bb25b..6b6c0284 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.0" +version = "0.28.1" [deps] Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" @@ -39,7 +39,7 @@ GeometryTypes = "0.7" JSON = "0.21" Measures = "0.3" NaNMath = "0.3" -PlotThemes = "0.2, 0.4" +PlotThemes = "0.2, 1" PlotUtils = "0.6.1" RecipesBase = "0.6, 0.7" Reexport = "0.2" From b45c33606339838d70e33de0c9d6d725490833db Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 27 Nov 2019 18:21:22 +0100 Subject: [PATCH 208/357] pop! colorgradient from defaults --- src/themes.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/themes.jl b/src/themes.jl index 2c6a4ed9..eaa69636 100644 --- a/src/themes.jl +++ b/src/themes.jl @@ -17,6 +17,7 @@ function _theme(s::Symbol, defaults::KW; kw...) if haskey(defaults, :colorgradient) PlotUtils.clibrary(:misc) PlotUtils.default_cgrad(default = :sequential, sequential = PlotThemes.gradient_name(s)) + pop!(defaults, :colorgradient) else PlotUtils.clibrary(:Plots) PlotUtils.default_cgrad(default = :sequential, sequential = :inferno) From 6ecf783fd5bf1232fe0851c1c26e4953df1ba772 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 27 Nov 2019 19:24:48 +0100 Subject: [PATCH 209/357] update precompile.jl --- src/precompile.jl | 1652 +++++++++++++++++++++++---------------------- 1 file changed, 838 insertions(+), 814 deletions(-) diff --git a/src/precompile.jl b/src/precompile.jl index 357b9106..fc6f27a3 100644 --- a/src/precompile.jl +++ b/src/precompile.jl @@ -1,854 +1,878 @@ function _precompile_() ccall(:jl_generating_output, Cint, ()) == 1 || return nothing - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots.legendtitlefont), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.preprocessArgs!), Base.Dict{Symbol, Any}}) precompile(Tuple{typeof(Plots.gr_display), Plots.Subplot{Plots.GRBackend}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}}) precompile(Tuple{typeof(Plots.legendtitlefont), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.pie_labels), Plots.Subplot{Plots.GRBackend}, Plots.Series}) - precompile(Tuple{typeof(Plots.should_add_to_legend), Plots.Series}) precompile(Tuple{typeof(Plots.shape_data), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots.preprocessArgs!), Base.Dict{Symbol, Any}}) precompile(Tuple{typeof(Plots.gr_display), Plots.Subplot{Plots.GRBackend}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._backend_instance), Symbol}) - precompile(Tuple{typeof(Plots.replaceAlias!), Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Symbol}}) - precompile(Tuple{typeof(Plots.preprocessArgs!), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Array{T, 1} where T, 1}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Nothing}) - precompile(Tuple{typeof(Plots.straightline_data), Tuple{Int64, Int64}, Tuple{Float64, Float64}, Array{Float64, 1}, Array{Float64, 1}, Int64}) - precompile(Tuple{typeof(Plots.convert_to_polar), Array{Float64, 1}, Array{Float64, 1}, Tuple{Int64, Float64}}) - precompile(Tuple{typeof(Plots.gr_inqtext), Int64, Int64, String}) - precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Int64, Plots.Shape}) - precompile(Tuple{typeof(Plots.nanappend!), Array{Float64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Int64, Int64, Plots.Shape}) - precompile(Tuple{typeof(Plots.gr_draw_marker), Float64, Float64, Int64, Plots.Shape}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.Spy}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.recompute_lengths), Array{Measures.Measure, 1}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Float64, 1}, Array{String, 1}}}) - precompile(Tuple{typeof(Plots._heatmap_edges), Array{Float64, 1}, Bool}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Float64, 1}, Array{Any, 1}}}) - precompile(Tuple{typeof(Plots._preprocess_binlike), Base.Dict{Symbol, Any}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.__init__)}) - precompile(Tuple{typeof(Plots.warnOnUnsupported), Plots.GRBackend, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.iscontour), Plots.Series}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Float64, 1}, Array{String, 1}}}) - precompile(Tuple{typeof(Plots.gr_text), Float64, Float64, String}) - precompile(Tuple{typeof(Plots.layout_args), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.pie_labels), Plots.Subplot{Plots.GRBackend}, Plots.Series}) + precompile(Tuple{typeof(Plots.axis_drawing_info), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.preprocessArgs!), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Float64, Float64, Int64, Plots.Shape}) precompile(Tuple{typeof(Plots.iscontour), Plots.Series}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}}) - precompile(Tuple{typeof(Plots.axis_drawing_info), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.link_subplots), Array{RecipesBase.AbstractLayout, 1}, Symbol}) - precompile(Tuple{typeof(Plots.axis_drawing_info), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.gr_get_color), Plots.Series}) - precompile(Tuple{typeof(Plots.showaxis), Symbol, Symbol}) - precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64, Array{Plots.Plot{T} where T<:RecipesBase.AbstractBackend, 1}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{}}) - precompile(Tuple{typeof(Plots.default), Symbol}) - precompile(Tuple{typeof(Plots.add_layout_pct!), Base.Dict{Symbol, Any}, Expr, Int64, Int64}) - precompile(Tuple{typeof(Plots.gr_xaxis_height), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Float64, Plots.Shape}) - precompile(Tuple{typeof(Plots.warnOnUnsupported_args), Plots.GRBackend, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.gr_xaxis_height), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.gr_set_viewport_cmap), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.gr_set_linecolor), PlotUtils.ColorGradient}) - precompile(Tuple{typeof(Plots.contour_levels), Plots.Series, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots._scale_adjusted_values), Type{Float64}, Array{Float64, 1}, Symbol}) - precompile(Tuple{typeof(Plots.has_attribute_segments), Plots.Series}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.isijulia)}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Int64, Plots.Shape}) + precompile(Tuple{typeof(Plots.iscontour), Plots.Series}) + precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Float64, 1}, Array{Any, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.replaceAlias!), Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Symbol}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) precompile(Tuple{typeof(Plots.get_clims), Plots.Series}) - precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64, Array{Plots.Plot{T} where T<:RecipesBase.AbstractBackend, 1}}) - precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, Base.StepRange{Int64, Int64}, Symbol}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Float64, 2}}) - precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) - precompile(Tuple{typeof(Plots.get_clims), Plots.Series}) - precompile(Tuple{typeof(Plots.color_or_nothing!), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.gr_viewport_from_bbox), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.gr_display), Plots.Plot{Plots.GRBackend}, String}) - precompile(Tuple{typeof(Plots.default_should_widen), Plots.Axis}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.gr_legend_pos), Plots.Subplot{Plots.GRBackend}, Float64, Float64}) - precompile(Tuple{typeof(Plots._plots_defaults)}) - precompile(Tuple{typeof(Plots.gr_draw_colorbar), Plots.GRColorbar, Plots.Subplot{Plots.GRBackend}, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.layout_args), Base.Dict{Symbol, Any}, Int64}) - precompile(Tuple{typeof(Plots.default_should_widen), Plots.Axis}) - precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64}) - precompile(Tuple{typeof(Plots.gr_polaraxes), Int64, Float64, Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.isvertical), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.gr_viewport_from_bbox), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.get_markercolor), Plots.Series, Float64, Float64, Int64}) - precompile(Tuple{typeof(Plots._preprocess_barlike), Base.Dict{Symbol, Any}, Array{Int64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, Tuple{Int64, Int64}, Symbol}) + precompile(Tuple{typeof(Plots.axis_drawing_info), Plots.Subplot{Plots.GRBackend}}) precompile(Tuple{typeof(Plots._backend_instance), Symbol}) - precompile(Tuple{typeof(Plots.has_attribute_segments), Plots.Series}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._preprocess_barlike), Base.Dict{Symbol, Any}, Array{Float64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) - precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Union{Base.Missing, Int64}, 1}}) + precompile(Tuple{typeof(Plots._update_subplot_colors), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.warnOnUnsupported), Plots.GRBackend, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._heatmap_edges), Array{Float64, 1}, Bool}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._plots_defaults)}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._backend_instance), Symbol}) + precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64, Array{Plots.Plot{T} where T<:RecipesBase.AbstractBackend, 1}}) + precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64, Array{Plots.Plot{T} where T<:RecipesBase.AbstractBackend, 1}}) precompile(Tuple{typeof(Plots.hasgrid), Symbol, Symbol}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Union{Base.Missing, Number}, 1}}) - precompile(Tuple{typeof(Plots.get_markercolor), Plots.Series, Float64, Float64, Int64}) - precompile(Tuple{typeof(Plots.process_annotation), Plots.Subplot{Plots.GRBackend}, Int64, Float64, Plots.PlotText, Plots.Font}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) - precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Array{T, 1} where T, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.backend), Plots.GRBackend}) - precompile(Tuple{typeof(Plots._hist_edges), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Tuple{Int64, Int64}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.is_attr_supported), Symbol}) - precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.GRBackend}, Symbol, Bool, Bool}) - precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Char}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}}) precompile(Tuple{typeof(Plots._cbar_unique), Array{Symbol, 1}, String}) - precompile(Tuple{typeof(Plots._hist_edges), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Int64}) - precompile(Tuple{typeof(Plots._cbar_unique), Array{Int64, 1}, String}) - precompile(Tuple{typeof(Plots.convertToAnyVector), Int64, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Array{Symbol, 2}, Symbol}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Int64, 1}}) - precompile(Tuple{typeof(Plots.frame), Plots.Animation}) - precompile(Tuple{typeof(Plots.shape_data), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Float64}) - precompile(Tuple{typeof(Plots._cbar_unique), Array{Nothing, 1}, String}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.get_clims), Plots.Series}) + precompile(Tuple{typeof(Plots.__init__)}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.make_fillrange_side), Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy}}) + precompile(Tuple{typeof(Plots.warnOnUnsupported_args), Plots.GRBackend, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}}) + precompile(Tuple{typeof(Plots.is_marker_supported), Plots.GRBackend, Symbol}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.gr_xaxis_height), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.gr_legend_pos), Plots.Subplot{Plots.GRBackend}, Float64, Float64}) + precompile(Tuple{typeof(Plots.default_should_widen), Plots.Axis}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._hist_edges), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Tuple{Int64, Int64}}) + precompile(Tuple{typeof(Plots.gr_text), Float64, Float64, String}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Float64, 1}, Array{String, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.Spy}}) + precompile(Tuple{typeof(Plots.nanappend!), Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._update_min_padding!), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.slice_arg), Array{String, 2}, Int64}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) precompile(Tuple{typeof(Plots._cbar_unique), Array{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, 1}, String}) - precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots._bin_centers), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.addExtension), String, String}) - precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, String, Symbol}) - precompile(Tuple{typeof(Plots.create_grid), Symbol}) + precompile(Tuple{typeof(Plots.gr_set_linecolor), PlotUtils.ColorGradient}) + precompile(Tuple{typeof(Plots.default), Symbol}) + precompile(Tuple{typeof(Plots.gr_set_viewport_cmap), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.layout_args), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots.gr_get_color), Plots.Series}) + precompile(Tuple{typeof(Plots._cbar_unique), Array{Int64, 1}, String}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, typeof(Base.log), Int64}}) + precompile(Tuple{typeof(Plots.layout_args), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots.color_or_nothing!), Base.Dict{Symbol, Any}, Symbol}) precompile(Tuple{typeof(Plots.getxy), Plots.Plot{Plots.GRBackend}, Int64}) - precompile(Tuple{typeof(Plots.straightline_data), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots.gr_display), Plots.Plot{Plots.GRBackend}, String}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Plots.Spy}}) + precompile(Tuple{typeof(Plots.ensure_gradient!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots.link_axes!), Plots.Axis, Plots.Axis}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots.contour_levels), Plots.Series, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.gr_xaxis_height), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Function, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.is_attr_supported), Symbol}) + precompile(Tuple{typeof(Plots.gr_viewport_from_bbox), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.ispolar), Plots.Series}) + precompile(Tuple{typeof(Plots.default_should_widen), Plots.Axis}) + precompile(Tuple{typeof(Plots.shape_data), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Float64}) + precompile(Tuple{typeof(Plots.gr_polaraxes), Int64, Float64, Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._add_markershape), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Char}) + precompile(Tuple{typeof(Plots.has_attribute_segments), Plots.Series}) + precompile(Tuple{typeof(Plots._preprocess_barlike), Base.Dict{Symbol, Any}, Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._bin_centers), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.add_layout_pct!), Base.Dict{Symbol, Any}, Expr, Int64, Int64}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Int64, 1}}}) + precompile(Tuple{typeof(Plots._preprocess_barlike), Base.Dict{Symbol, Any}, Array{Int64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.gr_draw_colorbar), Plots.GRColorbar, Plots.Subplot{Plots.GRBackend}, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.gr_set_line), Int64, Symbol, ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.Spy}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Float64}) + precompile(Tuple{typeof(Plots.is_seriestype_supported), Plots.GRBackend, Symbol}) precompile(Tuple{typeof(Plots.make_steps), Base.UnitRange{Int64}, Symbol}) - precompile(Tuple{typeof(Plots._update_axis), Plots.Axis, Base.Dict{Symbol, Any}, Symbol, Int64}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{String, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Union{Base.Missing, Int64}, 1}}) + precompile(Tuple{typeof(Plots._series_index), Base.Dict{Symbol, Any}, Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.GRBackend}, Symbol, Bool, Bool}) + precompile(Tuple{typeof(Plots.process_annotation), Plots.Subplot{Plots.GRBackend}, Int64, Float64, Plots.PlotText, Plots.Font}) + precompile(Tuple{typeof(Plots.get_markercolor), Plots.Series, Float64, Float64, Int64}) + precompile(Tuple{typeof(Plots.gr_get_color), Plots.Series}) + precompile(Tuple{typeof(Plots.convertToAnyVector), Int64, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots.gr_set_line), Float64, Symbol, ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Float64, Float64, Int64}) + precompile(Tuple{typeof(Plots.fix_colorgradient!), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Plots.PortfolioComposition}}) + precompile(Tuple{typeof(Plots._cbar_unique), Array{Nothing, 1}, String}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) + precompile(Tuple{typeof(Plots.series_annotations_shapes!), Plots.Series, Symbol}) + precompile(Tuple{typeof(Plots.titlefont), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.convert_sci_unicode), String}) + precompile(Tuple{typeof(Plots.create_grid_curly), Expr}) + precompile(Tuple{typeof(Plots.showaxis), Symbol, Symbol}) + precompile(Tuple{typeof(Plots._update_series_attributes!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Symbol}) precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Union{Base.Missing, Int64}, 1}}}) - precompile(Tuple{typeof(Plots.gr_get_color), Plots.Series}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.is_seriestype_supported), Plots.GRBackend, Symbol}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.get_xy), Plots.OHLC{Float64}, Int64, Float64}) - precompile(Tuple{typeof(Plots._cbar_unique), Array{PlotUtils.ColorGradient, 1}, String}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Base.Complex{Float64}, 1}}}) - precompile(Tuple{typeof(Plots.series_annotations_shapes!), Plots.Series, Symbol}) - precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Function, 1}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Function, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.ensure_gradient!), Base.Dict{Symbol, Any}, Symbol, Symbol}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Array{Float64, 1}, 1}}) - precompile(Tuple{typeof(Plots.warnOnUnsupported_scales), Plots.GRBackend, Base.Dict{Symbol, Any}}) precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) - precompile(Tuple{typeof(Plots._plot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.UnitRange{Int64}}}) - precompile(Tuple{typeof(Plots.is_marker_supported), Plots.GRBackend, Symbol}) - precompile(Tuple{typeof(Plots.wand_edges), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Base.UnitRange{Int64}}) - precompile(Tuple{typeof(Plots.slice_arg), Base.ReshapedArray{Int64, 2, Base.UnitRange{Int64}, Tuple{}}, Int64}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{String, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, typeof(Base.log), Int64}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Function, 1}, Int64}}) - precompile(Tuple{typeof(Plots._series_index), Base.Dict{Symbol, Any}, Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Int64}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Plots.PortfolioComposition}}) - precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Base.StepRange{Int64, Int64}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) - precompile(Tuple{typeof(Plots._update_series_attributes!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Symbol, Symbol}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.gr_text), Float64, Float64, String}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.Spy}}) precompile(Tuple{typeof(Plots.warnOnUnsupported_args), Plots.GRBackend, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._update_min_padding!), Plots.GridLayout}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}}) - precompile(Tuple{typeof(Plots.gr_set_gradient), PlotUtils.ColorGradient}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy}}) - precompile(Tuple{typeof(Plots.titlefont), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Base.Complex{Float64}, 1}}}) + precompile(Tuple{typeof(Plots.get_markerstrokecolor), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Plots.OHLC{T} where T<:Real, 1}}}) + precompile(Tuple{typeof(Plots.get_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis}) + precompile(Tuple{typeof(Plots._update_axis), Plots.Axis, Base.Dict{Symbol, Any}, Symbol, Int64}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots.link_subplots), Array{RecipesBase.AbstractLayout, 1}, Symbol}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.gr_display), Plots.Plot{Plots.GRBackend}, String}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Function, 1}, Int64}}) + precompile(Tuple{typeof(Plots.gr_fill_viewport), Array{Float64, 1}, ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.gr_viewport_from_bbox), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}}) precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.GRBackend}, Symbol, Bool, Bool}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) - precompile(Tuple{typeof(Plots._update_subplot_periphery), Plots.Subplot{Plots.GRBackend}, Array{Any, 1}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.isvertical), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.xlims), Int64}) + precompile(Tuple{typeof(Plots.reset_extrema!), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Function, 1}}) precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Array{T, 1} where T, 1}}}) - precompile(Tuple{typeof(Plots.unzip), Array{Tuple{Float64, Float64, Float64}, 1}}) + precompile(Tuple{typeof(Plots._plot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots._process_seriesrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots.warnOnUnsupported_scales), Plots.GRBackend, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._update_axis), Plots.Axis, Base.Dict{Symbol, Any}, Symbol, Int64}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Float64, Plots.Shape}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.gr_set_gradient), PlotUtils.ColorGradient}) + precompile(Tuple{typeof(Plots._update_series_attributes!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._process_seriesrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._pick_default_backend)}) + precompile(Tuple{typeof(Plots.warnOnUnsupported), Plots.GRBackend, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Int64, Int64, Plots.Shape}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._replace_linewidth), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, Tuple{Int64, Int64}, Symbol}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Int64}) precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}, Array{Float64, 1}}}) precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.command_idx), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{Any, 1}}, Int64}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Union{Base.Missing, Int64}, 1}}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Base.LinRange{Float64}}) - precompile(Tuple{typeof(Plots.slice_arg), Array{Measures.Length{:mm, Float64}, 2}, Int64}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Int64, 1}}}) - precompile(Tuple{typeof(Plots._update_min_padding!), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.Spy}}) - precompile(Tuple{typeof(Plots._plot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) - precompile(Tuple{typeof(Plots.aliasesAndAutopick), Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Symbol}, Array{Symbol, 1}, Int64}) - precompile(Tuple{typeof(Plots.colorbar_style), Plots.Series}) - precompile(Tuple{typeof(Plots._update_subplot_periphery), Plots.Subplot{Plots.GRBackend}, Array{Any, 1}}) - precompile(Tuple{typeof(Plots.fakedata), Int64, Int64}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.autopick_ignore_none_auto), Array{Symbol, 1}, Int64}) - precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Base.Missing}) - precompile(Tuple{typeof(Plots._add_defaults!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Int64}) - precompile(Tuple{typeof(Plots._cycle), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int64}) - precompile(Tuple{typeof(Plots.make_steps), Array{Int64, 1}, Symbol}) - precompile(Tuple{typeof(Plots.gr_set_line), Float64, Symbol, ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.make_fillrange_side), Array{Float64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._update_min_padding!), Plots.GridLayout}) - precompile(Tuple{typeof(Plots._add_defaults!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Int64}) - precompile(Tuple{typeof(Plots._process_seriesrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._add_markershape), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) - precompile(Tuple{typeof(Plots.ispolar), Plots.Series}) - precompile(Tuple{typeof(Plots._hist_edges), Tuple{Array{Float64, 1}}, Symbol}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.make_steps), Array{Float64, 1}, Symbol}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}}) - precompile(Tuple{typeof(Plots.filter_data), Base.UnitRange{Int64}, Array{Int64, 1}}) - precompile(Tuple{typeof(Plots.create_grid_curly), Expr}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._show), Base.IOStream, Base.Multimedia.MIME{Symbol("image/png")}, Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}}) - precompile(Tuple{typeof(Plots._binbarlike_baseline), Float64, Symbol}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.get_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis}) - precompile(Tuple{typeof(Plots.colorbar_style), Plots.Series}) - precompile(Tuple{typeof(Plots.ensure_gradient!), Base.Dict{Symbol, Any}, Symbol, Symbol}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Float64, Float64, Int64}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 2}}}) precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}}) - precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.make_fillrange_from_ribbon), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.is_scale_supported), Plots.GRBackend, Symbol}) - precompile(Tuple{typeof(Plots.isvertical), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}}) - precompile(Tuple{typeof(Plots.right), Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) - precompile(Tuple{typeof(Plots.gr_set_line), Int64, Symbol, ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) - precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Symbol, Symbol}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}}) - precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Float64, Float64, Int64}) - precompile(Tuple{typeof(Plots.supported_markers)}) - precompile(Tuple{typeof(Plots.warnOnUnsupported), Plots.GRBackend, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._process_seriesrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, String}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._add_markershape), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}}) - precompile(Tuple{typeof(Plots.gr_lims), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Bool, Nothing}) - precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) - precompile(Tuple{typeof(Plots._add_smooth_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.supported_styles)}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) - precompile(Tuple{typeof(Plots.gr_fill_viewport), Array{Float64, 1}, ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout, Array{Measures.Length{:mm, Float64}, 1}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}}) - precompile(Tuple{typeof(Plots._process_seriesrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.warnOnUnsupported_scales), Plots.GRBackend, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Function, 1}}) - precompile(Tuple{typeof(Plots.get_xy), Array{Plots.OHLC{T} where T<:Real, 1}, Base.UnitRange{Int64}}) - precompile(Tuple{typeof(Plots.gr_text), Float64, Float64, String}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) - precompile(Tuple{typeof(Plots.like_histogram), Symbol}) - precompile(Tuple{typeof(Plots.compute_gridsize), Int64, Int64, Int64}) - precompile(Tuple{typeof(Plots._process_plotrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}, Array{Base.Dict{Symbol, Any}, 1}}) - precompile(Tuple{typeof(Plots.get_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis}) - precompile(Tuple{typeof(Plots.is_marker_supported), Symbol}) - precompile(Tuple{typeof(Plots.gr_set_viewport_polar)}) - precompile(Tuple{typeof(Plots._pick_default_backend)}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Tuple{Int64, Int64}, Int64, Bool}) - precompile(Tuple{typeof(Plots._preprocess_userrecipe), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Plots.Surface{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.all3D), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.make_fillrange_side), Array{Float64, 1}, Int64}) - precompile(Tuple{typeof(Plots.reset_extrema!), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._replace_linewidth), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Int64, 1}}) - precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, Symbol, Symbol}) - precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Float64, Symbol}) - precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Float64, Float64, Int64}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.slice_arg), Array{ColorTypes.RGBA{Float64}, 2}, Int64}) - precompile(Tuple{typeof(Plots.should_add_to_legend), Plots.Series}) - precompile(Tuple{typeof(Plots.reset_extrema!), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Plots.Shape}) - precompile(Tuple{typeof(Plots.is3d), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Int64, Int64, Bool}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Bool, Int64, Bool}) - precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.gr_draw_marker), Float64, Float64, Int64, Symbol}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Symbol, Int64, Bool}) - precompile(Tuple{typeof(Plots._update_series_attributes!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.gr_yaxis_width), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Nothing, Int64, Bool}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Measures.Length{:mm, Float64}, Int64, Bool}) - precompile(Tuple{typeof(Plots.transpose_z), Plots.Series, Array{Float64, 2}, Bool}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Plots.Surface{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Float64, Int64, Bool}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, String, Int64, Bool}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Int64}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Array{Any, 1}, Int64, Bool}) - precompile(Tuple{typeof(Plots.xlims), Int64}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Any}, Int64, Bool}) - precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Int64, Symbol}) - precompile(Tuple{typeof(Plots.create_grid_curly), Expr}) - precompile(Tuple{typeof(Plots.slice_arg), Array{String, 2}, Int64}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) - precompile(Tuple{typeof(Plots._update_min_padding!), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.slice_arg), Array{Symbol, 2}, Int64}) - precompile(Tuple{typeof(Plots.ignorenan_extrema), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.UnitRange{Int64}}) - precompile(Tuple{typeof(Plots.get_linealpha), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Plots.Spy}}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Array{Float64, 1}, 1}}) + precompile(Tuple{typeof(Plots._plot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Symbol, Symbol}) - precompile(Tuple{typeof(Plots.gr_yaxis_width), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Symbol, Symbol}) - precompile(Tuple{typeof(Plots.extendSeriesData), Array{Float64, 1}, Float64}) - precompile(Tuple{typeof(Plots.is_style_supported), Plots.GRBackend, Symbol}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Tuple{Int64, Int64}, Int64, Bool}) - precompile(Tuple{typeof(Plots._replace_linewidth), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._add_errorbar_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._pick_default_backend)}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Int64}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.ignorenan_minimum), Array{Int64, 1}}) - precompile(Tuple{typeof(Plots._add_errorbar_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.filter_data), Array{Float64, 1}, Array{Int64, 1}}) - precompile(Tuple{typeof(Plots.convert_sci_unicode), String}) - precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Int64, Int64, Symbol}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Nothing, Int64, Bool}) - precompile(Tuple{typeof(Plots._get_defaults), Symbol}) - precompile(Tuple{typeof(Plots.gr_inqtext), Int64, Int64, String}) - precompile(Tuple{typeof(Plots.gr_set_fillcolor), ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, typeof(identity)}) - precompile(Tuple{typeof(Plots.gr_set_fill), ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots.fakedata), Int64, Int64}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Float64, Int64, Bool}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, String, Int64, Bool}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.UnitRange{Int64}}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Bool, Int64, Bool}) - precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Int64, Symbol}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Measures.Length{:mm, Float64}, Int64, Bool}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Int64, Int64, Bool}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Symbol, Int64, Bool}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Int32, 1}}) - precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Float64, Symbol}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Array{Any, 1}, Int64, Bool}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Any}, Int64, Bool}) - precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Array{Any, 1}}) - precompile(Tuple{typeof(Plots.create_grid_vcat), Expr}) - precompile(Tuple{typeof(Plots.calc_num_subplots), Plots.GridLayout}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.gr_set_textcolor), ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots.fg_color), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.update_inset_bboxes!), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.ignorenan_extrema), Array{Float64, 2}}) - precompile(Tuple{typeof(Plots.like_surface), Symbol}) - precompile(Tuple{typeof(Plots.gr_set_xticks_font), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout, Array{Measures.Length{:mm, Float64}, 1}}) - precompile(Tuple{typeof(Plots.backend), Symbol}) - precompile(Tuple{typeof(Plots._process_plotrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}, Array{Base.Dict{Symbol, Any}, 1}}) - precompile(Tuple{typeof(Plots.is3d), Symbol}) - precompile(Tuple{typeof(Plots.iter_segments), Array{Float64, 1}, Array{Float64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.get_fillalpha), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) - precompile(Tuple{typeof(Plots._cycle), Base.StepRange{Int64, Int64}, Int64}) - precompile(Tuple{typeof(Plots.series_annotations), Array{Any, 1}}) - precompile(Tuple{typeof(Plots.convertLegendValue), Symbol}) - precompile(Tuple{typeof(Plots.compute_xyz), Nothing, Nothing, Nothing}) - precompile(Tuple{typeof(Plots.gr_text_size), String}) - precompile(Tuple{typeof(Plots.backend), Symbol}) - precompile(Tuple{typeof(Plots.gr_set_markercolor), ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots.ignorenan_maximum), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.gr_set_yticks_font), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.legendfont), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Int64, 1}, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.update_inset_bboxes!), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.gr_set_yticks_font), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.iter_segments), Base.UnitRange{Int64}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.hascolorbar), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.ignorenan_extrema), Base.StepRange{Int64, Int64}}) - precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{String, 1}}, Int64}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Int64}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Nothing}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Bool}) - precompile(Tuple{typeof(Plots.straightline_data), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.is3d), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.arrow), Int64}) - precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Int64}) - precompile(Tuple{typeof(Plots.link_axes!), Plots.Axis, Plots.Axis}) - precompile(Tuple{typeof(Plots.setxy!), Plots.Plot{Plots.GRBackend}, Tuple{Array{Float64, 1}, Array{Float64, 1}}, Int64}) - precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol, Array{Float64, 1}, Symbol, Tuple{Int64, Int64}}) - precompile(Tuple{typeof(Plots._update_series_attributes!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.link_axes!), Plots.Axis, Plots.Axis}) - precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, typeof(identity), Nothing}) - precompile(Tuple{typeof(Plots.bbox!), Plots.GridLayout, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) - precompile(Tuple{typeof(Plots._preprocess_userrecipe), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._update_plot_args), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.iter_segments), Plots.Series}) - precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Tuple{Int64, Int64}}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Plots.Stroke}) - precompile(Tuple{typeof(Plots._update_axis_links), Plots.Plot{Plots.GRBackend}, Plots.Axis, Symbol}) - precompile(Tuple{typeof(Plots.autopick), Array{ColorTypes.RGBA{Float64}, 1}, Int64}) - precompile(Tuple{typeof(Plots.wrap_surfaces), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._update_clims), Float64, Float64, Int64, Int64}) - precompile(Tuple{typeof(Plots.filter_data!), Base.Dict{Symbol, Any}, Array{Int64, 1}}) - precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Bool}) - precompile(Tuple{typeof(Plots._subplot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) - precompile(Tuple{typeof(Plots.legendfont), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.ensure_gradient!), Base.Dict{Symbol, Any}, Symbol, Symbol}) - precompile(Tuple{typeof(Plots.layout_args), Tuple{Int64, Int64}}) - precompile(Tuple{typeof(Plots._cycle), Base.UnitRange{Int64}, Array{Int64, 1}}) - precompile(Tuple{typeof(Plots._cycle), Array{Any, 1}, Int64}) - precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{String, 1}}, Int64}) - precompile(Tuple{typeof(Plots.rowsize), Expr}) - precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Float64}) - precompile(Tuple{typeof(Plots.tickfont), Plots.Axis}) - precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol, Bool}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.UnitRange{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.process_ribbon), Tuple{Base.LinRange{Float64}, Base.LinRange{Float64}}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.is_attr_supported), Plots.GRBackend, Symbol}) - precompile(Tuple{typeof(Plots.get_series_color), ColorTypes.RGBA{Float64}, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) - precompile(Tuple{typeof(Plots.inline), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._cycle), Array{Plots.Subplot{T} where T<:RecipesBase.AbstractBackend, 1}, Int64}) - precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64}) - precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Function, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Array{String, 1}, Int64}) - precompile(Tuple{typeof(Plots.get_markerstrokecolor), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots._update_clims), Float64, Float64, Float64, Float64}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._cycle), Array{String, 1}, Int64}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}}) - precompile(Tuple{typeof(Plots.color_or_nothing!), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.fg_color), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._override_seriestype_check), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.get_series_color), Int64, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) - precompile(Tuple{typeof(Plots.get_linewidth), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.Spy}}) - isdefined(Plots, Symbol("#scatter!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#scatter!##kw")), NamedTuple{(:markersize, :c), Tuple{Int64, Symbol}}, typeof(Plots.scatter!), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._update_axis), Plots.Axis, Base.Dict{Symbol, Any}, Symbol, Int64}) - precompile(Tuple{typeof(Plots.compute_xyz), Nothing, Array{Union{Base.Missing, Float64}, 1}, Nothing}) - precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}, Float64}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}}) - precompile(Tuple{typeof(Plots._update_subplot_args), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Int64, Bool}) - isdefined(Plots, Symbol("#heatmap##kw")) && precompile(Tuple{getfield(Plots, Symbol("#heatmap##kw")), NamedTuple{(:aspect_ratio,), Tuple{Int64}}, typeof(Plots.heatmap), Array{String, 1}, Int}) - precompile(Tuple{typeof(Plots.compute_xyz), Array{String, 1}, Array{Float64, 1}, Nothing}) - isdefined(Plots, Symbol("#portfoliocomposition##kw")) && precompile(Tuple{getfield(Plots, Symbol("#portfoliocomposition##kw")), NamedTuple{(:labels,), Tuple{Array{String, 2}}}, typeof(Plots.portfoliocomposition), Array{Float64, 2}, Int}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Array{Int64, 1}, Int64}) - precompile(Tuple{typeof(Plots.get_series_color), Symbol, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) - precompile(Tuple{typeof(Plots.tovec), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.get_linestyle), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) - precompile(Tuple{typeof(Plots.get_series_color), ColorTypes.RGBA{Float64}, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) - isdefined(Plots, Symbol("#gr_set_font##kw")) && precompile(Tuple{getfield(Plots, Symbol("#gr_set_font##kw")), NamedTuple{(:halign, :valign, :rotation), Tuple{Symbol, Symbol, Int64}}, typeof(Plots.gr_set_font), Plots.Font}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) - isdefined(Plots, Symbol("#scatter##kw")) && precompile(Tuple{getfield(Plots, Symbol("#scatter##kw")), NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks), Tuple{Array{Symbol, 2}, Array{String, 2}, Base.ReshapedArray{Int64, 2, Base.UnitRange{Int64}, Tuple{}}, Int64, String, Int64, Base.UnitRange{Int64}}}, typeof(Plots.scatter), Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._show), Base.IOStream, Base.Multimedia.MIME{Symbol("image/png")}, Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._update_subplot_args), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Int64, Bool}) - precompile(Tuple{typeof(Plots.xlims), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.process_ribbon), Int64, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}}) - precompile(Tuple{typeof(Plots.backend)}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.link_axes!), Plots.GridLayout, Symbol}) - isdefined(Plots, Symbol("#gr_polyline##kw")) && precompile(Tuple{getfield(Plots, Symbol("#gr_polyline##kw")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Array{Symbol, 2}, Int64}) - precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Symbol}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Bool}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.compute_xyz), Array{String, 1}, Array{String, 1}, Plots.Surface{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Int64}) - precompile(Tuple{typeof(Plots.process_ribbon), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.gr_text_size), String, Int64}) - precompile(Tuple{typeof(Plots._subplot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) - precompile(Tuple{typeof(Plots.layout_args), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.process_fillrange), Int64, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Float64}) - precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}}) - precompile(Tuple{typeof(Plots._display), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) - precompile(Tuple{typeof(Plots._update_axis_links), Plots.Plot{Plots.GRBackend}, Plots.Axis, Symbol}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) - precompile(Tuple{typeof(Plots.gr_set_font), Plots.Font}) - precompile(Tuple{typeof(Plots.get_markeralpha), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.legendtitlefont), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.UnitRange{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.is_2tuple), Int64}) - precompile(Tuple{typeof(Plots.is_marker_supported), Plots.Shape}) - precompile(Tuple{typeof(Plots.gr_colorbar_colors), Plots.Series, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Float64}) - precompile(Tuple{typeof(Plots.iter_segments), Array{Int64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.get_markerstrokealpha), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) - precompile(Tuple{typeof(Plots._hist_edge), Tuple{Array{Float64, 1}}, Int64, Symbol}) - precompile(Tuple{typeof(Plots._update_axis_colors), Plots.Axis}) - precompile(Tuple{typeof(Plots.xgrid!), Plots.Plot{Plots.GRBackend}, Symbol, Int}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Base.UnitRange{Int64}}) - precompile(Tuple{typeof(Plots.get_series_color), PlotUtils.ColorGradient, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) - precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, Array{Float64, 1}, Plots.Surface{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, typeof(identity), Nothing}) - isdefined(Plots, Symbol("#gr_set_font##kw")) && precompile(Tuple{getfield(Plots, Symbol("#gr_set_font##kw")), NamedTuple{(:halign, :valign, :rotation), Tuple{Symbol, Symbol, Int64}}, typeof(Plots.gr_set_font), Plots.Font}) - precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.yaxis!), String, Symbol}) - precompile(Tuple{typeof(Plots.ignorenan_maximum), Base.UnitRange{Int64}}) - precompile(Tuple{typeof(Plots._update_plot_args), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - isdefined(Plots, Symbol("#scatter!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#scatter!##kw")), NamedTuple{(:zcolor, :m, :ms, :lab), Tuple{Array{Float64, 1}, Tuple{Symbol, Float64, Plots.Stroke}, Array{Float64, 1}, String}}, typeof(Plots.scatter!), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.ignorenan_minimum), Base.UnitRange{Int64}}) - precompile(Tuple{typeof(Plots._prepare_annotations), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.extractGroupArgs), Array{String, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Base.StepRange{Int64, Int64}}) - precompile(Tuple{typeof(Plots.plotarea!), Plots.GridLayout, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) - precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, ColorTypes.RGBA{Float64}, Symbol}) - precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Bool}) - precompile(Tuple{typeof(Plots.text), String, Symbol, Int64, Int}) - precompile(Tuple{typeof(Plots.font), Int64, Int}) - precompile(Tuple{typeof(Plots.ispolar), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._prepare_subplot), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Bool, Symbol}) - precompile(Tuple{typeof(Plots._cycle), Int64, Base.StepRange{Int64, Int64}}) - precompile(Tuple{typeof(Plots.font), Symbol, Int}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Plots.Spy}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.guidefont), Plots.Axis}) - precompile(Tuple{typeof(Plots._add_the_series), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._update_axis_colors), Plots.Axis}) - precompile(Tuple{typeof(Plots.stroke), Int64, Int}) - precompile(Tuple{typeof(Plots.bottom), Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) - isdefined(Plots, Symbol("#pie##kw")) && precompile(Tuple{getfield(Plots, Symbol("#pie##kw")), NamedTuple{(:title, :l), Tuple{String, Float64}}, typeof(Plots.pie), Array{String, 1}, Int}) - precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Bool}) - precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, Array{Float64, 1}, Array{Float64, 1}}) - isdefined(Plots, Symbol("#@layout")) && precompile(Tuple{getfield(Plots, Symbol("#@layout")), LineNumberNode, Module, Expr}) - precompile(Tuple{typeof(Plots.build_layout), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._preprocess_barlike), Base.Dict{Symbol, Any}, Base.UnitRange{Int64}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.compute_xyz), Nothing, Array{Float64, 1}, Nothing}) - precompile(Tuple{typeof(Plots.gr_contour_levels), Plots.Series, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.aliasesAndAutopick), Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Symbol}, Array{Symbol, 1}, Int64}) - precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{String, 1}}) - precompile(Tuple{typeof(Plots.process_fillrange), Nothing, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.bbox!), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) - precompile(Tuple{typeof(Plots.process_ribbon), typeof(identity), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._add_the_series), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - isdefined(Plots, Symbol("#histogram2d##kw")) && precompile(Tuple{getfield(Plots, Symbol("#histogram2d##kw")), NamedTuple{(:nbins,), Tuple{Int64}}, typeof(Plots.histogram2d), Array{Float64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Array{Float64, 1}, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._prepare_subplot), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.gr_text_size), String, Int64}) - precompile(Tuple{typeof(Plots.gr_set_gradient), Plots.Series}) - precompile(Tuple{typeof(Plots.attr), Plots.EmptyLayout, Symbol}) - precompile(Tuple{typeof(Plots.gr_update_colorbar!), Plots.GRColorbar, Plots.Series}) - isdefined(Plots, Symbol("#hline!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#hline!##kw")), NamedTuple{(:line,), Tuple{Tuple{Int64, Symbol, Float64, Array{Symbol, 2}}}}, typeof(Plots.hline!), Array{Float64, 2}}) - precompile(Tuple{typeof(Plots.ignorenan_extrema), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) - precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Plots.Shape, Symbol}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.labelfunc), Symbol, Plots.GRBackend}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.is_seriestype_supported), Symbol}) - precompile(Tuple{typeof(Plots.slice_arg), Tuple{Int64, Float64}, Int64}) - precompile(Tuple{typeof(Plots.slice_arg), Base.UnitRange{Int64}, Int64}) - precompile(Tuple{typeof(Plots.trueOrAllTrue), typeof(identity), Array{Symbol, 2}}) - precompile(Tuple{typeof(Plots.annotate!), Array{Tuple{Int64, Float64, Plots.PlotText}, 1}}) - precompile(Tuple{typeof(Plots.is_seriestype_supported), Symbol}) - precompile(Tuple{typeof(Plots.widen), Float64, Float64, Symbol}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.gr_set_xticks_font), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.plotarea!), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) - precompile(Tuple{typeof(Plots._cycle), ColorTypes.RGBA{Float64}, Int64}) - precompile(Tuple{typeof(Plots.gr_lims), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Bool, Nothing}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Float64, 2}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.is_marker_supported), Symbol}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}, Array{RecipesBase.RecipeData, 1}}) - isdefined(Plots, Symbol("#contour##kw")) && precompile(Tuple{getfield(Plots, Symbol("#contour##kw")), NamedTuple{(:fill,), Tuple{Bool}}, typeof(Plots.contour), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) - precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Int64}) - precompile(Tuple{typeof(Plots.font), String, Int}) - precompile(Tuple{typeof(Plots.vline!), Array{Int64, 1}}) - precompile(Tuple{typeof(Plots.wraptuple), Int64}) - precompile(Tuple{typeof(Plots.text), String, Int64, Symbol, Symbol}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.title!), String}) - precompile(Tuple{typeof(Plots._filter_input_data!), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Array{Int64, 1}}) - precompile(Tuple{typeof(Plots.attr), Plots.EmptyLayout, Symbol, Symbol}) - precompile(Tuple{typeof(Plots._display), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.frame), Plots.Animation, Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.UnitRange{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) - precompile(Tuple{typeof(Plots.gr_update_colorbar!), Plots.GRColorbar, Plots.Series}) - precompile(Tuple{typeof(Plots.titlefont), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.gr_set_gradient), Plots.Series}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._transform_ticks), Base.UnitRange{Int64}}) - precompile(Tuple{typeof(Plots._prepare_annotations), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.process_ribbon), Nothing, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.slice_arg), Tuple{Int64, Int64}, Int64}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) - isdefined(Plots, Symbol("#scatter##kw")) && precompile(Tuple{getfield(Plots, Symbol("#scatter##kw")), NamedTuple{(:m, :lab, :bg, :xlim, :ylim), Tuple{Tuple{Int64, Symbol}, Array{String, 2}, Symbol, Tuple{Int64, Int64}, Tuple{Int64, Int64}}}, typeof(Plots.scatter), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) - precompile(Tuple{typeof(Plots.tickfont), Plots.Axis}) - precompile(Tuple{typeof(Plots.series_annotations_shapes!), Plots.Series, Symbol}) - precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) - isdefined(Plots, Symbol("#scatter!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#scatter!##kw")), NamedTuple{(:marker, :series_annotations), Tuple{Tuple{Int64, Float64, Symbol}, Array{Any, 1}}}, typeof(Plots.scatter!), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) - precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Function, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.rightpad), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, Array{Float64, 1}, Nothing}) - precompile(Tuple{typeof(Plots.iter_segments), Plots.Series}) - precompile(Tuple{typeof(Plots.allAlphas), Int64}) - precompile(Tuple{typeof(Plots.gui), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._add_smooth_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._update_subplot_colors), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.link_axes!), Plots.GridLayout, Symbol}) - precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.ylims), Int64}) - precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}, Plots.Series}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.slice_arg), ColorTypes.RGBA{Float64}, Int64}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Int64, 1}, Tuple{Float64, Float64}, Int64}) - precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}, Nothing}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._transform_ticks), Base.StepRange{Int64, Int64}}) - precompile(Tuple{typeof(Plots.allStyles), Int64}) - precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}, Plots.Series}) - precompile(Tuple{typeof(Plots.layout_args), Int64}) - precompile(Tuple{typeof(Plots.locate_annotation), Plots.Subplot{Plots.GRBackend}, Int64, Float64, Plots.PlotText}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.contour), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}, Array{RecipesBase.RecipeData, 1}}) precompile(Tuple{typeof(Plots.png), Plots.Plot{Plots.GRBackend}, String}) - precompile(Tuple{typeof(Plots.create_grid), Expr}) - precompile(Tuple{typeof(Plots.guidefont), Plots.Axis}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.bottompad), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots._update_subplot_colors), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.create_grid_vcat), Expr}) - precompile(Tuple{typeof(Plots.toppad), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Array{String, 1}}) - precompile(Tuple{typeof(Plots.slice_arg), Int64, Int64}) - precompile(Tuple{typeof(Plots.trueOrAllTrue), typeof(Plots.is3d), Symbol}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Float64, Float64, Tuple{Float64, Float64}, Int64}) - precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Array{Union{Base.Missing, Float64}, 1}}) - precompile(Tuple{typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Float64}) - precompile(Tuple{typeof(Plots.slice_arg), Base.StepRange{Int64, Int64}, Int64}) - precompile(Tuple{typeof(Plots.rowsize), Symbol}) - precompile(Tuple{typeof(Plots.ylims), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Nothing}) - precompile(Tuple{typeof(Plots.wraptuple), Plots.SeriesAnnotations}) - precompile(Tuple{typeof(Plots.wraptuple), Bool}) - precompile(Tuple{typeof(Plots._transform_ticks), Nothing}) - precompile(Tuple{typeof(Plots.make_steps), Nothing, Symbol}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Plots.GridLayout, Int64}) - precompile(Tuple{typeof(Plots.supported_markers), Plots.GRBackend}) - precompile(Tuple{typeof(Plots.slice_arg), Nothing, Int64}) - precompile(Tuple{typeof(Plots.wraptuple), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.gr_set_font), Plots.Font}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, ColorTypes.RGB{Float64}, Int64}) - precompile(Tuple{typeof(Plots.leftpad), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.convertLegendValue), Bool}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, String, Int64}) - precompile(Tuple{typeof(Plots.wraptuple), Array{Any, 1}}) - precompile(Tuple{typeof(Plots.supported_styles), Plots.GRBackend}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Symbol, Int64, Symbol, Float64}}) - precompile(Tuple{typeof(Plots.stroke), Int64, Int64}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Symbol, Symbol, Int64, Float64}}) + precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, Base.StepRange{Int64, Int64}, Symbol}) + precompile(Tuple{typeof(Plots._update_min_padding!), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.aliasesAndAutopick), Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Symbol}, Array{Symbol, 1}, Int64}) + precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.recompute_lengths), Array{Measures.Measure, 1}}) + precompile(Tuple{typeof(Plots.make_steps), Array{Int64, 1}, Symbol}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}}) + precompile(Tuple{typeof(Plots.recompute_lengths), Array{Measures.Measure, 1}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}}) + precompile(Tuple{typeof(Plots._update_min_padding!), Plots.GridLayout}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{Any, 1}}, Int64}) + precompile(Tuple{typeof(Plots._process_seriesrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.is_scale_supported), Plots.GRBackend, Symbol}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.isvertical), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) precompile(Tuple{typeof(Plots.add_layout_pct!), Base.Dict{Symbol, Any}, Expr, Int64, Int64}) - precompile(Tuple{typeof(Plots._expand_subplot_extrema), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.wraptuple), Float64}) - precompile(Tuple{typeof(Plots.create_grid), Expr}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Array{Symbol, 2}, Int64}}) - precompile(Tuple{typeof(Plots._cycle), Float64, Int64}) - precompile(Tuple{typeof(Plots.calc_num_subplots), Plots.EmptyLayout}) - precompile(Tuple{typeof(Plots._replace_markershape), Plots.Shape}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Float64, Symbol}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.nobigs), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.prepare_output), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.slice_arg), Symbol, Int64}) - precompile(Tuple{typeof(Plots.get_linewidth), Plots.Series}) - precompile(Tuple{typeof(Plots.slice_arg), String, Int64}) - precompile(Tuple{typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}, typeof(identity)}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Symbol}}) - precompile(Tuple{typeof(Plots._cycle), Int64, Int64}) - precompile(Tuple{typeof(Plots.filter_data), Nothing, Array{Int64, 1}}) - precompile(Tuple{typeof(Plots.process_annotation), Plots.Subplot{Plots.GRBackend}, Int64, Float64, Plots.PlotText}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Float64, Symbol, Plots.Stroke}}) - precompile(Tuple{typeof(Plots.get_linestyle), Plots.Series}) - precompile(Tuple{typeof(Plots._expand_subplot_extrema), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots._cycle), Symbol, Int64}) - precompile(Tuple{typeof(Plots.get_fillalpha), Plots.Series}) - precompile(Tuple{typeof(Plots.font), String, Int}) - precompile(Tuple{typeof(Plots.get_series_color), Symbol, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Array{Symbol, 2}, Int64, Float64, Plots.Stroke}}) - precompile(Tuple{typeof(Plots.get_linealpha), Plots.Series}) - precompile(Tuple{typeof(Plots.slice_arg), Float64, Int64}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.replaceAliases!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Symbol}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{String, Tuple{Int64, Int64}, Base.StepRange{Int64, Int64}, Symbol}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Array{Symbol, 2}}}) - precompile(Tuple{typeof(Plots.is_2tuple), Symbol}) - precompile(Tuple{typeof(Plots._cycle), Plots.Shape, Int64}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Float64, Symbol}}) - precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.Subplot{Plots.GRBackend}, Array{Measures.Length{:mm, Float64}, 1}}) - precompile(Tuple{typeof(Plots.wraptuple), Nothing}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Float64, Plots.Stroke}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Symbol, Float64, Array{Symbol, 2}}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Symbol, Symbol}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Int64}}) - precompile(Tuple{typeof(Plots._cycle), Nothing, Int64}) - precompile(Tuple{typeof(Plots.link_axes!), Array{RecipesBase.AbstractLayout, 1}, Symbol}) - precompile(Tuple{typeof(Plots._replace_markershape), Array{Symbol, 2}}) - precompile(Tuple{typeof(Plots.allReals), Int64}) - precompile(Tuple{typeof(Plots.get_subplot), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{}}) - precompile(Tuple{typeof(Plots._transform_ticks), Symbol}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{String, Symbol}}) - precompile(Tuple{typeof(Plots._update_axis), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol, Int64}) - precompile(Tuple{typeof(Plots.slice_arg), Bool, Int64}) - precompile(Tuple{typeof(Plots.prepare_output), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Plots.Plot{Plots.GRBackend}, Int64}) - precompile(Tuple{typeof(Plots._create_backend_figure), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.text), String, Symbol}) - precompile(Tuple{typeof(Plots.bar), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.annotations), Array{Any, 1}}) - precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Symbol}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Int64, Int64}) - precompile(Tuple{typeof(Plots.link_axes!), Plots.Subplot{Plots.GRBackend}, Symbol}) - precompile(Tuple{typeof(Plots.get_axis), Plots.Subplot{Plots.GRBackend}, Symbol}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Int64, 1}}) - precompile(Tuple{typeof(Plots.series_annotations), Plots.SeriesAnnotations}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Float64, Array{Symbol, 2}, Int64}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Plots.Shape, Int64, ColorTypes.RGBA{Float64}}}) - precompile(Tuple{typeof(Plots._update_axis), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol, Int64}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Float64, Int64}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Symbol, Int64}) - precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Bool}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots._update_subplot_periphery), Plots.Subplot{Plots.GRBackend}, Array{Any, 1}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}}) + precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Int64}) + precompile(Tuple{typeof(Plots._add_defaults!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Int64}) + precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Base.Missing}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._update_min_padding!), Plots.GridLayout}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.should_add_to_legend), Plots.Series}) + precompile(Tuple{typeof(Plots.gr_set_fillcolor), ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.make_steps), Array{Float64, 1}, Symbol}) + precompile(Tuple{typeof(Plots.setxy!), Plots.Plot{Plots.GRBackend}, Tuple{Array{Float64, 1}, Array{Float64, 1}}, Int64}) + precompile(Tuple{typeof(Plots.colorbar_style), Plots.Series}) + precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Float64, Float64, Int64}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Float64, Float64, Int64, Symbol}) + precompile(Tuple{typeof(Plots.is3d), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.convert_to_polar), Array{Float64, 1}, Array{Float64, 1}, Tuple{Int64, Float64}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) + precompile(Tuple{typeof(Plots._replace_linewidth), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Tuple{Int64, Int64}, Int64, Bool}) + precompile(Tuple{typeof(Plots.compute_gridsize), Int64, Int64, Int64}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Int64, Symbol}) + precompile(Tuple{typeof(Plots._add_defaults!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Int64}) + precompile(Tuple{typeof(Plots.like_histogram), Symbol}) + precompile(Tuple{typeof(Plots.make_fillrange_side), Array{Float64, 1}, Int64}) + precompile(Tuple{typeof(Plots.gr_inqtext), Int64, Int64, String}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) + precompile(Tuple{typeof(Plots._add_markershape), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._add_smooth_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.backend), Symbol}) + precompile(Tuple{typeof(Plots.get_fillalpha), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots._process_plotrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}, Array{Base.Dict{Symbol, Any}, 1}}) + precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, String}) + precompile(Tuple{typeof(Plots.wraptuple), Int64}) + precompile(Tuple{typeof(Plots.colorbar_style), Plots.Series}) + precompile(Tuple{typeof(Plots.reset_extrema!), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._update_subplot_periphery), Plots.Subplot{Plots.GRBackend}, Array{Any, 1}}) + precompile(Tuple{typeof(Plots.filter_data), Base.UnitRange{Int64}, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.straightline_data), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.fg_color), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.get_markercolor), Plots.Series, Float64, Float64, Int64}) + precompile(Tuple{typeof(Plots.get_linealpha), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.warnOnUnsupported_scales), Plots.GRBackend, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.supported_markers)}) + precompile(Tuple{typeof(Plots.get_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis}) precompile(Tuple{typeof(Plots.gr_set_line), Int64, Symbol, PlotUtils.ColorGradient}) - precompile(Tuple{typeof(Plots.link_axes!), Array{RecipesBase.AbstractLayout, 1}, Symbol}) + precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, String, Symbol}) + precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Measures.Length{:mm, Float64}, Int64, Bool}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Function, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Plots.Spy}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) + precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Float64, Float64, Int64}) + precompile(Tuple{typeof(Plots._preprocess_binlike), Base.Dict{Symbol, Any}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._preprocess_userrecipe), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Bool}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Plots.Surface{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.xlims), Int64}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Array{Any, 1}, Int64, Bool}) + precompile(Tuple{typeof(Plots._filter_input_data!), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Plots.Shape}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, typeof(identity), Nothing}) + precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Function, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.gr_yaxis_width), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Int64, Int64, Bool}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Array{T, 1} where T, 1}}) + precompile(Tuple{typeof(Plots.should_add_to_legend), Plots.Series}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Any}, Int64, Bool}) + precompile(Tuple{typeof(Plots.is_marker_supported), Symbol}) + precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Base.StepRange{Int64, Int64}}) + precompile(Tuple{typeof(Plots.is3d), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.gr_set_viewport_polar)}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Plots.Surface{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Array{ColorTypes.RGBA{Float64}, 1}, Int64, Bool}) + precompile(Tuple{typeof(Plots.all3D), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Tuple{Int64, Int64}, Int64, Bool}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.supported_styles)}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Nothing, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Array{ColorTypes.RGBA{Float64}, 1}, Int64, Bool}) + precompile(Tuple{typeof(Plots._cbar_unique), Array{PlotUtils.ColorGradient, 1}, String}) + precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Plots.Stroke}) + precompile(Tuple{typeof(Plots.gr_lims), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Bool, Nothing}) + precompile(Tuple{typeof(Plots.create_grid_curly), Expr}) + precompile(Tuple{typeof(Plots._cycle), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int64}) + precompile(Tuple{typeof(Plots.is_style_supported), Plots.GRBackend, Symbol}) + precompile(Tuple{typeof(Plots._update_min_padding!), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Symbol, Int64, Bool}) + precompile(Tuple{typeof(Plots.gr_set_textcolor), ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots._prepare_subplot), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots._pick_default_backend)}) + precompile(Tuple{typeof(Plots.ignorenan_extrema), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, String, Int64, Bool}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Float64, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Bool, Int64, Bool}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.gr_set_fill), ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots._add_errorbar_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Bool}) + precompile(Tuple{typeof(Plots.is_marker_supported), Symbol}) + precompile(Tuple{typeof(Plots.fg_color), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.convertLegendValue), Symbol}) + precompile(Tuple{typeof(Plots.gr_inqtext), Int64, Int64, String}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots.ignorenan_extrema), Array{Float64, 2}}) + precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64}) + precompile(Tuple{typeof(Plots._update_series_attributes!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.gr_yaxis_width), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._process_plotrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}, Array{Base.Dict{Symbol, Any}, 1}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Any}, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Symbol, Int64, Bool}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots._add_errorbar_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.frame), Plots.Animation}) + precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Nothing}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Array{Any, 1}, Int64, Bool}) + precompile(Tuple{typeof(Plots.tickfont), Plots.Axis}) + precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.update_inset_bboxes!), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.fakedata), Int64, Int64}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, String, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Measures.Length{:mm, Float64}, Int64, Bool}) + precompile(Tuple{typeof(Plots.is3d), Symbol}) + precompile(Tuple{typeof(Plots.get_xy), Plots.OHLC{Float64}, Int64, Float64}) + precompile(Tuple{typeof(Plots.wraptuple), Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Nothing, Int64, Bool}) + precompile(Tuple{typeof(Plots.straightline_data), Tuple{Int64, Int64}, Tuple{Float64, Float64}, Array{Float64, 1}, Array{Float64, 1}, Int64}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Float64, Int64, Bool}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout, Array{Measures.Length{:mm, Float64}, 1}}) + precompile(Tuple{typeof(Plots.filter_data), Array{Float64, 1}, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.inline), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Array{Any, 1}}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Array{String, 1}, Int64}) + precompile(Tuple{typeof(Plots.extendSeriesData), Array{Float64, 1}, Float64}) + precompile(Tuple{typeof(Plots.trueOrAllTrue), typeof(Plots.is3d), Symbol}) + precompile(Tuple{typeof(Plots.gr_set_yticks_font), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.color_or_nothing!), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.convert_sci_unicode), String}) + precompile(Tuple{typeof(Plots.like_surface), Symbol}) + precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout, Array{Measures.Length{:mm, Float64}, 1}}) + precompile(Tuple{typeof(Plots.gr_set_markercolor), ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.tickfont), Plots.Axis}) + precompile(Tuple{typeof(Plots.backend)}) + precompile(Tuple{typeof(Plots._prepare_annotations), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Int64, Int64, Bool}) + precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64}) + precompile(Tuple{typeof(Plots.backend), Symbol}) + precompile(Tuple{typeof(Plots.wand_edges), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.calc_num_subplots), Plots.GridLayout}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Bool, Int64, Bool}) + precompile(Tuple{typeof(Plots.iter_segments), Base.UnitRange{Int64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.isijulia)}) + precompile(Tuple{typeof(Plots._update_axis_colors), Plots.Axis}) + precompile(Tuple{typeof(Plots.create_grid), Symbol}) + precompile(Tuple{typeof(Plots.get_linewidth), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.series_annotations), Array{Any, 1}}) + precompile(Tuple{typeof(Plots.has_attribute_segments), Plots.Series}) + precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{String, 1}}, Int64}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots.straightline_data), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.arrow), Int64}) + precompile(Tuple{typeof(Plots._cycle), Base.StepRange{Int64, Int64}, Int64}) + precompile(Tuple{typeof(Plots.link_axes!), Plots.Axis, Plots.Axis}) + precompile(Tuple{typeof(Plots.ignorenan_extrema), Base.StepRange{Int64, Int64}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.get_xy), Array{Plots.OHLC{T} where T<:Real, 1}, Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots.gr_set_yticks_font), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.gr_text_size), String}) + precompile(Tuple{typeof(Plots.update_inset_bboxes!), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Nothing}) + isdefined(Plots, Symbol("#kw##gr_polyline")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_polyline")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.compute_xyz), Nothing, Nothing, Nothing}) + precompile(Tuple{typeof(Plots._update_clims), Float64, Float64, Float64, Float64}) + precompile(Tuple{typeof(Plots.frame), Plots.Animation, Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._subplot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) + precompile(Tuple{typeof(Plots._cycle), Array{String, 1}, Int64}) + precompile(Tuple{typeof(Plots._subplot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) + precompile(Tuple{typeof(Plots._update_clims), Float64, Float64, Int64, Int64}) + precompile(Tuple{typeof(Plots._update_subplot_args), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Int64, Bool}) + precompile(Tuple{typeof(Plots.ignorenan_maximum), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.command_idx), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Float64, Symbol}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Float64}) + precompile(Tuple{typeof(Plots.annotate!), Array{Tuple{Int64, Float64, Plots.PlotText}, 1}}) + precompile(Tuple{typeof(Plots.autopick), Array{ColorTypes.RGBA{Float64}, 1}, Int64}) + precompile(Tuple{typeof(Plots.iter_segments), Plots.Series}) + precompile(Tuple{typeof(Plots.ensure_gradient!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots.link_axes!), Plots.GridLayout, Symbol}) + precompile(Tuple{typeof(Plots._override_seriestype_check), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.UnitRange{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.convertLegendValue), Bool}) + precompile(Tuple{typeof(Plots.ensure_gradient!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots._preprocess_userrecipe), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Array{Symbol, 2}, Int64}) + precompile(Tuple{typeof(Plots.layout_args), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots.iter_segments), Array{Float64, 1}, Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._update_axis_links), Plots.Plot{Plots.GRBackend}, Plots.Axis, Symbol}) + precompile(Tuple{typeof(Plots._cycle), Array{Plots.Subplot{T} where T<:RecipesBase.AbstractBackend, 1}, Int64}) + precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{String, 1}}, Int64}) + precompile(Tuple{typeof(Plots._update_axis_links), Plots.Plot{Plots.GRBackend}, Plots.Axis, Symbol}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Int64, 1}, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}, Float64}) + precompile(Tuple{typeof(Plots.iter_segments), Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Float64, 1}, Array{String, 1}}}) + isdefined(Plots, Symbol("#kw##gr_set_font")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_set_font")), NamedTuple{(:halign, :valign, :rotation), Tuple{Symbol, Symbol, Int64}}, typeof(Plots.gr_set_font), Plots.Font}) + precompile(Tuple{typeof(Plots._binbarlike_baseline), Float64, Symbol}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.prepare_output), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Int64}) + precompile(Tuple{typeof(Plots.get_series_color), ColorTypes.RGBA{Float64}, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Array{Int64, 1}, Int64}) + precompile(Tuple{typeof(Plots.get_series_color), Int64, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.filter_data!), Base.Dict{Symbol, Any}, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}}) + precompile(Tuple{typeof(Plots.iter_segments), Plots.Series}) + precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Function, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._cycle), Array{Any, 1}, Int64}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.addExtension), String, String}) + precompile(Tuple{typeof(Plots.series_annotations_shapes!), Plots.Series, Symbol}) + precompile(Tuple{typeof(Plots.wrap_surfaces), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._update_subplot_args), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Int64, Bool}) + precompile(Tuple{typeof(Plots.legendfont), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}}) + precompile(Tuple{typeof(Plots._update_subplot_args), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Int64, Bool}) + precompile(Tuple{typeof(Plots.gr_set_xticks_font), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._hist_edges), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Int64}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.rowsize), Expr}) + precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}, Plots.Series}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}}) + precompile(Tuple{typeof(Plots.gr_update_colorbar!), Plots.GRColorbar, Plots.Series}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Float64}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Float64, Plots.Stroke}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}}) + precompile(Tuple{typeof(Plots.default), Symbol, Array{ColorTypes.RGBA{Float64}, 1}}) + precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Bool}) + precompile(Tuple{typeof(Plots._add_the_series), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots._display), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._update_plot_args), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._prepare_subplot), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.get_series_color), ColorTypes.RGBA{Float64}, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.compute_xyz), Nothing, Array{Union{Base.Missing, Float64}, 1}, Nothing}) + precompile(Tuple{typeof(Plots.layout_args), Tuple{Int64, Int64}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) + precompile(Tuple{typeof(Plots.get_linestyle), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.UnitRange{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.ylims), Int64}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.UnitRange{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Array{Float64, 1}, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.get_series_color), ColorTypes.RGBA{Float64}, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.get_series_color), PlotUtils.ColorGradient, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots._add_smooth_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._update_axis_colors), Plots.Axis}) + precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._update_plot_args), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.transpose_z), Plots.Series, Array{Float64, 2}, Bool}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.get_series_color), PlotUtils.ColorGradient, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.get_series_color), Symbol, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) + isdefined(Plots, Symbol("#kw##scatter!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter!")), NamedTuple{(:zcolor, :m, :ms, :lab), Tuple{Array{Float64, 1}, Tuple{Symbol, Float64, Plots.Stroke}, Array{Float64, 1}, String}}, typeof(Plots.scatter!), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.slice_arg), Tuple{Int64, Int64}, Int64}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots.guidefont), Plots.Axis}) + precompile(Tuple{typeof(Plots.allStyles), Symbol}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}}) + precompile(Tuple{typeof(Plots.gr_set_xticks_font), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.ignorenan_minimum), Base.UnitRange{Int64}}) + isdefined(Plots, Symbol("#kw##gr_set_font")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_set_font")), NamedTuple{(:halign, :valign, :rotation), Tuple{Symbol, Symbol, Int64}}, typeof(Plots.gr_set_font), Plots.Font}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.iter_segments), Array{Int64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._add_the_series), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.plotarea!), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots.get_markeralpha), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.slice_arg), Base.ReshapedArray{Int64, 2, Base.UnitRange{Int64}, Tuple{}}, Int64}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{String, 1}, Array{String, 1}, Plots.Surface{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.get_series_color), Symbol, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.legendfont), Plots.Subplot{Plots.GRBackend}}) + isdefined(Plots, Symbol("#kw##scatter")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter")), NamedTuple{(:m, :lab, :bg, :xlim, :ylim), Tuple{Tuple{Int64, Symbol}, Array{String, 2}, Symbol, Tuple{Int64, Int64}, Tuple{Int64, Int64}}}, typeof(Plots.scatter), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.process_ribbon), Int64, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.slice_arg), Base.StepRange{Int64, Int64}, Int64}) + precompile(Tuple{typeof(Plots._hist_edge), Tuple{Array{Float64, 1}}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.process_fillrange), Int64, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, Array{Float64, 1}, Plots.Surface{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.gr_colorbar_colors), Plots.Series, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Bool, Symbol}) + precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.Subplot{Plots.GRBackend}, Array{Measures.Length{:mm, Float64}, 1}}) + precompile(Tuple{typeof(Plots.is_marker_supported), Plots.Shape}) + precompile(Tuple{typeof(Plots.compute_xyz), Nothing, Array{Float64, 1}, Nothing}) + precompile(Tuple{typeof(Plots.attr), Plots.EmptyLayout, Symbol}) + isdefined(Plots, Symbol("#kw##hline!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##hline!")), NamedTuple{(:line,), Tuple{Tuple{Int64, Symbol, Float64, Array{Symbol, 2}}}}, typeof(Plots.hline!), Array{Float64, 2}}) + precompile(Tuple{typeof(Plots.gr_text_size), String, Int64}) + precompile(Tuple{typeof(Plots._prepare_subplot), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._cycle), ColorTypes.RGBA{Float64}, Int64}) + precompile(Tuple{typeof(Plots.ignorenan_maximum), Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Bool}) + precompile(Tuple{typeof(Plots.process_ribbon), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, typeof(identity), Nothing}) + isdefined(Plots, Symbol("#kw##scatter!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter!")), NamedTuple{(:markersize, :c), Tuple{Int64, Symbol}}, typeof(Plots.scatter!), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.process_ribbon), Nothing, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.ispolar), Plots.Subplot{Plots.GRBackend}}) precompile(Tuple{typeof(Plots.build_layout), Base.Dict{Symbol, Any}}) - isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:grid, :lims), Tuple{Bool, Tuple{Int64, Int64}}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.get_axis), Plots.Subplot{Plots.GRBackend}, Symbol}) - isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:foreground_color_grid, :grid, :gridalpha, :gridstyle, :gridlinewidth), Tuple{ColorTypes.RGBA{Float64}, Bool, Float64, Symbol, Int64}}, typeof(Plots.attr!), Plots.Axis}) - isdefined(Plots, Symbol("#histogram##kw")) && precompile(Tuple{getfield(Plots, Symbol("#histogram##kw")), NamedTuple{(:bins, :weights), Tuple{Symbol, Array{Int64, 1}}}, typeof(Plots.histogram), Array{Float64, 1}}) - isdefined(Plots, Symbol("#histogram2d##kw")) && precompile(Tuple{getfield(Plots, Symbol("#histogram2d##kw")), NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio), Tuple{Tuple{Int64, Int64}, Bool, Bool, Int64}}, typeof(Plots.histogram2d), Array{Base.Complex{Float64}, 1}}) - precompile(Tuple{typeof(Plots.series_annotations), Nothing}) - isdefined(Plots, Symbol("#gr_polyline##kw")) && precompile(Tuple{getfield(Plots, Symbol("#gr_polyline##kw")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Array{Int64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.ohlc), Array{Plots.OHLC{T} where T<:Real, 1}}) - isdefined(Plots, Symbol("#gr_polyline##kw")) && precompile(Tuple{getfield(Plots, Symbol("#gr_polyline##kw")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Base.UnitRange{Int64}, Array{Float64, 1}}) - isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:grid, :lims, :flip), Tuple{Bool, Tuple{Int64, Int64}, Bool}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout}) - isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:ticks,), Tuple{Base.UnitRange{Int64}}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout}) - isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:lims,), Tuple{Tuple{Int64, Float64}}}, typeof(Plots.attr!), Plots.Axis}) - isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:lims, :flip, :ticks, :guide), Tuple{Tuple{Int64, Int64}, Bool, Base.StepRange{Int64, Int64}, String}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Array{Symbol, 2}, Symbol}) - precompile(Tuple{typeof(Plots._process_userrecipe), Plots.Plot{Plots.GRBackend}, Array{Base.Dict{Symbol, Any}, 1}, RecipesBase.RecipeData}) - isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:rotation,), Tuple{Int64}}, typeof(Plots.attr!), Plots.Axis}) - isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:lims,), Tuple{Tuple{Int64, Int64}}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Array{Symbol, 2}, Symbol}) - isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:lims,), Tuple{Tuple{Int64, Int64}}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##portfoliocomposition")) && precompile(Tuple{getfield(Plots, Symbol("#kw##portfoliocomposition")), NamedTuple{(:labels,), Tuple{Array{String, 2}}}, typeof(Plots.portfoliocomposition), Array{Float64, 2}, Int}) + precompile(Tuple{typeof(Plots._cycle), Int64, Int64}) + precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}, Nothing}) + precompile(Tuple{typeof(Plots._update_subplot_colors), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.plotarea!), Plots.GridLayout, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Bool}) + isdefined(Plots, Symbol("#kw##histogram2d")) && precompile(Tuple{getfield(Plots, Symbol("#kw##histogram2d")), NamedTuple{(:nbins,), Tuple{Int64}}, typeof(Plots.histogram2d), Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.titlefont), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.yaxis!), String, Symbol}) + precompile(Tuple{typeof(Plots.aliasesAndAutopick), Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Symbol}, Array{Symbol, 1}, Int64}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, typeof(identity)}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, Array{Float64, 1}, Array{Float64, 1}}) + isdefined(Plots, Symbol("#kw##scatter!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter!")), NamedTuple{(:marker, :series_annotations), Tuple{Tuple{Int64, Float64, Symbol}, Array{Any, 1}}}, typeof(Plots.scatter!), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) + precompile(Tuple{typeof(Plots.bbox!), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + precompile(Tuple{typeof(Plots.gr_lims), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Bool, Nothing}) + precompile(Tuple{typeof(Plots.guidefont), Plots.Axis}) + precompile(Tuple{typeof(Plots._preprocess_barlike), Base.Dict{Symbol, Any}, Base.UnitRange{Int64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.get_markerstrokealpha), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots._transform_ticks), Base.StepRange{Int64, Int64}}) + precompile(Tuple{typeof(Plots.gr_set_gradient), Plots.Series}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Float64}) + isdefined(Plots, Symbol("#kw##heatmap")) && precompile(Tuple{getfield(Plots, Symbol("#kw##heatmap")), NamedTuple{(:aspect_ratio,), Tuple{Int64}}, typeof(Plots.heatmap), Array{String, 1}, Int}) + precompile(Tuple{typeof(Plots.process_fillrange), Nothing, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.gr_contour_levels), Plots.Series, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots._display), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.is_2tuple), Tuple{Int64, Int64}}) + precompile(Tuple{typeof(Plots._prepare_annotations), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.bottom), Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.trueOrAllTrue), typeof(identity), Array{Symbol, 2}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.labelfunc), Symbol, Plots.GRBackend}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.right), Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, ColorTypes.RGBA{Float64}, Symbol}) + precompile(Tuple{typeof(Plots._cycle), Int64, Base.StepRange{Int64, Int64}}) + precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Plots.Shape, Symbol}) + precompile(Tuple{typeof(Plots.bbox!), Plots.GridLayout, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + isdefined(Plots, Symbol("#kw##scatter")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter")), NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks), Tuple{Array{Symbol, 2}, Array{String, 2}, Base.ReshapedArray{Int64, 2, Base.UnitRange{Int64}, Tuple{}}, Int64, String, Int64, Base.UnitRange{Int64}}}, typeof(Plots.scatter), Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}) + precompile(Tuple{typeof(Plots._transform_ticks), Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots.process_ribbon), typeof(identity), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + isdefined(Plots, Symbol("#kw##contour")) && precompile(Tuple{getfield(Plots, Symbol("#kw##contour")), NamedTuple{(:fill,), Tuple{Bool}}, typeof(Plots.contour), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, Array{Float64, 1}, Nothing}) + precompile(Tuple{typeof(Plots.vline!), Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.attr), Plots.EmptyLayout, Symbol, Symbol}) + precompile(Tuple{typeof(Plots.link_axes!), Plots.GridLayout, Symbol}) + isdefined(Plots, Symbol("#kw##pie")) && precompile(Tuple{getfield(Plots, Symbol("#kw##pie")), NamedTuple{(:title, :l), Tuple{String, Float64}}, typeof(Plots.pie), Array{String, 1}, Int}) + precompile(Tuple{typeof(Plots._expand_subplot_extrema), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{String, 1}}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{String, 1}, Array{Float64, 1}, Nothing}) + precompile(Tuple{typeof(Plots.is_marker_supported), Plots.Stroke}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Array{T, 1} where T, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.tovec), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.slice_arg), Base.UnitRange{Int64}, Int64}) + precompile(Tuple{typeof(Plots._hist_edges), Tuple{Array{Float64, 1}}, Symbol}) + precompile(Tuple{typeof(Plots.slice_arg), ColorTypes.RGBA{Float64}, Int64}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.gr_text_size), String, Int64}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._show), Base.IOStream, Base.Multimedia.MIME{Symbol("image/png")}, Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.allAlphas), Int64}) + precompile(Tuple{typeof(Plots.text), String, Symbol}) + precompile(Tuple{typeof(Plots.filter_data), Nothing, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.title!), String}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:lims, :flip, :ticks, :guide), Tuple{Tuple{Int64, Int64}, Bool, Base.StepRange{Int64, Int64}, String}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.is_attr_supported), Plots.GRBackend, Symbol}) + precompile(Tuple{typeof(Plots.bar), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.nobigs), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Float64, Float64, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.text), String, Int64, Symbol, Symbol}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.allStyles), Int64}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Int64, 1}, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}, Array{RecipesBase.RecipeData, 1}}) precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Union{Base.Missing, Number}, 1}}) - isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:grid, :ticks), Tuple{Bool, Nothing}}, typeof(Plots.attr!), Plots.Axis}) - isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:grid,), Tuple{Bool}}, typeof(Plots.attr!), Plots.Axis}) - isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:guide,), Tuple{String}}, typeof(Plots.attr!), Plots.Axis}) - isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:grid,), Tuple{Bool}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.is_seriestype_supported), Symbol}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) + precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Nothing}) + precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}, Plots.Series}) + precompile(Tuple{typeof(Plots.is_2tuple), Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._create_backend_figure), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.is_seriestype_supported), Symbol}) + precompile(Tuple{typeof(Plots.text), String, Symbol, Int64, Int}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.extractGroupArgs), Array{String, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.slice_arg), Tuple{Int64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.ylims), Int64}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.xgrid!), Plots.Plot{Plots.GRBackend}, Symbol, Int}) + precompile(Tuple{typeof(Plots.widen), Float64, Float64, Symbol}) + precompile(Tuple{typeof(Plots.slice_arg), Float64, Int64}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Union{Base.Missing, Number}, 1}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Symbol, Symbol, Int64, Float64}}) + precompile(Tuple{typeof(Plots.locate_annotation), Plots.Subplot{Plots.GRBackend}, Int64, Float64, Plots.PlotText}) + precompile(Tuple{typeof(Plots.layout_args), Int64}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._update_subplot_colors), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.autopick_ignore_none_auto), Array{Symbol, 1}, Int64}) + precompile(Tuple{typeof(Plots.gr_update_colorbar!), Plots.GRColorbar, Plots.Series}) + precompile(Tuple{typeof(Plots._scale_adjusted_values), Type{Float64}, Array{Float64, 1}, Symbol}) + precompile(Tuple{typeof(Plots.toppad), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots._cycle), Nothing, Int64}) + precompile(Tuple{typeof(Plots.is_2tuple), Int64}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:foreground_color_grid, :grid, :gridalpha, :gridstyle, :gridlinewidth), Tuple{ColorTypes.RGBA{Float64}, Bool, Float64, Symbol, Int64}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.contour), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:ticks,), Tuple{Nothing}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.create_grid_vcat), Expr}) + precompile(Tuple{typeof(Plots.wraptuple), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.leftpad), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.make_fillrange_from_ribbon), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.wraptuple), Nothing}) + precompile(Tuple{typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}, typeof(identity)}) + precompile(Tuple{typeof(Plots._cycle), Symbol, Int64}) + precompile(Tuple{typeof(Plots.wraptuple), Float64}) + precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots.slice_arg), Array{ColorTypes.RGBA{Float64}, 2}, Int64}) + precompile(Tuple{typeof(Plots.font), String, Int}) + precompile(Tuple{typeof(Plots.create_grid_vcat), Expr}) + precompile(Tuple{typeof(Plots.fakedata), Int64, Int64}) + precompile(Tuple{typeof(Plots.font), String, Int}) + precompile(Tuple{typeof(Plots.stroke), Int64, Int}) + precompile(Tuple{typeof(Plots.supported_styles), Plots.GRBackend}) + precompile(Tuple{typeof(Plots.xlims), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.gr_set_gradient), Plots.Series}) + precompile(Tuple{typeof(Plots.bottompad), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.slice_arg), Symbol, Int64}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Plots.GridLayout, Int64}) + precompile(Tuple{typeof(Plots.rightpad), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._transform_ticks), Nothing}) + precompile(Tuple{typeof(Plots.slice_arg), String, Int64}) + precompile(Tuple{typeof(Plots.supported_markers), Plots.GRBackend}) + precompile(Tuple{typeof(Plots._expand_subplot_extrema), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.calc_num_subplots), Plots.EmptyLayout}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:grid, :lims, :flip), Tuple{Bool, Tuple{Int64, Int64}, Bool}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.slice_arg), Nothing, Int64}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{String, Tuple{Int64, Int64}, Base.StepRange{Int64, Int64}, Symbol}}) + precompile(Tuple{typeof(Plots.ylims), Plots.Subplot{Plots.GRBackend}}) + isdefined(Plots, Symbol("#@layout")) && precompile(Tuple{getfield(Plots, Symbol("#@layout")), LineNumberNode, Module, Expr}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, ColorTypes.RGB{Float64}, Int64}) + precompile(Tuple{typeof(Plots.rowsize), Symbol}) + precompile(Tuple{typeof(Plots.wraptuple), Array{Any, 1}}) + precompile(Tuple{typeof(Plots.create_grid), Expr}) + precompile(Tuple{typeof(Plots.slice_arg), Int64, Int64}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, String, Int64}) + precompile(Tuple{typeof(Plots.slice_arg), Bool, Int64}) + isdefined(Plots, Symbol("#kw##gr_polyline")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_polyline")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Base.UnitRange{Int64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Array{String, 1}}) + precompile(Tuple{typeof(Plots.unzip), Array{Tuple{Float64, Float64, Float64}, 1}}) + precompile(Tuple{typeof(Plots.gui), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Bool}) + precompile(Tuple{typeof(Plots.font), Symbol, Int}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Float64, Symbol}}) + precompile(Tuple{typeof(Plots._cycle), Float64, Int64}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Base.LinRange{Float64}}) + precompile(Tuple{typeof(Plots.is_2tuple), Tuple{Int64, Float64}}) + precompile(Tuple{typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.get_linewidth), Plots.Series}) + precompile(Tuple{typeof(Plots.gr_display), Plots.Plot{Plots.GRBackend}, String}) + precompile(Tuple{typeof(Plots.wraptuple), Plots.SeriesAnnotations}) + precompile(Tuple{typeof(Plots.slice_arg), Array{Measures.Length{:mm, Float64}, 2}, Int64}) + precompile(Tuple{typeof(Plots._update_axis), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol, Int64}) + precompile(Tuple{typeof(Plots.gr_set_font), Plots.Font}) + precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Bool}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Symbol, Symbol}}) + precompile(Tuple{typeof(Plots.gr_set_font), Plots.Font}) + precompile(Tuple{typeof(Plots._cycle), Plots.Shape, Int64}) + precompile(Tuple{typeof(Plots.font), Int64, Int}) + precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Array{Union{Base.Missing, Float64}, 1}}) + precompile(Tuple{typeof(Plots.slice_arg), Array{Symbol, 2}, Int64}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Array{Symbol, 2}, Int64, Float64, Plots.Stroke}}) + precompile(Tuple{typeof(Plots.get_fillalpha), Plots.Series}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Float64}) + precompile(Tuple{typeof(Plots.replaceAliases!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Symbol}}) + precompile(Tuple{typeof(Plots.get_linealpha), Plots.Series}) + precompile(Tuple{typeof(Plots.is_2tuple), Symbol}) + precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol, Bool}) + precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Tuple{Int64, Int64}}) + precompile(Tuple{typeof(Plots.create_grid), Expr}) + precompile(Tuple{typeof(Plots.get_linestyle), Plots.Series}) + precompile(Tuple{typeof(Plots.get_subplot), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Symbol, Int64, Symbol, Float64}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{}}) + precompile(Tuple{typeof(Plots.make_steps), Nothing, Symbol}) + precompile(Tuple{typeof(Plots._replace_markershape), Array{Symbol, 2}}) + precompile(Tuple{typeof(Plots.prepare_output), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Float64, Symbol, Plots.Stroke}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Symbol}}) + precompile(Tuple{typeof(Plots.prepare_output), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Array{Symbol, 2}}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Float64, Symbol}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Int64}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Symbol, Float64, Array{Symbol, 2}}}) + precompile(Tuple{typeof(Plots.annotations), Array{Any, 1}}) + precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol, Bool}) + precompile(Tuple{typeof(Plots._replace_markershape), Plots.Shape}) + precompile(Tuple{typeof(Plots._show), Base.IOStream, Base.Multimedia.MIME{Symbol("image/png")}, Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Plots.Shape, Int64, ColorTypes.RGBA{Float64}}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.link_axes!), Plots.Subplot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots.get_series_color), Symbol, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{String, Symbol}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Float64, Array{Symbol, 2}, Int64}}) + precompile(Tuple{typeof(Plots._transform_ticks), Symbol}) + precompile(Tuple{typeof(Plots.link_axes!), Array{RecipesBase.AbstractLayout, 1}, Symbol}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Array{Symbol, 2}, Int64}}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:lims,), Tuple{Tuple{Int64, Float64}}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##histogram2d")) && precompile(Tuple{getfield(Plots, Symbol("#kw##histogram2d")), NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio), Tuple{Tuple{Int64, Int64}, Bool, Bool, Int64}}, typeof(Plots.histogram2d), Array{Base.Complex{Float64}, 1}}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Union{Base.Missing, Int64}, 1}}) + precompile(Tuple{typeof(Plots.series_annotations), Plots.SeriesAnnotations}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:lims,), Tuple{Tuple{Int64, Int64}}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.ohlc), Array{Plots.OHLC{T} where T<:Real, 1}}) + isdefined(Plots, Symbol("#kw##histogram")) && precompile(Tuple{getfield(Plots, Symbol("#kw##histogram")), NamedTuple{(:bins, :weights), Tuple{Symbol, Array{Int64, 1}}}, typeof(Plots.histogram), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._update_axis), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol, Int64}) + precompile(Tuple{typeof(Plots.get_axis), Plots.Subplot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol, Array{Float64, 1}, Symbol, Tuple{Int64, Int64}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.UnitRange{Int64}}) precompile(Tuple{typeof(Plots._process_userrecipe), Plots.Plot{Plots.GRBackend}, Array{Base.Dict{Symbol, Any}, 1}, RecipesBase.RecipeData}) - isdefined(Plots, Symbol("#_make_hist##kw")) && precompile(Tuple{getfield(Plots, Symbol("#_make_hist##kw")), NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Tuple{Int64, Int64}}) + precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.link_axes!), Array{RecipesBase.AbstractLayout, 1}, Symbol}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:scale, :guide), Tuple{Symbol, String}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:grid, :lims), Tuple{Bool, Tuple{Int64, Int64}}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:ticks,), Tuple{Base.UnitRange{Int64}}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:grid,), Tuple{Bool}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Float64, 2}, Base.Dict{Symbol, Any}}) + isdefined(Plots, Symbol("#kw##test_examples")) && precompile(Tuple{getfield(Plots, Symbol("#kw##test_examples")), NamedTuple{(:disp,), Tuple{Bool}}, typeof(Plots.test_examples), Symbol}) + isdefined(Plots, Symbol("#kw##default")) && precompile(Tuple{getfield(Plots, Symbol("#kw##default")), NamedTuple{(:palette,), Tuple{Array{ColorTypes.RGBA{Float64}, 1}}}, typeof(Plots.default)}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Int64, 1}}) + isdefined(Plots, Symbol("#kw##_make_hist")) && precompile(Tuple{getfield(Plots, Symbol("#kw##_make_hist")), NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Tuple{Int64, Int64}}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:guide,), Tuple{String}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Plots.Plot{Plots.GRBackend}, Int64}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:flip,), Tuple{Bool}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Base.StepRange{Int64, Int64}}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:rotation,), Tuple{Int64}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.ignorenan_minimum), Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Float64, Symbol}) + isdefined(Plots, Symbol("#kw##_make_hist")) && precompile(Tuple{getfield(Plots, Symbol("#kw##_make_hist")), NamedTuple{(:normed, :weights), Tuple{Bool, Array{Int64, 1}}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}}, Symbol}) + precompile(Tuple{typeof(Plots.series_annotations), Nothing}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:grid, :ticks), Tuple{Bool, Nothing}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.process_ribbon), Tuple{Base.LinRange{Float64}, Base.LinRange{Float64}}, Base.Dict{Symbol, Any}}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:lims,), Tuple{Tuple{Int64, Int64}}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##gr_polyline")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_polyline")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Array{Int64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Int64, Int64, Symbol}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Int32, 1}}) + isdefined(Plots, Symbol("#kw##_make_hist")) && precompile(Tuple{getfield(Plots, Symbol("#kw##_make_hist")), NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Int64}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:grid,), Tuple{Bool}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Int64, Int64}) + precompile(Tuple{typeof(Plots.ignorenan_extrema), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:formatter,), Tuple{Symbol}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Float64, 2}}) + isdefined(Plots, Symbol("#kw##_make_hist")) && precompile(Tuple{getfield(Plots, Symbol("#kw##_make_hist")), NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}}, Symbol}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Array{Symbol, 2}, Symbol}) + precompile(Tuple{typeof(Plots.process_annotation), Plots.Subplot{Plots.GRBackend}, Int64, Float64, Plots.PlotText}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Symbol, Int64}) + precompile(Tuple{typeof(Plots._cycle), Base.UnitRange{Int64}, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Float64, Int64}) + precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout}) + precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout}) + precompile(Tuple{typeof(Plots.build_layout), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.hascolorbar), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._process_userrecipe), Plots.Plot{Plots.GRBackend}, Array{Base.Dict{Symbol, Any}, 1}, RecipesBase.RecipeData}) + precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.hascolorbar), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Array{Symbol, 2}, Symbol}) precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.GRBackend}, Symbol}) - isdefined(Plots, Symbol("#_make_hist##kw")) && precompile(Tuple{getfield(Plots, Symbol("#_make_hist##kw")), NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}}, Symbol}) - isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:scale, :guide), Tuple{Symbol, String}}, typeof(Plots.attr!), Plots.Axis}) - isdefined(Plots, Symbol("#test_examples##kw")) && precompile(Tuple{getfield(Plots, Symbol("#test_examples##kw")), NamedTuple{(:disp,), Tuple{Bool}}, typeof(Plots.test_examples), Symbol}) - isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:flip,), Tuple{Bool}}, typeof(Plots.attr!), Plots.Axis}) - isdefined(Plots, Symbol("#_make_hist##kw")) && precompile(Tuple{getfield(Plots, Symbol("#_make_hist##kw")), NamedTuple{(:normed, :weights), Tuple{Bool, Array{Int64, 1}}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}}, Symbol}) + precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Tuple{Float64, Float64}, Int64}) precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Array{Symbol, 2}, Symbol}) + precompile(Tuple{typeof(Plots.get_axis), Plots.Subplot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots.ignorenan_extrema), Plots.Axis}) precompile(Tuple{typeof(Plots.ignorenan_extrema), Plots.Axis}) precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol}) - precompile(Tuple{typeof(Plots.layout_args), Plots.GridLayout}) - isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:ticks,), Tuple{Nothing}}, typeof(Plots.attr!), Plots.Axis}) - isdefined(Plots, Symbol("#_make_hist##kw")) && precompile(Tuple{getfield(Plots, Symbol("#_make_hist##kw")), NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Int64}) - isdefined(Plots, Symbol("#attr!##kw")) && precompile(Tuple{getfield(Plots, Symbol("#attr!##kw")), NamedTuple{(:formatter,), Tuple{Symbol}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Tuple{Float64, Float64}, Int64}) - precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol}) - precompile(Tuple{typeof(Plots.backend)}) - precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Tuple{Float64, Float64}, Int64}) - precompile(Tuple{typeof(Plots.hascolorbar), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.backend), Plots.GRBackend}) precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Tuple{Float64, Float64}, Int64}) precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol}) - precompile(Tuple{typeof(Plots.allStyles), Symbol}) + precompile(Tuple{typeof(Plots.backend)}) + precompile(Tuple{typeof(Plots.layout_args), Plots.GridLayout}) + precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol}) end From bf2e5d3fdc140f5734ef25a7243a6663b66f4e22 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 28 Nov 2019 12:12:32 +0100 Subject: [PATCH 210/357] fix matching background colors --- 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 5f487c8c..4dfa71ff 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -68,7 +68,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) if !pgfx_plot.is_created the_plot = PGFPlotsX.TikzPicture(PGFPlotsX.Options()) rows, cols = size(plt.layout.grid) - bgc = plt.attr[:background_color_outside] == :match ? plt.attr[:background_color] : plt.attr[:background_color] + bgc = plt.attr[:background_color_outside] == :match ? plt.attr[:background_color] : plt.attr[:background_color_outside] if bgc isa Colors.Colorant cstr = plot_color(bgc) a = alpha(cstr) From 0821ad3c0315044c495ac1cbf5d4255517a08a48 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 12 Nov 2019 16:03:54 +0100 Subject: [PATCH 211/357] create stub --- Project.toml | 1 + src/backends.jl | 55 +++++++++++++++++++++++++++++++++++++++ src/backends/pgfplotsx.jl | 13 +++++++++ 3 files changed, 69 insertions(+) create mode 100644 src/backends/pgfplotsx.jl diff --git a/Project.toml b/Project.toml index 6b6c0284..9c172eb9 100644 --- a/Project.toml +++ b/Project.toml @@ -15,6 +15,7 @@ JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Measures = "442fdcdd-2543-5da2-b0f3-8c86c306513e" NaNMath = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +PGFPlotsX = "8314cec4-20b6-5062-9cdb-752b83310925" Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" PlotThemes = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" PlotUtils = "995b91a9-d308-5afd-9ec6-746e21dbc043" diff --git a/src/backends.jl b/src/backends.jl index 26f01c91..d8074d35 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -252,6 +252,7 @@ end @init_backend PlotlyJS @init_backend GR @init_backend PGFPlots +@init_backend PGFPlotsX @init_backend InspectDR @init_backend HDF5 @@ -661,3 +662,57 @@ const _inspectdr_marker = Symbol[ ] const _inspectdr_scale = [:identity, :ln, :log2, :log10] +# ------------------------------------------------------------------------------ +# pgfplotsx + +const _pgfplotsx_attr = merge_with_base_supported([ + :annotations, + :background_color_legend, :background_color_inside, :background_color_outside, + :foreground_color_legend, :foreground_color_grid, :foreground_color_axis, + :foreground_color_text, :foreground_color_border, + :label, + :seriescolor, :seriesalpha, + :linecolor, :linestyle, :linewidth, :linealpha, + :markershape, :markercolor, :markersize, :markeralpha, + :markerstrokewidth, :markerstrokecolor, :markerstrokealpha, + :fillrange, :fillcolor, :fillalpha, + :bins, + :layout, + :title, :window_title, + :guide, :lims, :ticks, :scale, :flip, + :match_dimensions, + :titlefontfamily, :titlefontsize, :titlefonthalign, :titlefontvalign, + :titlefontrotation, :titlefontcolor, + :legendfontfamily, :legendfontsize, :legendfonthalign, :legendfontvalign, + :legendfontrotation, :legendfontcolor, + :tickfontfamily, :tickfontsize, :tickfonthalign, :tickfontvalign, + :tickfontrotation, :tickfontcolor, + :guidefontfamily, :guidefontsize, :guidefonthalign, :guidefontvalign, + :guidefontrotation, :guidefontcolor, + :grid, :gridalpha, :gridstyle, :gridlinewidth, + :legend, :legendtitle, :colorbar, :colorbar_title, :colorbar_entry, + :fill_z, :line_z, :marker_z, :levels, + :ribbon, :quiver, + :orientation, + :overwrite_figure, + :polar, + :aspect_ratio, + :normalize, :weights, + :inset_subplots, + :bar_width, + :arrow, + :framestyle, + :tick_direction, + :camera, + :contour_labels, +]) +const _pgfplotsx_seriestype = [ + :path, :scatter, :straightline, + :heatmap, :pie, :image, + :contour, :path3d, :scatter3d, :surface, :wireframe, :volume, + :shape +] +const _pgfplotsx_style = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] +const _pgfplotsx_marker = _allMarkers +const _pgfplotsx_scale = [:identity, :log10] +is_marker_supported(::PGFPlotsXBackend, shape::Shape) = false diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl new file mode 100644 index 00000000..27122d8b --- /dev/null +++ b/src/backends/pgfplotsx.jl @@ -0,0 +1,13 @@ +# -------------------------------------------------------------------------------------- +function _show(io::IO, mime::MIME"image/svg+xml", plt::Plot{PGFPlotsXBackend}) +end + +function _show(io::IO, mime::MIME"application/pdf", plt::Plot{PGFPlotsXBackend}) +end + +function _show(io::IO, mime::MIME"application/x-tex", plt::Plot{PGFPlotsXBackend}) +end + +function _display(plt::Plot{PGFPlotsXBackend}) + +end From 91d4e9dbe2ab8bab90b65b64fe736f788c778f31 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 12 Nov 2019 16:27:27 +0100 Subject: [PATCH 212/357] create display methods --- src/backends/pgfplotsx.jl | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 27122d8b..19522d8e 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,13 +1,25 @@ # -------------------------------------------------------------------------------------- +# display calls this and then _display +function _update_plot_object(plt::Plot{PGFPlotsXBackend}) + plt.o = PGFPlotsX.Axis() +end + function _show(io::IO, mime::MIME"image/svg+xml", plt::Plot{PGFPlotsXBackend}) + plt.o end function _show(io::IO, mime::MIME"application/pdf", plt::Plot{PGFPlotsXBackend}) + show(io, mime, plt.o) +end + +function _show(io::IO, mime::MIME"image/png", plt::Plot{PGFPlotsXBackend}) + display("image/png", plt.o) end function _show(io::IO, mime::MIME"application/x-tex", plt::Plot{PGFPlotsXBackend}) + PGFPlotsX.print_tex(plt.o) end function _display(plt::Plot{PGFPlotsXBackend}) - + plt.o end From 37ff1a73edc9cbbb52ce4d1d8d11cfe6773e8e30 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 12 Nov 2019 16:55:13 +0100 Subject: [PATCH 213/357] not displaying in Juno --- src/backends/pgfplotsx.jl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 19522d8e..e85e0933 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,11 +1,13 @@ +using PGFPlotsX: PGFPlotsX # -------------------------------------------------------------------------------------- # display calls this and then _display function _update_plot_object(plt::Plot{PGFPlotsXBackend}) plt.o = PGFPlotsX.Axis() + push!( plt.o, PGFPlotsX.Plot(PGFPlotsX.Coordinates(1:5,1:5)) ) end function _show(io::IO, mime::MIME"image/svg+xml", plt::Plot{PGFPlotsXBackend}) - plt.o + show(io, mime, plt.o) end function _show(io::IO, mime::MIME"application/pdf", plt::Plot{PGFPlotsXBackend}) @@ -13,7 +15,7 @@ function _show(io::IO, mime::MIME"application/pdf", plt::Plot{PGFPlotsXBackend}) end function _show(io::IO, mime::MIME"image/png", plt::Plot{PGFPlotsXBackend}) - display("image/png", plt.o) + show(io, mime, plt.o) end function _show(io::IO, mime::MIME"application/x-tex", plt::Plot{PGFPlotsXBackend}) From eddf523d084328fbebe16375bc503525f5eb1b4d Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Wed, 13 Nov 2019 12:12:31 +0100 Subject: [PATCH 214/357] fix display --- src/backends/pgfplotsx.jl | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index e85e0933..a62f2317 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,9 +1,18 @@ using PGFPlotsX: PGFPlotsX # -------------------------------------------------------------------------------------- -# display calls this and then _display +# display calls this and then _display, its called 3 times for plot(1:5) function _update_plot_object(plt::Plot{PGFPlotsXBackend}) - plt.o = PGFPlotsX.Axis() - push!( plt.o, PGFPlotsX.Plot(PGFPlotsX.Coordinates(1:5,1:5)) ) + plt.o = PGFPlotsX.GroupPlot() + + local axis + for sp in plt.subplots + axis = PGFPlotsX.Axis() + for series in series_list(sp) + series_plot = PGFPlotsX.Plot(PGFPlotsX.Coordinates(series[:x],series[:y])) + push!( axis, series_plot ) + end + end + push!( plt.o, axis ) end function _show(io::IO, mime::MIME"image/svg+xml", plt::Plot{PGFPlotsXBackend}) @@ -23,5 +32,8 @@ function _show(io::IO, mime::MIME"application/x-tex", plt::Plot{PGFPlotsXBackend end function _display(plt::Plot{PGFPlotsXBackend}) + # fn = string(tempname(),".svg") + # PGFPlotsX.pgfsave(fn, plt.o) + # open_browser_window(fn) plt.o end From 9324123b4d298dd1712f809a64d183de7265e383 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Wed, 13 Nov 2019 16:00:50 +0100 Subject: [PATCH 215/357] axes labels, legend entries, line color, marker shapes --- src/backends/pgfplotsx.jl | 60 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index a62f2317..44ac5994 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,4 +1,38 @@ using PGFPlotsX: PGFPlotsX + +const _pgfplotsx_linestyles = KW( + :solid => "solid", + :dash => "dashed", + :dot => "dotted", + :dashdot => "dashdotted", + :dashdotdot => "dashdotdotted", +) + +const _pgfplotsx_markers = KW( + :none => "none", + :cross => "+", + :xcross => "x", + :+ => "+", + :x => "x", + :utriangle => "triangle*", + :dtriangle => "triangle*", + :circle => "*", + :rect => "square*", + :star5 => "star", + :star6 => "asterisk", + :diamond => "diamond*", + :pentagon => "pentagon*", + :hline => "-", + :vline => "|" +) + +const _pgfplotsx_legend_pos = KW( + :bottomleft => "south west", + :bottomright => "south east", + :topright => "north east", + :topleft => "north west", + :outertopright => "outer north east", +) # -------------------------------------------------------------------------------------- # display calls this and then _display, its called 3 times for plot(1:5) function _update_plot_object(plt::Plot{PGFPlotsXBackend}) @@ -6,10 +40,32 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) local axis for sp in plt.subplots - axis = PGFPlotsX.Axis() + bb = bbox(sp) + axis = PGFPlotsX.@pgf PGFPlotsX.Axis( + { + xlabel = sp.attr[:xaxis][:guide], + ylabel = sp.attr[:yaxis][:guide], + height = string(height(bb)), + width = string(width(bb)), + title = sp[:title], + }, + ) for series in series_list(sp) - series_plot = PGFPlotsX.Plot(PGFPlotsX.Coordinates(series[:x],series[:y])) + opt = series.plotattributes + series_plot = PGFPlotsX.@pgf PGFPlotsX.Plot( + { + color = opt[:linecolor], + mark = _pgfplotsx_markers[opt[:markershape]], + # TODO: how to do nested options? + # "mark options" = "{color = $(opt[:markercolor])}", + }, + PGFPlotsX.Coordinates(series[:x],series[:y]) + ) push!( axis, series_plot ) + if opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) + push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) + ) + end end end push!( plt.o, axis ) From 1ef4cfb86a61b98a989650ca2e3b5e24cfb7a260 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 14 Nov 2019 07:37:21 +0100 Subject: [PATCH 216/357] markercolor --- src/backends/pgfplotsx.jl | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 44ac5994..d2fc8622 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -56,8 +56,7 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) { color = opt[:linecolor], mark = _pgfplotsx_markers[opt[:markershape]], - # TODO: how to do nested options? - # "mark options" = "{color = $(opt[:markercolor])}", + mark_options = {color = opt[:markercolor]}, }, PGFPlotsX.Coordinates(series[:x],series[:y]) ) From 046643f7437f679bdeff51ccb33f91f315fb98aa Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 14 Nov 2019 16:45:31 +0100 Subject: [PATCH 217/357] fix code loading --- Project.toml | 1 - src/backends.jl | 1 - 2 files changed, 2 deletions(-) diff --git a/Project.toml b/Project.toml index 9c172eb9..6b6c0284 100644 --- a/Project.toml +++ b/Project.toml @@ -15,7 +15,6 @@ JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Measures = "442fdcdd-2543-5da2-b0f3-8c86c306513e" NaNMath = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" -PGFPlotsX = "8314cec4-20b6-5062-9cdb-752b83310925" Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" PlotThemes = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" PlotUtils = "995b91a9-d308-5afd-9ec6-746e21dbc043" diff --git a/src/backends.jl b/src/backends.jl index d8074d35..f9b7ce12 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -37,7 +37,6 @@ macro init_backend(s) _backendType[Symbol($str)] = $T _backendSymbol[$T] = Symbol($str) _backend_packages[Symbol($str)] = Symbol($package_str) - # include("backends/" * $str * ".jl") end) end From 10868ef5651eb446a668af079e6f23b8eaecf7da Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 14 Nov 2019 22:31:22 +0100 Subject: [PATCH 218/357] options translation part 1, use Options instead of @pgf --- src/backends/pgfplotsx.jl | 420 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 400 insertions(+), 20 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index d2fc8622..455f61cc 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,5 +1,3 @@ -using PGFPlotsX: PGFPlotsX - const _pgfplotsx_linestyles = KW( :solid => "solid", :dash => "dashed", @@ -33,41 +31,423 @@ const _pgfplotsx_legend_pos = KW( :topleft => "north west", :outertopright => "outer north east", ) + +const _pgfx_framestyles = [:box, :axes, :origin, :zerolines, :grid, :none] +const _pgfx_framestyle_defaults = Dict(:semi => :box) +## -------------------------------------------------------------------------------------- +function pgfx_framestyle(style::Symbol) + if style in _pgfx_framestyles + 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.") + default_style + end +end + +pgfx_thickness_scaling(plt::Plot) = plt[:thickness_scaling] +pgfx_thickness_scaling(sp::Subplot) = pgfx_thickness_scaling(sp.plt) +pgfx_thickness_scaling(series) = pgfx_thickness_scaling(series[:subplot]) + +function pgfx_fillstyle(plotattributes, i = 1) + cstr = get_fillcolor(plotattributes, i) + a = alpha(cstr) + fa = get_fillalpha(plotattributes, i) + if fa !== nothing + a = fa + end + fill => cstr, fill_opacity => a +end + +function pgfx_linestyle(linewidth::Real, color, α = 1, linestyle = "solid") + cstr = plot_color(color, α) + a = alpha(cstr) + return PGFPlotsX.Options( + "color" => cstr, + "draw opacity" => a, + "line width" => linewidth, + get(_pgfplotsx_linestyles, linestyle, "solid") => nothing + ) +end + +function pgfx_linestyle(plotattributes, i = 1) + lw = pgfx_thickness_scaling(plotattributes) * get_linewidth(plotattributes, i) + lc = get_linecolor(plotattributes, i) + la = get_linealpha(plotattributes, i) + ls = get_linestyle(plotattributes, i) + return pgfx_linestyle(lw, lc, la, ls) +end + +function pgfx_font(fontsize, thickness_scaling = 1, font = "\\selectfont") + fs = fontsize * thickness_scaling + return string("{\\fontsize{", fs, " pt}{", 1.3fs, " pt}", font, "}") +end + +function pgfx_marker(plotattributes, i = 1) + shape = _cycle(plotattributes[:markershape], i) + cstr = plot_color(get_markercolor(plotattributes, i), get_markeralpha(plotattributes, i)) + a = alpha(cstr) + cstr_stroke = plot_color(get_markerstrokecolor(plotattributes, i), get_markerstrokealpha(plotattributes, i)) + a_stroke = alpha(cstr_stroke) + return PGFPlotsX.Options( + "mark" => get(_pgfplotsx_markers, shape, "*"), + "mark size" => pgfx_thickness_scaling(plotattributes) * 0.5 * _cycle(plotattributes[:markersize], i), + "mark options" => PGFPlotsX.Options( + "color" => cstr_stroke, + "draw opacity" => a_stroke, + "fill" => cstr, + "fill opacity" => a, + "line width" => pgfx_thickness_scaling(plotattributes) * _cycle(plotattributes[:markerstrokewidth], i), + "rotate" => (shape == :dtriangle ? 180 : 0), + get(_pgfplotsx_linestyles, _cycle(plotattributes[:markerstrokestyle], i), "solid") => nothing + ) + ) +end + +function pgfx_add_annotation!(o, x, y, val, thickness_scaling = 1) + # Construct the style string. + # Currently supports color and orientation + cstr = val.font.color + a = alpha(cstr) + #TODO: translate this + push!(o, PGFPlots.Plots.Node(val.str, # Annotation Text + x, y, + style=""" + $(get(_pgfx_annotation_halign,val.font.halign,"")), + color=$cstr, draw opacity=$(convert(Float16,a)), + rotate=$(val.font.rotation), + font=$(pgfx_font(val.font.pointsize, thickness_scaling)) + """)) +end +## -------------------------------------------------------------------------------------- +# TODO: translate these if needed +function pgf_series(sp::Subplot, series::Series) + plotattributes = series.plotattributes + st = plotattributes[:seriestype] + series_collection = PGFPlots.Plot[] + + # function args + args = if st == :contour + plotattributes[:z].surf, plotattributes[:x], plotattributes[:y] + elseif is3d(st) + plotattributes[:x], plotattributes[:y], plotattributes[:z] + elseif st == :straightline + straightline_data(series) + elseif st == :shape + shape_data(series) + elseif ispolar(sp) + theta, r = plotattributes[:x], plotattributes[:y] + rad2deg.(theta), r + else + plotattributes[:x], plotattributes[:y] + end + + # PGFPlots can't handle non-Vector? + args = map(a -> if typeof(a) <: AbstractVector && typeof(a) != Vector + collect(a) + else + a + end, args) + + if st in (:contour, :histogram2d) + style = [] + kw = KW() + push!(style, pgf_linestyle(plotattributes)) + push!(style, pgf_marker(plotattributes)) + push!(style, "forget plot") + + kw[:style] = join(style, ',') + func = if st == :histogram2d + PGFPlots.Histogram2 + else + kw[:labels] = series[:contour_labels] + kw[:levels] = series[:levels] + PGFPlots.Contour + end + push!(series_collection, func(args...; kw...)) + + else + # series segments + segments = iter_segments(series) + for (i, rng) in enumerate(segments) + style = [] + kw = KW() + push!(style, pgf_linestyle(plotattributes, i)) + push!(style, pgf_marker(plotattributes, i)) + + if st == :shape + push!(style, pgf_fillstyle(plotattributes, i)) + end + + # add to legend? + if i == 1 && sp[:legend] != :none && should_add_to_legend(series) + if plotattributes[:fillrange] !== nothing + push!(style, "forget plot") + push!(series_collection, pgf_fill_legend_hack(plotattributes, args)) + else + kw[:legendentry] = plotattributes[:label] + if st == :shape # || plotattributes[:fillrange] !== nothing + push!(style, "area legend") + end + end + else + push!(style, "forget plot") + end + + seg_args = (arg[rng] for arg in args) + + # include additional style, then add to the kw + if haskey(_pgf_series_extrastyle, st) + push!(style, _pgf_series_extrastyle[st]) + end + kw[:style] = join(style, ',') + + # add fillrange + if series[:fillrange] !== nothing && st != :shape + push!(series_collection, pgf_fillrange_series(series, i, _cycle(series[:fillrange], rng), seg_args...)) + end + + # build/return the series object + func = if st == :path3d + PGFPlots.Linear3 + elseif st == :scatter + PGFPlots.Scatter + else + PGFPlots.Linear + end + push!(series_collection, func(seg_args...; kw...)) + end + end + series_collection +end + +function pgf_fillrange_series(series, i, fillrange, args...) + st = series[:seriestype] + style = [] + kw = KW() + push!(style, "line width = 0") + push!(style, "draw opacity = 0") + push!(style, pgf_fillstyle(series, i)) + push!(style, pgf_marker(series, i)) + push!(style, "forget plot") + if haskey(_pgf_series_extrastyle, st) + push!(style, _pgf_series_extrastyle[st]) + end + kw[:style] = join(style, ',') + func = is3d(series) ? PGFPlots.Linear3 : PGFPlots.Linear + return func(pgf_fillrange_args(fillrange, args...)...; kw...) +end + +function pgf_fillrange_args(fillrange, x, y) + n = length(x) + x_fill = [x; x[n:-1:1]; x[1]] + y_fill = [y; _cycle(fillrange, n:-1:1); y[1]] + return x_fill, y_fill +end + +function pgf_fillrange_args(fillrange, x, y, z) + n = length(x) + x_fill = [x; x[n:-1:1]; x[1]] + y_fill = [y; y[n:-1:1]; x[1]] + z_fill = [z; _cycle(fillrange, n:-1:1); z[1]] + return x_fill, y_fill, z_fill +end + +function pgf_fill_legend_hack(plotattributes, args) + style = [] + kw = KW() + push!(style, pgf_linestyle(plotattributes, 1)) + push!(style, pgf_marker(plotattributes, 1)) + push!(style, pgf_fillstyle(plotattributes, 1)) + push!(style, "area legend") + kw[:legendentry] = plotattributes[:label] + kw[:style] = join(style, ',') + st = plotattributes[:seriestype] + func = if st == :path3d + PGFPlots.Linear3 + elseif st == :scatter + PGFPlots.Scatter + else + PGFPlots.Linear + end + return func(([arg[1]] for arg in args)...; kw...) +end + +# -------------------------------------------------------------------------------------- +function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) + axis = sp[Symbol(letter,:axis)] + + # turn off scaled ticks + push!(opt, "scaled $(letter) ticks" => "false", + string(letter,:label) => axis[:guide], + ) + + # set to supported framestyle + framestyle = pgfx_framestyle(sp[:framestyle]) + + # axis label position + labelpos = "" + if letter == :x && axis[:guide_position] == :top + labelpos = "at={(0.5,1)},above," + elseif letter == :y && axis[:guide_position] == :right + labelpos = "at={(1,0.5)},below," + end + + # Add label font + cstr = plot_color(axis[:guidefontcolor]) + α = alpha(cstr) + push!(opt, string(letter, "label style") => PGFPlotsX.Options( + labelpos => nothing, + "font" => pgfx_font(axis[:guidefontsize], pgfx_thickness_scaling(sp)), + "color" => cstr, + "draw opacity" => α, + "rotate" => axis[:guidefontrotation], + ) + ) + + # flip/reverse? + axis[:flip] && push!(opt, "$letter dir" => "reverse") + + # scale + scale = axis[:scale] + if scale in (:log2, :ln, :log10) + push!(opt, string(letter,:mode) => "log") + scale == :ln || push!(opt, "log basis $letter" => "$(scale == :log2 ? 2 : 10)") + end + + # ticks on or off + if axis[:ticks] in (nothing, false, :none) || framestyle == :none + push!(opt, "$(letter)majorticks" => "false") + end + + # grid on or off + if axis[:grid] && framestyle != :none + push!(opt, "$(letter)majorgrids" => "true") + else + push!(opt, "$(letter)majorgrids" => "false") + end + + # limits + # TODO: support zlims + if letter != :z + lims = ispolar(sp) && letter == :x ? rad2deg.(axis_limits(sp, :x)) : axis_limits(sp, letter) + push!( opt, + string(letter,:min) => lims[1], + string(letter,:max) => lims[2] + ) + end + + if !(axis[:ticks] in (nothing, false, :none, :native)) && framestyle != :none + ticks = get_ticks(sp, axis) + #pgf plot ignores ticks with angle below 90 when xmin = 90 so shift values + tick_values = ispolar(sp) && letter == :x ? [rad2deg.(ticks[1])[3:end]..., 360, 405] : ticks[1] + push!(opt, string(letter, "tick") => string("{", join(tick_values,","), "}")) + if axis[:showaxis] && axis[:scale] in (:ln, :log2, :log10) && axis[:ticks] == :auto + # wrap the power part of label with } + tick_labels = Vector{String}(undef, length(ticks[2])) + for (i, label) in enumerate(ticks[2]) + base, power = split(label, "^") + power = string("{", power, "}") + tick_labels[i] = string(base, "^", power) + end + push!(opt, string(letter, "ticklabels") => string("{\$", join(tick_labels,"\$,\$"), "\$}")) + elseif axis[:showaxis] + tick_labels = ispolar(sp) && letter == :x ? [ticks[2][3:end]..., "0", "45"] : ticks[2] + if axis[:formatter] in (:scientific, :auto) + tick_labels = string.("\$", convert_sci_unicode.(tick_labels), "\$") + tick_labels = replace.(tick_labels, Ref("×" => "\\times")) + end + push!(opt, string(letter, "ticklabels") => string("{", join(tick_labels,","), "}")) + else + push!(opt, string(letter, "ticklabels") => "{}") + end + push!(opt, string(letter, "tick align") => (axis[:tick_direction] == :out ? "outside" : "inside")) + cstr = plot_color(axis[:tickfontcolor]) + α = alpha(cstr) + push!(opt, string(letter, "ticklabel style") => PGFPlotsX.Options( + "font" => pgfx_font(axis[:tickfontsize], pgfx_thickness_scaling(sp)), + "color" => cstr, + "draw opacity" => α, + "rotate" => axis[:tickfontrotation] + ) + ) + push!(opt, string(letter, " grid style") => pgfx_linestyle(pgfx_thickness_scaling(sp) * axis[:gridlinewidth], axis[:foreground_color_grid], axis[:gridalpha], axis[:gridstyle]) + ) + end + + # framestyle + if framestyle in (:axes, :origin) + axispos = framestyle == :axes ? "left" : "middle" + if axis[:draw_arrow] + push!(opt, string("axis ", letter, " line") => axispos) + else + # the * after line disables the arrow at the axis + push!(opt, string("axis ", letter, " line*") => axispos) + end + end + + if framestyle == :zerolines + push!(opt, string("extra ", letter, " ticks") => "0") + push!(opt, string("extra ", letter, " tick labels") => "") + push!(opt, string("extra ", letter, " tick style") => PGFPlotsX.Options( + "grid" => "major", + "major grid style" => pgfx_linestyle(pgfx_thickness_scaling(sp), axis[:foreground_color_border], 1.0) + ) + ) + end + + if !axis[:showaxis] + push!(opt, "separate axis lines") + end + if !axis[:showaxis] || framestyle in (:zerolines, :grid, :none) + push!(opt, string(letter, " axis line style") => "{draw opacity = 0}") + else + push!(opt, string(letter, " axis line style") => pgfx_linestyle(pgfx_thickness_scaling(sp), axis[:foreground_color_border], 1.0) + ) + end +end # -------------------------------------------------------------------------------------- # display calls this and then _display, its called 3 times for plot(1:5) function _update_plot_object(plt::Plot{PGFPlotsXBackend}) plt.o = PGFPlotsX.GroupPlot() - local axis for sp in plt.subplots bb = bbox(sp) - axis = PGFPlotsX.@pgf PGFPlotsX.Axis( - { - xlabel = sp.attr[:xaxis][:guide], - ylabel = sp.attr[:yaxis][:guide], - height = string(height(bb)), - width = string(width(bb)), - title = sp[:title], - }, + axis_opt = PGFPlotsX.Options( + "height" => string(height(bb)), + "width" => string(width(bb)), + "title" => sp[:title], + ) + for letter in (:x, :y, :z) + if letter != :z || is3d(sp) + pgfx_axis!(axis_opt, sp, letter) + end + end + axis = PGFPlotsX.Axis( + axis_opt ) for series in series_list(sp) opt = series.plotattributes - series_plot = PGFPlotsX.@pgf PGFPlotsX.Plot( - { - color = opt[:linecolor], - mark = _pgfplotsx_markers[opt[:markershape]], - mark_options = {color = opt[:markercolor]}, - }, - PGFPlotsX.Coordinates(series[:x],series[:y]) + segments = iter_segments(series) + for (i, rng) in enumerate(segments) + series_plot = PGFPlotsX.Plot( + merge( + PGFPlotsX.Options( + "color" => opt[:linecolor] + ), + pgfx_marker(opt, i) + ), + PGFPlotsX.Coordinates(series[:x],series[:y]) ) - push!( axis, series_plot ) + push!( axis, series_plot ) + end if opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) ) end end + push!( plt.o, axis ) end - push!( plt.o, axis ) end function _show(io::IO, mime::MIME"image/svg+xml", plt::Plot{PGFPlotsXBackend}) From 914d3cac448fc9cec3feb9feda90a292339feb5b Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 15 Nov 2019 08:52:56 +0100 Subject: [PATCH 219/357] legend styling --- src/backends/pgfplotsx.jl | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 455f61cc..0a1f58f6 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -413,10 +413,21 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) for sp in plt.subplots bb = bbox(sp) + legpos = sp[:legend] + if haskey(_pgfplotsx_legend_pos, legpos) + legpos = _pgfplotsx_legend_pos[legpos] + end + cstr = plot_color(sp[:background_color_legend]) + a = alpha(cstr) axis_opt = PGFPlotsX.Options( "height" => string(height(bb)), "width" => string(width(bb)), "title" => sp[:title], + "legend style" => PGFPlotsX.Options( + pgfx_linestyle(pgfx_thickness_scaling(sp), sp[:foreground_color_legend], 1.0, "solid") => nothing, + "fill" => cstr, + "font" => pgfx_font(sp[:legendfontsize], pgfx_thickness_scaling(sp)) + ) ) for letter in (:x, :y, :z) if letter != :z || is3d(sp) From bc42001b75b6f16db68cd22f7a4fd636fe8e9fef Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 15 Nov 2019 09:42:05 +0100 Subject: [PATCH 220/357] translate pgf_add_aanotation! --- src/backends/pgfplotsx.jl | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 0a1f58f6..fd1decac 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -34,6 +34,14 @@ const _pgfplotsx_legend_pos = KW( const _pgfx_framestyles = [:box, :axes, :origin, :zerolines, :grid, :none] const _pgfx_framestyle_defaults = Dict(:semi => :box) + +# we use the anchors to define orientations for example to align left +# one needs to use the right edge as anchor +const _pgfx_annotation_halign = KW( + :center => "", + :left => "right", + :right => "left" +) ## -------------------------------------------------------------------------------------- function pgfx_framestyle(style::Symbol) if style in _pgfx_framestyles @@ -109,15 +117,18 @@ function pgfx_add_annotation!(o, x, y, val, thickness_scaling = 1) # Currently supports color and orientation cstr = val.font.color a = alpha(cstr) - #TODO: translate this - push!(o, PGFPlots.Plots.Node(val.str, # Annotation Text - x, y, - style=""" - $(get(_pgfx_annotation_halign,val.font.halign,"")), - color=$cstr, draw opacity=$(convert(Float16,a)), - rotate=$(val.font.rotation), - font=$(pgfx_font(val.font.pointsize, thickness_scaling)) - """)) + push!(o, ["\\node", + PGFPlotsX.Options( + get(_pgfx_annotation_halign,val.font.halign,"") => nothing, + "color" => cstr, + "draw opacity" => convert(Float16, a), + "rotate" => val.font.rotation, + "font" => pgfx_font(val.font.pointsize, thickness_scaling) + ), + " at ", + PGFPlotsX.Coordinate(x, y), + "{$(val.str).};" + ]) end ## -------------------------------------------------------------------------------------- # TODO: translate these if needed From 32d712ce29500a041417e1dfb50dc2bb1f2921c7 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 15 Nov 2019 13:47:04 +0100 Subject: [PATCH 221/357] apply annotations --- src/backends/pgfplotsx.jl | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index fd1decac..becb538a 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -135,7 +135,7 @@ end function pgf_series(sp::Subplot, series::Series) plotattributes = series.plotattributes st = plotattributes[:seriestype] - series_collection = PGFPlots.Plot[] + series_collection = PGFPlotsX.Plot[] # function args args = if st == :contour @@ -154,11 +154,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 = [] @@ -452,17 +452,24 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) opt = series.plotattributes segments = iter_segments(series) for (i, rng) in enumerate(segments) - series_plot = PGFPlotsX.Plot( - merge( - PGFPlotsX.Options( - "color" => opt[:linecolor] - ), - pgfx_marker(opt, i) - ), - PGFPlotsX.Coordinates(series[:x],series[:y]) - ) - push!( axis, series_plot ) + # TODO: make segmented series end + # TODO: different seriestypes, histogramms, contours, etc. + series_plot = PGFPlotsX.Plot( + merge( + PGFPlotsX.Options( + "color" => opt[:linecolor] + ), + pgfx_marker(opt, i) + ), + PGFPlotsX.Coordinates(series[:x],series[:y]) + ) + # add series annotations + anns = series[:series_annotations] + for (xi,yi,str,fnt) in EachAnn(anns, series[:x], series[:y]) + pgfx_add_annotation!(series_plot, xi, yi, PlotText(str, fnt), pgfx_thickness_scaling(series)) + end + push!( axis, series_plot ) if opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) ) From e34570e307bf0e2c84e726b6b41286c0c246e92e Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 15 Nov 2019 15:47:36 +0100 Subject: [PATCH 222/357] basic 3D --- src/backends/pgfplotsx.jl | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index becb538a..b094a4e8 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -451,18 +451,29 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) for series in series_list(sp) opt = series.plotattributes segments = iter_segments(series) + segment_opt = PGFPlotsX.Options() for (i, rng) in enumerate(segments) - # TODO: make segmented series + segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) end # TODO: different seriestypes, histogramms, contours, etc. - series_plot = PGFPlotsX.Plot( + # TODO: colorbars + # TOOD: gradients + if is3d(series) + series_func = opt -> PGFPlotsX.Plot3(opt, + PGFPlotsX.Coordinates(series[:x],series[:y],series[:z]) + ) + else + series_func = opt -> PGFPlotsX.Plot(opt, + PGFPlotsX.Coordinates(series[:x],series[:y]) + ) + end + series_plot = series_func( merge( PGFPlotsX.Options( "color" => opt[:linecolor] ), - pgfx_marker(opt, i) + segment_opt ), - PGFPlotsX.Coordinates(series[:x],series[:y]) ) # add series annotations anns = series[:series_annotations] From 9fb6b8059fcd6e2f6081924041bf3496dba43df0 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 15 Nov 2019 16:13:54 +0100 Subject: [PATCH 223/357] translate pgf_fillrange_series --- src/backends/pgfplotsx.jl | 62 ++++++++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 21 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index b094a4e8..d7e8c3ea 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -32,6 +32,15 @@ const _pgfplotsx_legend_pos = KW( :outertopright => "outer north east", ) +const _pgfx_series_extrastyle = KW( + :steppre => "const plot mark right", + :stepmid => "const plot mark mid", + :steppost => "const plot", + :sticks => "ycomb", + :ysticks => "ycomb", + :xsticks => "xcomb", +) + const _pgfx_framestyles = [:box, :axes, :origin, :zerolines, :grid, :none] const _pgfx_framestyle_defaults = Dict(:semi => :box) @@ -64,7 +73,7 @@ function pgfx_fillstyle(plotattributes, i = 1) if fa !== nothing a = fa end - fill => cstr, fill_opacity => a + PGFPlotsX.Options("fill" => cstr, "fill opacity" => a) end function pgfx_linestyle(linewidth::Real, color, α = 1, linestyle = "solid") @@ -232,21 +241,18 @@ function pgf_series(sp::Subplot, series::Series) series_collection end -function pgf_fillrange_series(series, i, fillrange, args...) +function pgfx_fillrange_series!(opt, series, i, fillrange, args...) st = series[:seriestype] - style = [] - kw = KW() - push!(style, "line width = 0") - push!(style, "draw opacity = 0") - push!(style, pgf_fillstyle(series, i)) - push!(style, pgf_marker(series, i)) - push!(style, "forget plot") - if haskey(_pgf_series_extrastyle, st) - push!(style, _pgf_series_extrastyle[st]) + push!(opt, "line width" => 0) + push!(opt, "draw opacity" => 0) + push!(opt, pgfx_fillopt(series, i)) + push!(opt, pgfx_marker(series, i)) + push!(opt, "forget plot" => nothing) + if haskey(_pgfx_series_extraopt, st) + push!(opt, _pgfx_series_extrastyle[st] => nothing) end - kw[:style] = join(style, ',') - func = is3d(series) ? PGFPlots.Linear3 : PGFPlots.Linear - return func(pgf_fillrange_args(fillrange, args...)...; kw...) + # TODO: what are those fillrange_args about? + # return func(pgf_fillrange_args(fillrange, args...)...; kw...) end function pgf_fillrange_args(fillrange, x, y) @@ -450,14 +456,33 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) ) for series in series_list(sp) opt = series.plotattributes + st = series[:seriestype] + series_opt = PGFPlotsX.Options( + "color" => opt[:linecolor] + ) segments = iter_segments(series) segment_opt = PGFPlotsX.Options() for (i, rng) in enumerate(segments) + segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) + if st == :shape + segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) + end + # TODO: is this necessary? + # seg_args = (arg[rng] for arg in args) + # TODO: translate this + # # add fillrange + # if series[:fillrange] !== nothing && st != :shape + # push!(series_collection, pgf_fillrange_series(series, i, _cycle(series[:fillrange], rng), seg_args...)) + # end + end + #include additional style + if haskey(_pgfx_series_extrastyle, st) + push!(series_opt, _pgfx_series_extrastyle[st] => nothing) end # TODO: different seriestypes, histogramms, contours, etc. # TODO: colorbars - # TOOD: gradients + # TODO: gradients if is3d(series) series_func = opt -> PGFPlotsX.Plot3(opt, PGFPlotsX.Coordinates(series[:x],series[:y],series[:z]) @@ -468,12 +493,7 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) ) end series_plot = series_func( - merge( - PGFPlotsX.Options( - "color" => opt[:linecolor] - ), - segment_opt - ), + merge(series_opt, segment_opt), ) # add series annotations anns = series[:series_annotations] From 7f1863f3b937833cd86f2e68a47c792d54740b0b Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 15 Nov 2019 16:41:47 +0100 Subject: [PATCH 224/357] add guard against overexecution --- src/backends/pgfplotsx.jl | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index d7e8c3ea..f6c539f5 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -425,7 +425,13 @@ function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) end # -------------------------------------------------------------------------------------- # display calls this and then _display, its called 3 times for plot(1:5) +let n_calls = 0 +function _series_updated(plt::Plot{PGFPlotsXBackend}, series::Series) + n_calls = 0 +end + function _update_plot_object(plt::Plot{PGFPlotsXBackend}) +if n_calls === 0 plt.o = PGFPlotsX.GroupPlot() for sp in plt.subplots @@ -509,6 +515,8 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) push!( plt.o, axis ) end end +n_calls += 1 +end function _show(io::IO, mime::MIME"image/svg+xml", plt::Plot{PGFPlotsXBackend}) show(io, mime, plt.o) From fc6dfb8dcb725baceb216093709cabe51b7cbf17 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 18 Nov 2019 11:51:03 +0100 Subject: [PATCH 225/357] translated pgf_fillrange_series --- src/backends/pgfplotsx.jl | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index f6c539f5..9f8678c8 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -241,8 +241,9 @@ function pgf_series(sp::Subplot, series::Series) series_collection end -function pgfx_fillrange_series!(opt, series, i, fillrange, args...) +function pgfx_fillrange_series(series, i, fillrange, args...) st = series[:seriestype] + opt = PGFPlotsX.Options() push!(opt, "line width" => 0) push!(opt, "draw opacity" => 0) push!(opt, pgfx_fillopt(series, i)) @@ -251,18 +252,18 @@ function pgfx_fillrange_series!(opt, series, i, fillrange, args...) if haskey(_pgfx_series_extraopt, st) push!(opt, _pgfx_series_extrastyle[st] => nothing) end - # TODO: what are those fillrange_args about? - # return func(pgf_fillrange_args(fillrange, args...)...; kw...) + func = is3d(series) ? PGFPlotsX.Plot3 : PGFPlotsX.Plot + return func(opt, pgfx_fillrange_args(fillrange, args...)...) end -function pgf_fillrange_args(fillrange, x, y) +function pgfx_fillrange_args(fillrange, x, y) n = length(x) x_fill = [x; x[n:-1:1]; x[1]] y_fill = [y; _cycle(fillrange, n:-1:1); y[1]] return x_fill, y_fill end -function pgf_fillrange_args(fillrange, x, y, z) +function pgfx_fillrange_args(fillrange, x, y, z) n = length(x) x_fill = [x; x[n:-1:1]; x[1]] y_fill = [y; y[n:-1:1]; x[1]] From 7954adedf3e41a630ead77414ef9caacfb2ddbfa Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 18 Nov 2019 16:13:56 +0100 Subject: [PATCH 226/357] translation of pgf_colormap --- src/backends/pgfplotsx.jl | 83 ++++++++++++++++++++++++++++++--------- 1 file changed, 65 insertions(+), 18 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 9f8678c8..0093e35a 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -52,6 +52,14 @@ const _pgfx_annotation_halign = KW( :right => "left" ) ## -------------------------------------------------------------------------------------- +# Generates a colormap for pgfplots based on a ColorGradient +# TODO: maybe obsolete +function pgfx_colormap(grad::ColorGradient) + join(map(grad.colors) do c + @sprintf("rgb=(%.8f,%.8f,%.8f)", red(c), green(c),blue(c)) + end,", ") +end + function pgfx_framestyle(style::Symbol) if style in _pgfx_framestyles return style @@ -426,13 +434,11 @@ function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) end # -------------------------------------------------------------------------------------- # display calls this and then _display, its called 3 times for plot(1:5) -let n_calls = 0 function _series_updated(plt::Plot{PGFPlotsXBackend}, series::Series) - n_calls = 0 + # TODO: don't rebuild plots so often end function _update_plot_object(plt::Plot{PGFPlotsXBackend}) -if n_calls === 0 plt.o = PGFPlotsX.GroupPlot() for sp in plt.subplots @@ -458,12 +464,60 @@ if n_calls === 0 pgfx_axis!(axis_opt, sp, letter) 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 + push!(axis_opt, + "colormap" => "{plots}{$(pgfx_colormap(series.plotattributes[col]))}") + + # TODO: is this needed? + # if sp[:colorbar] == :none + # kw[:colorbar] = "false" + # else + # kw[:colorbar] = "true" + # 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] + ) + ) axis = PGFPlotsX.Axis( axis_opt ) for series in series_list(sp) opt = series.plotattributes st = series[:seriestype] + # function args + args = if st == :contour + opt[:z].surf, opt[:x], opt[:y] + elseif is3d(st) + opt[:x], opt[:y], opt[:z] + elseif st == :straightline + straightline_data(series) + elseif st == :shape + shape_data(series) + elseif ispolar(sp) + theta, r = opt[:x], opt[:y] + rad2deg.(theta), r + else + opt[:x], opt[:y] + end series_opt = PGFPlotsX.Options( "color" => opt[:linecolor] ) @@ -475,13 +529,11 @@ if n_calls === 0 if st == :shape segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) end - # TODO: is this necessary? - # seg_args = (arg[rng] for arg in args) - # TODO: translate this - # # add fillrange - # if series[:fillrange] !== nothing && st != :shape - # push!(series_collection, pgf_fillrange_series(series, i, _cycle(series[:fillrange], rng), seg_args...)) - # end + seg_args = (arg[rng] for arg in args) + # add fillrange + if series[:fillrange] !== nothing && st != :shape + push!(axis, pgfx_fillrange_series(series, i, _cycle(series[:fillrange], rng), seg_args...)) + end end #include additional style if haskey(_pgfx_series_extrastyle, st) @@ -491,16 +543,13 @@ if n_calls === 0 # TODO: colorbars # TODO: gradients if is3d(series) - series_func = opt -> PGFPlotsX.Plot3(opt, - PGFPlotsX.Coordinates(series[:x],series[:y],series[:z]) - ) + series_func = PGFPlotsX.Plot3 else - series_func = opt -> PGFPlotsX.Plot(opt, - PGFPlotsX.Coordinates(series[:x],series[:y]) - ) + series_func = PGFPlotsX.Plot end series_plot = series_func( merge(series_opt, segment_opt), + PGFPlotsX.Coordinates(args...) ) # add series annotations anns = series[:series_annotations] @@ -516,8 +565,6 @@ if n_calls === 0 push!( plt.o, axis ) end end -n_calls += 1 -end function _show(io::IO, mime::MIME"image/svg+xml", plt::Plot{PGFPlotsXBackend}) show(io, mime, plt.o) From 6d3e8fcb81f4a6360d383a0b3e9ec7fbd3824cc6 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 18 Nov 2019 17:16:27 +0100 Subject: [PATCH 227/357] add tests --- Project.toml | 3 ++- src/backends/pgfplotsx.jl | 4 ++++ test/runtests.jl | 2 ++ test/test_pgfplotsx.jl | 13 +++++++++++++ 4 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 test/test_pgfplotsx.jl diff --git a/Project.toml b/Project.toml index 6b6c0284..b87f0ffd 100644 --- a/Project.toml +++ b/Project.toml @@ -56,6 +56,7 @@ ImageMagick = "6218d12a-5da1-5696-b52f-db25d2ecc6d1" Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0" LaTeXStrings = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" LibGit2 = "76f85450-5226-5b5a-8eaa-529ad045b433" +PGFPlotsX = "8314cec4-20b6-5062-9cdb-752b83310925" RDatasets = "ce6b1742-4840-55fa-b093-852dadbb1d8b" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" StatsPlots = "f3b207a7-027a-5e70-b257-86293d7955fd" @@ -64,4 +65,4 @@ UnicodePlots = "b8865327-cd53-5732-bb35-84acbb429228" VisualRegressionTests = "34922c18-7c2a-561c-bac1-01e79b2c4c92" [targets] -test = ["FileIO", "GeometryTypes", "Gtk", "ImageMagick", "Images", "LaTeXStrings", "LibGit2", "Random", "RDatasets", "StatsPlots", "Test", "UnicodePlots", "VisualRegressionTests"] +test = ["FileIO", "GeometryTypes", "Gtk", "ImageMagick", "Images", "LaTeXStrings", "LibGit2", "PGFPlotsX", "Random", "RDatasets", "StatsPlots", "Test", "UnicodePlots", "VisualRegressionTests"] diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 0093e35a..2b7ea449 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -567,18 +567,22 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) end function _show(io::IO, mime::MIME"image/svg+xml", plt::Plot{PGFPlotsXBackend}) + _update_plot_object(plt) show(io, mime, plt.o) end function _show(io::IO, mime::MIME"application/pdf", plt::Plot{PGFPlotsXBackend}) + _update_plot_object(plt) show(io, mime, plt.o) end function _show(io::IO, mime::MIME"image/png", plt::Plot{PGFPlotsXBackend}) + _update_plot_object(plt) show(io, mime, plt.o) end function _show(io::IO, mime::MIME"application/x-tex", plt::Plot{PGFPlotsXBackend}) + _update_plot_object(plt) PGFPlotsX.print_tex(plt.o) end diff --git a/test/runtests.jl b/test/runtests.jl index 55c7e963..16ad485f 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -8,6 +8,8 @@ using Gtk using LibGit2 using GeometryTypes +include("test_pgfplotsx.jl") + reference_dir(args...) = joinpath(homedir(), ".julia", "dev", "PlotReferenceImages", args...) function reference_file(backend, i, version) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl new file mode 100644 index 00000000..a46a0a35 --- /dev/null +++ b/test/test_pgfplotsx.jl @@ -0,0 +1,13 @@ +using Plots, Test +pgfplotsx() + +function create_plot( args...; kwargs... ) + pgfx_plot = plot(args..., kwargs...) + return pgfx_plot, repr("application/x-tex", pgfx_plot) +end + +@testset "PGFPlotsX" begin + pgfx_plot, pgfx_tex = create_plot(1:5) + + @test pgfx_plot.o isa PGFPlotsX.GroupPlot +end # testset From c2c1c9d7386772d48f56d0e79aaf1abaa7e29fcb Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 18 Nov 2019 19:05:49 +0100 Subject: [PATCH 228/357] tests for 3D colorbar --- src/backends/pgfplotsx.jl | 13 +++++++++++-- test/test_pgfplotsx.jl | 23 +++++++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 2b7ea449..c38f11a3 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -57,7 +57,7 @@ const _pgfx_annotation_halign = KW( function pgfx_colormap(grad::ColorGradient) join(map(grad.colors) do c @sprintf("rgb=(%.8f,%.8f,%.8f)", red(c), green(c),blue(c)) - end,", ") + end,"\n") end function pgfx_framestyle(style::Symbol) @@ -441,6 +441,8 @@ end function _update_plot_object(plt::Plot{PGFPlotsXBackend}) plt.o = PGFPlotsX.GroupPlot() + pushed_colormap = false + empty!(PGFPlotsX.CUSTOM_PREAMBLE) for sp in plt.subplots bb = bbox(sp) legpos = sp[:legend] @@ -477,8 +479,15 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) for series in series_list(sp) for col in (:markercolor, :fillcolor, :linecolor) if typeof(series.plotattributes[col]) == ColorGradient + # TODO: fix this + # pushed_colormap || push!(PGFPlotsX.CUSTOM_PREAMBLE, """\\pgfplotsset{ + # colormap={plots}{$(pgfx_colormap(series.plotattributes[col]))}, + # }""") + pushed_colormap = true push!(axis_opt, - "colormap" => "{plots}{$(pgfx_colormap(series.plotattributes[col]))}") + # "colormap" => nothing, + # "colormap name" => "plots", + ) # TODO: is this needed? # if sp[:colorbar] == :none diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index a46a0a35..a636fd91 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -2,12 +2,31 @@ using Plots, Test pgfplotsx() function create_plot( args...; kwargs... ) - pgfx_plot = plot(args..., kwargs...) + pgfx_plot = plot(args...; kwargs...) + return pgfx_plot, repr("application/x-tex", pgfx_plot) +end + +function create_plot!( args...; kwargs... ) + pgfx_plot = plot!(args...; kwargs...) return pgfx_plot, repr("application/x-tex", pgfx_plot) end @testset "PGFPlotsX" begin pgfx_plot, pgfx_tex = create_plot(1:5) - + @test pgfx_plot.o isa PGFPlotsX.GroupPlot + @testset "3D docs example" begin + n = 100 + ts = range(0, stop=8π, length=n) + x = ts .* map(cos, ts) + y = (0.1ts) .* map(sin, ts) + z = 1:n + pl = plot(x, y, z, zcolor=reverse(z), m=(10, 0.8, :blues, Plots.stroke(0)), leg=false, cbar=true, w=5) + @show PGFPlotsX.CUSTOM_PREAMBLE + @show PGFPlotsX.CUSTOM_PREAMBLE_PATH + pgfx_plot, pgfx_tex = create_plot!(pl, zeros(n), zeros(n), 1:n, w=10) + if @test_nowarn(haskey(pgfx_plot.o.contents[1].options.dict, "colormap") == true) + @test pgfx_plot.o.contents[1]["colormap"] === nothing + end + end # testset end # testset From ce1276bcbdf2ba7fadffe391c991b4d4d8a64714 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 11:30:34 +0100 Subject: [PATCH 229/357] title styling --- src/backends/pgfplotsx.jl | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index c38f11a3..c3e13709 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -56,7 +56,7 @@ const _pgfx_annotation_halign = KW( # TODO: maybe obsolete function pgfx_colormap(grad::ColorGradient) join(map(grad.colors) do c - @sprintf("rgb=(%.8f,%.8f,%.8f)", red(c), green(c),blue(c)) + @sprintf("rgb=(%.8f,%.8f,%.8f)", red(c), green(c), blue(c)) end,"\n") end @@ -451,14 +451,26 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) end cstr = plot_color(sp[:background_color_legend]) a = alpha(cstr) + title_cstr = plot_color(sp[:titlefontcolor]) + title_a = alpha(cstr) + # TODO: aspect ratio, legend position axis_opt = PGFPlotsX.Options( "height" => string(height(bb)), "width" => string(width(bb)), "title" => sp[:title], + "title style" => PGFPlotsX.Options( + "font" => pgfx_font(sp[:titlefontsize], pgfx_thickness_scaling(sp)), + "color" => title_cstr, + "draw opacity" => title_a, + "rotate" => sp[:titlefontrotation] + ), "legend style" => PGFPlotsX.Options( - pgfx_linestyle(pgfx_thickness_scaling(sp), sp[:foreground_color_legend], 1.0, "solid") => nothing, - "fill" => cstr, - "font" => pgfx_font(sp[:legendfontsize], pgfx_thickness_scaling(sp)) + pgfx_linestyle(pgfx_thickness_scaling(sp), sp[:foreground_color_legend], 1.0, "solid") => nothing, + "fill" => cstr, + "font" => pgfx_font(sp[:legendfontsize], pgfx_thickness_scaling(sp)) + ), + "axis background/.style" => PGFPlotsX.Options( + "fill" => sp[:background_color_inside] ) ) for letter in (:x, :y, :z) From 0dd970fc6bae2e771735c1b2efe68bd06a633017 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 11:34:21 +0100 Subject: [PATCH 230/357] claim everything --- src/backends.jl | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/backends.jl b/src/backends.jl index f9b7ce12..dddeea47 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -711,7 +711,9 @@ const _pgfplotsx_seriestype = [ :contour, :path3d, :scatter3d, :surface, :wireframe, :volume, :shape ] +const _pgfplotsx_seriestype = [:path, :path3d, :scatter, :steppre, :stepmid, :steppost, :histogram2d, :ysticks, :xsticks, :contour, :shape, :straightline,] const _pgfplotsx_style = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] -const _pgfplotsx_marker = _allMarkers -const _pgfplotsx_scale = [:identity, :log10] -is_marker_supported(::PGFPlotsXBackend, shape::Shape) = false +const _pgfplotsx_marker = vcat(_allMarkers, Shape) + # [:none, :auto, :circle, :rect, :diamond, :utriangle, :dtriangle, :cross, :xcross, :star5, :pentagon, :hline, :vline] # +const _pgfplotsx_scale = [:identity, :ln, :log2, :log10] +is_marker_supported(::PGFPlotsXBackend, shape::Shape) = true From cb1d32422a3b2957e76fb757a3e69431ce8ec223 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 11:35:35 +0100 Subject: [PATCH 231/357] adjust --- src/backends.jl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/backends.jl b/src/backends.jl index dddeea47..89fa83eb 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -705,12 +705,12 @@ const _pgfplotsx_attr = merge_with_base_supported([ :camera, :contour_labels, ]) -const _pgfplotsx_seriestype = [ - :path, :scatter, :straightline, - :heatmap, :pie, :image, - :contour, :path3d, :scatter3d, :surface, :wireframe, :volume, - :shape -] +# const _pgfplotsx_seriestype = [ +# :path, :scatter, :straightline, +# :heatmap, :pie, :image, +# :contour, :path3d, :scatter3d, :surface, :wireframe, :volume, +# :shape +# ] const _pgfplotsx_seriestype = [:path, :path3d, :scatter, :steppre, :stepmid, :steppost, :histogram2d, :ysticks, :xsticks, :contour, :shape, :straightline,] const _pgfplotsx_style = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] const _pgfplotsx_marker = vcat(_allMarkers, Shape) From abc212b0391d8f5eef0864d3304af0d877334392 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 11:58:57 +0100 Subject: [PATCH 232/357] fix colorbar --- src/backends/pgfplotsx.jl | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index c3e13709..82a0bded 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -492,14 +492,16 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) for col in (:markercolor, :fillcolor, :linecolor) if typeof(series.plotattributes[col]) == ColorGradient # TODO: fix this - # pushed_colormap || push!(PGFPlotsX.CUSTOM_PREAMBLE, """\\pgfplotsset{ - # colormap={plots}{$(pgfx_colormap(series.plotattributes[col]))}, - # }""") - pushed_colormap = true - push!(axis_opt, - # "colormap" => nothing, - # "colormap name" => "plots", - ) + if !pushed_colormap + push!(PGFPlotsX.CUSTOM_PREAMBLE, """\\pgfplotsset{ + colormap={plots}{$(pgfx_colormap(series.plotattributes[col]))}, + }""") + pushed_colormap = true + push!(axis_opt, + "colorbar" => nothing, + "colormap name" => "plots", + ) + end # TODO: is this needed? # if sp[:colorbar] == :none From a117bbc04bf6734951b1e6ae12aa44b07890ebc0 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 12:05:43 +0100 Subject: [PATCH 233/357] correct test --- test/test_pgfplotsx.jl | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index a636fd91..4ee29dbd 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -22,11 +22,9 @@ end y = (0.1ts) .* map(sin, ts) z = 1:n pl = plot(x, y, z, zcolor=reverse(z), m=(10, 0.8, :blues, Plots.stroke(0)), leg=false, cbar=true, w=5) - @show PGFPlotsX.CUSTOM_PREAMBLE - @show PGFPlotsX.CUSTOM_PREAMBLE_PATH pgfx_plot, pgfx_tex = create_plot!(pl, zeros(n), zeros(n), 1:n, w=10) if @test_nowarn(haskey(pgfx_plot.o.contents[1].options.dict, "colormap") == true) - @test pgfx_plot.o.contents[1]["colormap"] === nothing + @test pgfx_plot.o.contents[1]["colorbar"] === nothing end end # testset end # testset From f2f647c6428f471c9ea82c053cf5f6f67ef2cdf7 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 12:08:30 +0100 Subject: [PATCH 234/357] legend position --- src/backends/pgfplotsx.jl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 82a0bded..8fd07e4f 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -453,7 +453,7 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) a = alpha(cstr) title_cstr = plot_color(sp[:titlefontcolor]) title_a = alpha(cstr) - # TODO: aspect ratio, legend position + # TODO: aspect ratio axis_opt = PGFPlotsX.Options( "height" => string(height(bb)), "width" => string(width(bb)), @@ -464,6 +464,7 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) "draw opacity" => title_a, "rotate" => sp[:titlefontrotation] ), + "legend pos" => _pgfplotsx_legend_pos[sp[:legend]], "legend style" => PGFPlotsX.Options( pgfx_linestyle(pgfx_thickness_scaling(sp), sp[:foreground_color_legend], 1.0, "solid") => nothing, "fill" => cstr, From c0e68af63ff58146de15beeb1996451326ee0c69 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 14:47:54 +0100 Subject: [PATCH 235/357] reproduce 3D docs plot --- src/backends/pgfplotsx.jl | 23 +++++++++-------------- test/test_pgfplotsx.jl | 2 +- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 8fd07e4f..422e1c27 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,3 +1,5 @@ +PGFPlotsX.print_tex(io::IO, data::Symbol) = PGFPlotsX.print_tex(io, string(data)) + const _pgfplotsx_linestyles = KW( :solid => "solid", :dash => "dashed", @@ -445,10 +447,6 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) empty!(PGFPlotsX.CUSTOM_PREAMBLE) for sp in plt.subplots bb = bbox(sp) - legpos = sp[:legend] - if haskey(_pgfplotsx_legend_pos, legpos) - legpos = _pgfplotsx_legend_pos[legpos] - end cstr = plot_color(sp[:background_color_legend]) a = alpha(cstr) title_cstr = plot_color(sp[:titlefontcolor]) @@ -464,7 +462,7 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) "draw opacity" => title_a, "rotate" => sp[:titlefontrotation] ), - "legend pos" => _pgfplotsx_legend_pos[sp[:legend]], + "legend pos" => get(_pgfplotsx_legend_pos, sp[:legend], "outer north east"), "legend style" => PGFPlotsX.Options( pgfx_linestyle(pgfx_thickness_scaling(sp), sp[:foreground_color_legend], 1.0, "solid") => nothing, "fill" => cstr, @@ -492,7 +490,6 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) for series in series_list(sp) for col in (:markercolor, :fillcolor, :linecolor) if typeof(series.plotattributes[col]) == ColorGradient - # TODO: fix this if !pushed_colormap push!(PGFPlotsX.CUSTOM_PREAMBLE, """\\pgfplotsset{ colormap={plots}{$(pgfx_colormap(series.plotattributes[col]))}, @@ -504,12 +501,6 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) ) end - # TODO: is this needed? - # if sp[:colorbar] == :none - # kw[:colorbar] = "false" - # else - # kw[:colorbar] = "true" - # end # goto is needed to break out of col and series for @goto colorbar_end end @@ -543,8 +534,12 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) opt[:x], opt[:y] end series_opt = PGFPlotsX.Options( - "color" => opt[:linecolor] + "color" => opt[:linecolor], + "scatter" => nothing, ) + if opt[:marker_z] !== nothing + push!(series_opt, "point meta" => "explicit") + end segments = iter_segments(series) segment_opt = PGFPlotsX.Options() for (i, rng) in enumerate(segments) @@ -573,7 +568,7 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) end series_plot = series_func( merge(series_opt, segment_opt), - PGFPlotsX.Coordinates(args...) + PGFPlotsX.Coordinates(args..., meta = opt[:marker_z]) ) # add series annotations anns = series[:series_annotations] diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 4ee29dbd..12e3ae0e 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -23,7 +23,7 @@ end z = 1:n pl = plot(x, y, z, zcolor=reverse(z), m=(10, 0.8, :blues, Plots.stroke(0)), leg=false, cbar=true, w=5) pgfx_plot, pgfx_tex = create_plot!(pl, zeros(n), zeros(n), 1:n, w=10) - if @test_nowarn(haskey(pgfx_plot.o.contents[1].options.dict, "colormap") == true) + if @test_nowarn(haskey(pgfx_plot.o.contents[1].options.dict, "colorbar") == true) @test pgfx_plot.o.contents[1]["colorbar"] === nothing end end # testset From 57db8095c404ef503de1bab2d5a987a84276967a Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 14:58:03 +0100 Subject: [PATCH 236/357] add area legend for shapes --- src/backends/pgfplotsx.jl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 422e1c27..9b6dbbd5 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -537,6 +537,9 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) "color" => opt[:linecolor], "scatter" => nothing, ) + if st == :shape + push!(series_opt, "area legend" => nothing) + end if opt[:marker_z] !== nothing push!(series_opt, "point meta" => "explicit") end From 424b98e1a1fdf0a5a6ec9d5d54523c339c9c9ae4 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 15:06:34 +0100 Subject: [PATCH 237/357] fix pgfx_fillrange_series --- src/backends/pgfplotsx.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 9b6dbbd5..46e38136 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -256,14 +256,14 @@ function pgfx_fillrange_series(series, i, fillrange, args...) opt = PGFPlotsX.Options() push!(opt, "line width" => 0) push!(opt, "draw opacity" => 0) - push!(opt, pgfx_fillopt(series, i)) - push!(opt, pgfx_marker(series, i)) + opt = merge(opt, pgfx_fillstyle(series, i)) + opt = merge(opt, pgfx_marker(series, i)) push!(opt, "forget plot" => nothing) - if haskey(_pgfx_series_extraopt, st) + if haskey(_pgfx_series_extrastyle, st) push!(opt, _pgfx_series_extrastyle[st] => nothing) end func = is3d(series) ? PGFPlotsX.Plot3 : PGFPlotsX.Plot - return func(opt, pgfx_fillrange_args(fillrange, args...)...) + return func(opt, PGFPlotsX.Coordinates(pgfx_fillrange_args(fillrange, args...)...)) end function pgfx_fillrange_args(fillrange, x, y) From 3c9a7193fd78f7dd9be39f4626752cf3710be059 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 15:31:36 +0100 Subject: [PATCH 238/357] status quo --- src/backends/pgfplotsx.jl | 5 ++++- test/test_pgfplotsx.jl | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 46e38136..1308d243 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -535,13 +535,13 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) end series_opt = PGFPlotsX.Options( "color" => opt[:linecolor], - "scatter" => nothing, ) if st == :shape push!(series_opt, "area legend" => nothing) end if opt[:marker_z] !== nothing push!(series_opt, "point meta" => "explicit") + push!(series_opt, "scatter" => nothing) end segments = iter_segments(series) segment_opt = PGFPlotsX.Options() @@ -569,6 +569,9 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) else series_func = PGFPlotsX.Plot end + if st == :scatter + push!(series_opt, "only marks" => nothing) + end series_plot = series_func( merge(series_opt, segment_opt), PGFPlotsX.Coordinates(args..., meta = opt[:marker_z]) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 12e3ae0e..47f76ccf 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -27,4 +27,39 @@ end @test pgfx_plot.o.contents[1]["colorbar"] === nothing end end # testset + @testset "Color docs example" begin + y = rand(100) + plot(0:10:100, rand(11, 4), lab="lines", w=3, palette=:grays, fill=0, α=0.6) + scatter!(y, zcolor=abs.(y .- 0.5), m=(:heat, 0.8, Plots.stroke(1, :green)), ms=10 * abs.(y .- 0.5) .+ 4, lab="grad") + # TODO: marker size does not adjust + # TODO: marker stroke is incorrect + # TODO: fill legends + # TODO: adjust colorbar limits to data + end # testset + @testset "Plot in pieces" begin + plot(rand(100) / 3, reg=true, fill=(0, :green)) + scatter!(rand(100), markersize=6, c=:orange) + # TODO: legends should be different + end # testset + @testset "Marker types" begin + markers = filter((m->begin + m in Plots.supported_markers() + end), Plots._shape_keys) + markers = reshape(markers, 1, length(markers)) + n = length(markers) + x = (range(0, stop=10, length=n + 2))[2:end - 1] + y = repeat(reshape(reverse(x), 1, :), n, 1) + scatter(x, y, m=(8, :auto), lab=map(string, markers), bg=:linen, xlim=(0, 10), ylim=(0, 10)) + #TODO: fix markers that show up as circles + end # testset + @testset "Layout" begin + plot(Plots.fakedata(100, 10), layout=4, palette=[:grays :blues :heat :lightrainbow], bg_inside=[:orange :pink :darkblue :black]) + # TODO: add layouting + end # testset + @testset "Polar plots" begin + Θ = range(0, stop=1.5π, length=100) + r = abs.(0.1 * randn(100) + sin.(3Θ)) + plot(Θ, r, proj=:polar, m=2) + # TODO: handle polar plots + end # testset end # testset From 10e7cb8ebab4bb3c1c60de8043486a4231a1cbcf Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 16:30:53 +0100 Subject: [PATCH 239/357] use TikzDocument and its preamble --- src/backends/pgfplotsx.jl | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 1308d243..77d75e92 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -436,15 +436,20 @@ function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) end # -------------------------------------------------------------------------------------- # display calls this and then _display, its called 3 times for plot(1:5) -function _series_updated(plt::Plot{PGFPlotsXBackend}, series::Series) - # TODO: don't rebuild plots so often +function _create_backend_figure(plt::Plot{PGFPlotsXBackend}) + end +function _series_updated(plt::Plot{PGFPlotsXBackend}, series::Series) +end + +# TODO: don't rebuild plots so often +# IDEA: use functor to only build plot once function _update_plot_object(plt::Plot{PGFPlotsXBackend}) - plt.o = PGFPlotsX.GroupPlot() + plt.o = PGFPlotsX.TikzDocument() + push!(plt.o, PGFPlotsX.TikzPicture(PGFPlotsX.GroupPlot())) pushed_colormap = false - empty!(PGFPlotsX.CUSTOM_PREAMBLE) for sp in plt.subplots bb = bbox(sp) cstr = plot_color(sp[:background_color_legend]) @@ -491,7 +496,7 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) for col in (:markercolor, :fillcolor, :linecolor) if typeof(series.plotattributes[col]) == ColorGradient if !pushed_colormap - push!(PGFPlotsX.CUSTOM_PREAMBLE, """\\pgfplotsset{ + PGFPlotsX.push_preamble!(plt.o, """\\pgfplotsset{ colormap={plots}{$(pgfx_colormap(series.plotattributes[col]))}, }""") pushed_colormap = true @@ -587,7 +592,7 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) ) end end - push!( plt.o, axis ) + push!( plt.o.elements[1].elements[1], axis ) end end From 66e8f6615e49daccea059b606268d11391d1872e Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 17:30:26 +0100 Subject: [PATCH 240/357] respect layout --- src/backends/pgfplotsx.jl | 9 ++++++++- test/test_pgfplotsx.jl | 20 +++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 77d75e92..933afbfa 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -447,7 +447,14 @@ end # IDEA: use functor to only build plot once function _update_plot_object(plt::Plot{PGFPlotsXBackend}) plt.o = PGFPlotsX.TikzDocument() - push!(plt.o, PGFPlotsX.TikzPicture(PGFPlotsX.GroupPlot())) + cols, rows = size(plt.layout.grid) + push!(plt.o, PGFPlotsX.TikzPicture(PGFPlotsX.GroupPlot( + PGFPlotsX.Options( + "group style" => PGFPlotsX.Options( + "group size" => string(cols)*" by "*string(rows) + ) + ) + ))) pushed_colormap = false for sp in plt.subplots diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 47f76ccf..748d1739 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -54,7 +54,7 @@ end end # testset @testset "Layout" begin plot(Plots.fakedata(100, 10), layout=4, palette=[:grays :blues :heat :lightrainbow], bg_inside=[:orange :pink :darkblue :black]) - # TODO: add layouting + # TODO: no extra space for outer legends end # testset @testset "Polar plots" begin Θ = range(0, stop=1.5π, length=100) @@ -62,4 +62,22 @@ end plot(Θ, r, proj=:polar, m=2) # TODO: handle polar plots end # testset + @testset "Histogram 2D" begin + histogram2d(randn(10000), randn(10000), nbins=20) + # TODO: totally broken, errors also for pgfplots + end # testset + @testset "Contours" begin + x = 1:0.5:20 + y = 1:0.5:10 + f(x, y) = begin + (3x + y ^ 2) * abs(sin(x) + cos(y)) + end + X = repeat(reshape(x, 1, :), length(y), 1) + Y = repeat(y, 1, length(x)) + Z = map(f, X, Y) + p1 = contour(x, y, f, fill=true) + p2 = contour(x, y, Z) + plot(p1, p2) + # TODO: totally broken, also errors for pgfplots + end # testset end # testset From 1fcd06f903bb96ba06229d4cfb2d39a5f0e15f34 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 17:46:05 +0100 Subject: [PATCH 241/357] broken polar --- src/backends/pgfplotsx.jl | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 933afbfa..46c90cbc 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -524,7 +524,15 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) "title" => sp[:colorbar_title] ) ) - axis = PGFPlotsX.Axis( + axisf = if sp[:projection] == :polar + # TODO: this errors for some reason + # push!(axis_opt, "xmin" => 90) + # push!(axis_opt, "xmax" => 450) + PGFPlotsX.PolarAxis + else + PGFPlotsX.Axis + end + axis = axisf( axis_opt ) for series in series_list(sp) From 59ad0d830b702b61f197795da6c6a5b87a2cc509 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 19 Nov 2019 18:18:08 +0100 Subject: [PATCH 242/357] ltriangle, rtriangle --- src/backends.jl | 3 +-- src/backends/pgfplotsx.jl | 12 +++++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/backends.jl b/src/backends.jl index 89fa83eb..d2ae4894 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -713,7 +713,6 @@ const _pgfplotsx_attr = merge_with_base_supported([ # ] const _pgfplotsx_seriestype = [:path, :path3d, :scatter, :steppre, :stepmid, :steppost, :histogram2d, :ysticks, :xsticks, :contour, :shape, :straightline,] const _pgfplotsx_style = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] -const _pgfplotsx_marker = vcat(_allMarkers, Shape) - # [:none, :auto, :circle, :rect, :diamond, :utriangle, :dtriangle, :cross, :xcross, :star5, :pentagon, :hline, :vline] # +const _pgfplotsx_marker = [:none, :auto, :circle, :rect, :diamond, :utriangle, :dtriangle, :ltriangle, :rtriangle, :cross, :xcross, :star5, :pentagon, :hline, :vline, Shape] const _pgfplotsx_scale = [:identity, :ln, :log2, :log10] is_marker_supported(::PGFPlotsXBackend, shape::Shape) = true diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 46c90cbc..1d2c3587 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -16,6 +16,8 @@ const _pgfplotsx_markers = KW( :x => "x", :utriangle => "triangle*", :dtriangle => "triangle*", + :rtriangle => "triangle*", + :ltriangle => "triangle*", :circle => "*", :rect => "square*", :star5 => "star", @@ -125,7 +127,15 @@ function pgfx_marker(plotattributes, i = 1) "fill" => cstr, "fill opacity" => a, "line width" => pgfx_thickness_scaling(plotattributes) * _cycle(plotattributes[:markerstrokewidth], i), - "rotate" => (shape == :dtriangle ? 180 : 0), + "rotate" => if shape == :dtriangle + 180 + elseif shape == :rtriangle + 270 + elseif shape == :ltriangle + 90 + else + 0 + end, get(_pgfplotsx_linestyles, _cycle(plotattributes[:markerstrokestyle], i), "solid") => nothing ) ) From 1ba5ad0e909378a42be8a287d0e72bfc9c5ad345 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Wed, 20 Nov 2019 10:35:48 +0100 Subject: [PATCH 243/357] translate pgf_fill_legend_hack --- src/backends/pgfplotsx.jl | 140 +++++++------------------------------- 1 file changed, 26 insertions(+), 114 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 1d2c3587..7bc0aef1 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -161,106 +161,6 @@ function pgfx_add_annotation!(o, x, y, val, thickness_scaling = 1) end ## -------------------------------------------------------------------------------------- # TODO: translate these if needed -function pgf_series(sp::Subplot, series::Series) - plotattributes = series.plotattributes - st = plotattributes[:seriestype] - series_collection = PGFPlotsX.Plot[] - - # function args - args = if st == :contour - plotattributes[:z].surf, plotattributes[:x], plotattributes[:y] - elseif is3d(st) - plotattributes[:x], plotattributes[:y], plotattributes[:z] - elseif st == :straightline - straightline_data(series) - elseif st == :shape - shape_data(series) - elseif ispolar(sp) - theta, r = plotattributes[:x], plotattributes[:y] - rad2deg.(theta), r - else - plotattributes[:x], plotattributes[:y] - end - - # PGFPlots can't handle non-Vector? - # args = map(a -> if typeof(a) <: AbstractVector && typeof(a) != Vector - # collect(a) - # else - # a - # end, args) - - if st in (:contour, :histogram2d) - style = [] - kw = KW() - push!(style, pgf_linestyle(plotattributes)) - push!(style, pgf_marker(plotattributes)) - push!(style, "forget plot") - - kw[:style] = join(style, ',') - func = if st == :histogram2d - PGFPlots.Histogram2 - else - kw[:labels] = series[:contour_labels] - kw[:levels] = series[:levels] - PGFPlots.Contour - end - push!(series_collection, func(args...; kw...)) - - else - # series segments - segments = iter_segments(series) - for (i, rng) in enumerate(segments) - style = [] - kw = KW() - push!(style, pgf_linestyle(plotattributes, i)) - push!(style, pgf_marker(plotattributes, i)) - - if st == :shape - push!(style, pgf_fillstyle(plotattributes, i)) - end - - # add to legend? - if i == 1 && sp[:legend] != :none && should_add_to_legend(series) - if plotattributes[:fillrange] !== nothing - push!(style, "forget plot") - push!(series_collection, pgf_fill_legend_hack(plotattributes, args)) - else - kw[:legendentry] = plotattributes[:label] - if st == :shape # || plotattributes[:fillrange] !== nothing - push!(style, "area legend") - end - end - else - push!(style, "forget plot") - end - - seg_args = (arg[rng] for arg in args) - - # include additional style, then add to the kw - if haskey(_pgf_series_extrastyle, st) - push!(style, _pgf_series_extrastyle[st]) - end - kw[:style] = join(style, ',') - - # add fillrange - if series[:fillrange] !== nothing && st != :shape - push!(series_collection, pgf_fillrange_series(series, i, _cycle(series[:fillrange], rng), seg_args...)) - end - - # build/return the series object - func = if st == :path3d - PGFPlots.Linear3 - elseif st == :scatter - PGFPlots.Scatter - else - PGFPlots.Linear - end - push!(series_collection, func(seg_args...; kw...)) - end - end - series_collection -end - function pgfx_fillrange_series(series, i, fillrange, args...) st = series[:seriestype] opt = PGFPlotsX.Options() @@ -291,24 +191,21 @@ function pgfx_fillrange_args(fillrange, x, y, z) return x_fill, y_fill, z_fill end -function pgf_fill_legend_hack(plotattributes, args) - style = [] - kw = KW() - push!(style, pgf_linestyle(plotattributes, 1)) - push!(style, pgf_marker(plotattributes, 1)) - push!(style, pgf_fillstyle(plotattributes, 1)) - push!(style, "area legend") - kw[:legendentry] = plotattributes[:label] - kw[:style] = join(style, ',') +function pgfx_fill_legend_hack(plotattributes, args) + opt = PGFPlotsX.Options("area legend" => nothing) + opt = merge(opt, pgfx_linestyle(plotattributes, 1)) + opt = merge(opt, pgfx_marker(plotattributes, 1)) + opt = merge(opt, pgfx_fillstyle(plotattributes, 1)) st = plotattributes[:seriestype] func = if st == :path3d - PGFPlots.Linear3 - elseif st == :scatter - PGFPlots.Scatter + PGFPlotsX.Plot3 else - PGFPlots.Linear + PGFPlotsX.Plot end - return func(([arg[1]] for arg in args)...; kw...) + if st == :scatter + push!(opt, "only marks" => nothing) + end + return func(opt, PGFPlotsX.Coordinates(([arg[1]] for arg in args)...)) end # -------------------------------------------------------------------------------------- @@ -586,6 +483,21 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) if series[:fillrange] !== nothing && st != :shape push!(axis, pgfx_fillrange_series(series, i, _cycle(series[:fillrange], rng), seg_args...)) end + + # add to legend? + if i == 1 && sp[:legend] != :none && should_add_to_legend(series) + if opt[:fillrange] !== nothing + push!(segment_opt, "forget plot" => nothing) + push!(axis, pgfx_fill_legend_hack(opt, args)) + else + if st == :shape + push!(segment_opt, "area legend" => nothing) + end + end + push!( axis, PGFPlotsX.LegendEntry( opt[:label] )) + else + push!(segment_opt, "forget plot" => nothing) + end end #include additional style if haskey(_pgfx_series_extrastyle, st) From faf905a9328251e32ff55be43558914e870edbda Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Wed, 20 Nov 2019 14:16:43 +0100 Subject: [PATCH 244/357] create plot only once --- src/backends/pgfplotsx.jl | 391 ++++++++++++++++++++------------------ 1 file changed, 208 insertions(+), 183 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 7bc0aef1..e9e49e73 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,4 +1,207 @@ -PGFPlotsX.print_tex(io::IO, data::Symbol) = PGFPlotsX.print_tex(io, string(data)) +# PGFPlotsX.print_tex(io::IO, data::Symbol) = PGFPlotsX.print_tex(io, string(data)) +Base.@kwdef mutable struct PGFPlotsXPlot + is_created::Bool = false + was_shown::Bool = false + the_plot::PGFPlotsX.TikzDocument = PGFPlotsX.TikzDocument() +end + +function Base.show(io::IO, mime::MIME, pgfx_plot::PGFPlotsXPlot) + show(io::IO, mime, pgfx_plot.the_plot) +end + +function Base.push!(pgfx_plot::PGFPlotsXPlot, item) + push!(pgfx_plot.the_plot, item) +end + +function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) + if !pgfx_plot.is_created + cols, rows = size(plt.layout.grid) + the_plot = PGFPlotsX.TikzPicture(PGFPlotsX.GroupPlot( + PGFPlotsX.Options( + "group style" => PGFPlotsX.Options( + "group size" => string(cols)*" by "*string(rows) + ) + ) + )) + + pushed_colormap = false + for sp in plt.subplots + bb = bbox(sp) + cstr = plot_color(sp[:background_color_legend]) + a = alpha(cstr) + title_cstr = plot_color(sp[:titlefontcolor]) + title_a = alpha(cstr) + # TODO: aspect ratio + axis_opt = PGFPlotsX.Options( + "height" => string(height(bb)), + "width" => string(width(bb)), + "title" => sp[:title], + "title style" => PGFPlotsX.Options( + "font" => pgfx_font(sp[:titlefontsize], pgfx_thickness_scaling(sp)), + "color" => title_cstr, + "draw opacity" => title_a, + "rotate" => sp[:titlefontrotation] + ), + "legend pos" => get(_pgfplotsx_legend_pos, sp[:legend], "outer north east"), + "legend style" => PGFPlotsX.Options( + pgfx_linestyle(pgfx_thickness_scaling(sp), sp[:foreground_color_legend], 1.0, "solid") => nothing, + "fill" => cstr, + "font" => pgfx_font(sp[:legendfontsize], pgfx_thickness_scaling(sp)) + ), + "axis background/.style" => PGFPlotsX.Options( + "fill" => sp[:background_color_inside] + ) + ) + for letter in (:x, :y, :z) + if letter != :z || is3d(sp) + pgfx_axis!(axis_opt, sp, letter) + 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 + if !pushed_colormap + PGFPlotsX.push_preamble!(pgfx_plot.the_plot, """\\pgfplotsset{ + colormap={plots}{$(pgfx_colormap(series.plotattributes[col]))}, + }""") + pushed_colormap = true + push!(axis_opt, + "colorbar" => nothing, + "colormap name" => "plots", + ) + 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] + ) + ) + axisf = if sp[:projection] == :polar + # TODO: this errors for some reason + # push!(axis_opt, "xmin" => 90) + # push!(axis_opt, "xmax" => 450) + PGFPlotsX.PolarAxis + else + PGFPlotsX.Axis + end + axis = axisf( + axis_opt + ) + for series in series_list(sp) + opt = series.plotattributes + st = series[:seriestype] + # function args + args = if st == :contour + opt[:z].surf, opt[:x], opt[:y] + elseif is3d(st) + opt[:x], opt[:y], opt[:z] + elseif st == :straightline + straightline_data(series) + elseif st == :shape + shape_data(series) + elseif ispolar(sp) + theta, r = opt[:x], opt[:y] + rad2deg.(theta), r + else + opt[:x], opt[:y] + end + series_opt = PGFPlotsX.Options( + "color" => opt[:linecolor], + ) + if st == :shape + push!(series_opt, "area legend" => nothing) + end + if opt[:marker_z] !== nothing + push!(series_opt, "point meta" => "explicit") + push!(series_opt, "scatter" => nothing) + end + segments = iter_segments(series) + segment_opt = PGFPlotsX.Options() + for (i, rng) in enumerate(segments) + segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) + segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) + if st == :shape + segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) + end + seg_args = (arg[rng] for arg in args) + # add fillrange + if series[:fillrange] !== nothing && st != :shape + push!(axis, pgfx_fillrange_series(series, i, _cycle(series[:fillrange], rng), seg_args...)) + end + + # add to legend? + if i == 1 && sp[:legend] != :none && should_add_to_legend(series) + if opt[:fillrange] !== nothing + push!(segment_opt, "forget plot" => nothing) + push!(axis, pgfx_fill_legend_hack(opt, args)) + else + if st == :shape + push!(segment_opt, "area legend" => nothing) + end + end + push!( axis, PGFPlotsX.LegendEntry( opt[:label] )) + else + push!(segment_opt, "forget plot" => nothing) + end + end + #include additional style + if haskey(_pgfx_series_extrastyle, st) + push!(series_opt, _pgfx_series_extrastyle[st] => nothing) + end + # TODO: different seriestypes, histogramms, contours, etc. + # TODO: colorbars + # TODO: gradients + if is3d(series) + series_func = PGFPlotsX.Plot3 + else + series_func = PGFPlotsX.Plot + end + if st == :scatter + push!(series_opt, "only marks" => nothing) + end + series_plot = series_func( + merge(series_opt, segment_opt), + PGFPlotsX.Coordinates(args..., meta = opt[:marker_z]) + ) + # add series annotations + anns = series[:series_annotations] + for (xi,yi,str,fnt) in EachAnn(anns, series[:x], series[:y]) + pgfx_add_annotation!(series_plot, xi, yi, PlotText(str, fnt), pgfx_thickness_scaling(series)) + end + push!( axis, series_plot ) + if opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) + push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) + ) + end + end + push!( the_plot.elements[1], 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 + pgfx_plot.is_created = true + end +end + +## const _pgfplotsx_linestyles = KW( :solid => "solid", @@ -344,193 +547,15 @@ end # -------------------------------------------------------------------------------------- # display calls this and then _display, its called 3 times for plot(1:5) function _create_backend_figure(plt::Plot{PGFPlotsXBackend}) - + plt.o = PGFPlotsXPlot() end -function _series_updated(plt::Plot{PGFPlotsXBackend}, series::Series) +function _series_added(plt::Plot{PGFPlotsXBackend}, series::Series) + plt.o.is_created = false end -# TODO: don't rebuild plots so often -# IDEA: use functor to only build plot once function _update_plot_object(plt::Plot{PGFPlotsXBackend}) - plt.o = PGFPlotsX.TikzDocument() - cols, rows = size(plt.layout.grid) - push!(plt.o, PGFPlotsX.TikzPicture(PGFPlotsX.GroupPlot( - PGFPlotsX.Options( - "group style" => PGFPlotsX.Options( - "group size" => string(cols)*" by "*string(rows) - ) - ) - ))) - - pushed_colormap = false - for sp in plt.subplots - bb = bbox(sp) - cstr = plot_color(sp[:background_color_legend]) - a = alpha(cstr) - title_cstr = plot_color(sp[:titlefontcolor]) - title_a = alpha(cstr) - # TODO: aspect ratio - axis_opt = PGFPlotsX.Options( - "height" => string(height(bb)), - "width" => string(width(bb)), - "title" => sp[:title], - "title style" => PGFPlotsX.Options( - "font" => pgfx_font(sp[:titlefontsize], pgfx_thickness_scaling(sp)), - "color" => title_cstr, - "draw opacity" => title_a, - "rotate" => sp[:titlefontrotation] - ), - "legend pos" => get(_pgfplotsx_legend_pos, sp[:legend], "outer north east"), - "legend style" => PGFPlotsX.Options( - pgfx_linestyle(pgfx_thickness_scaling(sp), sp[:foreground_color_legend], 1.0, "solid") => nothing, - "fill" => cstr, - "font" => pgfx_font(sp[:legendfontsize], pgfx_thickness_scaling(sp)) - ), - "axis background/.style" => PGFPlotsX.Options( - "fill" => sp[:background_color_inside] - ) - ) - for letter in (:x, :y, :z) - if letter != :z || is3d(sp) - pgfx_axis!(axis_opt, sp, letter) - 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 - if !pushed_colormap - PGFPlotsX.push_preamble!(plt.o, """\\pgfplotsset{ - colormap={plots}{$(pgfx_colormap(series.plotattributes[col]))}, - }""") - pushed_colormap = true - push!(axis_opt, - "colorbar" => nothing, - "colormap name" => "plots", - ) - 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] - ) - ) - axisf = if sp[:projection] == :polar - # TODO: this errors for some reason - # push!(axis_opt, "xmin" => 90) - # push!(axis_opt, "xmax" => 450) - PGFPlotsX.PolarAxis - else - PGFPlotsX.Axis - end - axis = axisf( - axis_opt - ) - for series in series_list(sp) - opt = series.plotattributes - st = series[:seriestype] - # function args - args = if st == :contour - opt[:z].surf, opt[:x], opt[:y] - elseif is3d(st) - opt[:x], opt[:y], opt[:z] - elseif st == :straightline - straightline_data(series) - elseif st == :shape - shape_data(series) - elseif ispolar(sp) - theta, r = opt[:x], opt[:y] - rad2deg.(theta), r - else - opt[:x], opt[:y] - end - series_opt = PGFPlotsX.Options( - "color" => opt[:linecolor], - ) - if st == :shape - push!(series_opt, "area legend" => nothing) - end - if opt[:marker_z] !== nothing - push!(series_opt, "point meta" => "explicit") - push!(series_opt, "scatter" => nothing) - end - segments = iter_segments(series) - segment_opt = PGFPlotsX.Options() - for (i, rng) in enumerate(segments) - segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) - segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) - if st == :shape - segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) - end - seg_args = (arg[rng] for arg in args) - # add fillrange - if series[:fillrange] !== nothing && st != :shape - push!(axis, pgfx_fillrange_series(series, i, _cycle(series[:fillrange], rng), seg_args...)) - end - - # add to legend? - if i == 1 && sp[:legend] != :none && should_add_to_legend(series) - if opt[:fillrange] !== nothing - push!(segment_opt, "forget plot" => nothing) - push!(axis, pgfx_fill_legend_hack(opt, args)) - else - if st == :shape - push!(segment_opt, "area legend" => nothing) - end - end - push!( axis, PGFPlotsX.LegendEntry( opt[:label] )) - else - push!(segment_opt, "forget plot" => nothing) - end - end - #include additional style - if haskey(_pgfx_series_extrastyle, st) - push!(series_opt, _pgfx_series_extrastyle[st] => nothing) - end - # TODO: different seriestypes, histogramms, contours, etc. - # TODO: colorbars - # TODO: gradients - if is3d(series) - series_func = PGFPlotsX.Plot3 - else - series_func = PGFPlotsX.Plot - end - if st == :scatter - push!(series_opt, "only marks" => nothing) - end - series_plot = series_func( - merge(series_opt, segment_opt), - PGFPlotsX.Coordinates(args..., meta = opt[:marker_z]) - ) - # add series annotations - anns = series[:series_annotations] - for (xi,yi,str,fnt) in EachAnn(anns, series[:x], series[:y]) - pgfx_add_annotation!(series_plot, xi, yi, PlotText(str, fnt), pgfx_thickness_scaling(series)) - end - push!( axis, series_plot ) - if opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) - push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) - ) - end - end - push!( plt.o.elements[1].elements[1], axis ) - end + plt.o(plt) end function _show(io::IO, mime::MIME"image/svg+xml", plt::Plot{PGFPlotsXBackend}) From a2bdc4c3ef8e16b8a6e657460a0534d6a4a754fc Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Wed, 20 Nov 2019 15:20:33 +0100 Subject: [PATCH 245/357] update tests --- src/backends/pgfplotsx.jl | 5 +++-- test/test_pgfplotsx.jl | 24 +++++++++++++----------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index e9e49e73..90b823d8 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -5,6 +5,8 @@ Base.@kwdef mutable struct PGFPlotsXPlot the_plot::PGFPlotsX.TikzDocument = PGFPlotsX.TikzDocument() end +pgfx_axes(pgfx_plot::PGFPlotsXPlot) = pgfx_plot.the_plot.elements[1].elements[1].contents + function Base.show(io::IO, mime::MIME, pgfx_plot::PGFPlotsXPlot) show(io::IO, mime, pgfx_plot.the_plot) end @@ -31,7 +33,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) a = alpha(cstr) title_cstr = plot_color(sp[:titlefontcolor]) title_a = alpha(cstr) - # TODO: aspect ratio axis_opt = PGFPlotsX.Options( "height" => string(height(bb)), "width" => string(width(bb)), @@ -575,7 +576,7 @@ end function _show(io::IO, mime::MIME"application/x-tex", plt::Plot{PGFPlotsXBackend}) _update_plot_object(plt) - PGFPlotsX.print_tex(plt.o) + PGFPlotsX.print_tex(plt.o.the_plot) end function _display(plt::Plot{PGFPlotsXBackend}) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 748d1739..03e9dce2 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -12,34 +12,37 @@ function create_plot!( args...; kwargs... ) end @testset "PGFPlotsX" begin - pgfx_plot, pgfx_tex = create_plot(1:5) + pgfx_plot = plot(1:5) + Plots._update_plot_object(pgfx_plot) + @test pgfx_plot.o.the_plot isa PGFPlotsX.TikzDocument - @test pgfx_plot.o isa PGFPlotsX.GroupPlot - @testset "3D docs example" begin + @testset "3D docs example" begin n = 100 ts = range(0, stop=8π, length=n) x = ts .* map(cos, ts) y = (0.1ts) .* map(sin, ts) z = 1:n pl = plot(x, y, z, zcolor=reverse(z), m=(10, 0.8, :blues, Plots.stroke(0)), leg=false, cbar=true, w=5) - pgfx_plot, pgfx_tex = create_plot!(pl, zeros(n), zeros(n), 1:n, w=10) - if @test_nowarn(haskey(pgfx_plot.o.contents[1].options.dict, "colorbar") == true) - @test pgfx_plot.o.contents[1]["colorbar"] === nothing + pgfx_plot = plot!(pl, zeros(n), zeros(n), 1:n, w=10) + Plots._update_plot_object(pgfx_plot) + if @test_nowarn(haskey(Plots.pgfx_axes(pgfx_plot.o)[1].options.dict, "colorbar") == true) + @test Plots.pgfx_axes(pgfx_plot.o)[1]["colorbar"] === nothing end end # testset @testset "Color docs example" begin y = rand(100) plot(0:10:100, rand(11, 4), lab="lines", w=3, palette=:grays, fill=0, α=0.6) - scatter!(y, zcolor=abs.(y .- 0.5), m=(:heat, 0.8, Plots.stroke(1, :green)), ms=10 * abs.(y .- 0.5) .+ 4, lab="grad") + pl = scatter!(y, zcolor=abs.(y .- 0.5), m=(:heat, 0.8, Plots.stroke(1, :green)), ms=10 * abs.(y .- 0.5) .+ 4, lab="grad") + Plots._update_plot_object(pl) + axis = Plots.pgfx_axes(pl.o)[1] + @test count( x->x isa PGFPlotsX.LegendEntry, axis.contents ) == 5 + @test count( x->x isa PGFPlotsX.Plot, axis.contents ) == 5 # TODO: marker size does not adjust # TODO: marker stroke is incorrect - # TODO: fill legends - # TODO: adjust colorbar limits to data end # testset @testset "Plot in pieces" begin plot(rand(100) / 3, reg=true, fill=(0, :green)) scatter!(rand(100), markersize=6, c=:orange) - # TODO: legends should be different end # testset @testset "Marker types" begin markers = filter((m->begin @@ -50,7 +53,6 @@ end x = (range(0, stop=10, length=n + 2))[2:end - 1] y = repeat(reshape(reverse(x), 1, :), n, 1) scatter(x, y, m=(8, :auto), lab=map(string, markers), bg=:linen, xlim=(0, 10), ylim=(0, 10)) - #TODO: fix markers that show up as circles end # testset @testset "Layout" begin plot(Plots.fakedata(100, 10), layout=4, palette=[:grays :blues :heat :lightrainbow], bg_inside=[:orange :pink :darkblue :black]) From fc0a12ac361bd332d8683c8f0de6c5e3791f7c3d Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Wed, 20 Nov 2019 17:28:23 +0100 Subject: [PATCH 246/357] native fillrange --- src/backends/pgfplotsx.jl | 96 +++++++++++++++++++-------------------- test/test_pgfplotsx.jl | 12 +++-- 2 files changed, 55 insertions(+), 53 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 90b823d8..c0c6e05e 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -88,6 +88,10 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end end @label colorbar_end + # detect fillranges + # if any(series->series[:fillrange] != nothing, series_list(sp)) + # PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usepgfplotslibrary{fillbetween},\n") + # end push!(axis_opt, "colorbar style" => PGFPlotsX.Options( "title" => sp[:colorbar_title] @@ -125,71 +129,61 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) series_opt = PGFPlotsX.Options( "color" => opt[:linecolor], ) - if st == :shape - push!(series_opt, "area legend" => nothing) - end if opt[:marker_z] !== nothing push!(series_opt, "point meta" => "explicit") push!(series_opt, "scatter" => nothing) end - segments = iter_segments(series) - segment_opt = PGFPlotsX.Options() - for (i, rng) in enumerate(segments) - segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) - segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) - if st == :shape - segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) - end - seg_args = (arg[rng] for arg in args) - # add fillrange - if series[:fillrange] !== nothing && st != :shape - push!(axis, pgfx_fillrange_series(series, i, _cycle(series[:fillrange], rng), seg_args...)) - end - - # add to legend? - if i == 1 && sp[:legend] != :none && should_add_to_legend(series) - if opt[:fillrange] !== nothing - push!(segment_opt, "forget plot" => nothing) - push!(axis, pgfx_fill_legend_hack(opt, args)) - else - if st == :shape - push!(segment_opt, "area legend" => nothing) - end - end - push!( axis, PGFPlotsX.LegendEntry( opt[:label] )) - else - push!(segment_opt, "forget plot" => nothing) - end - end - #include additional style - if haskey(_pgfx_series_extrastyle, st) - push!(series_opt, _pgfx_series_extrastyle[st] => nothing) - end - # TODO: different seriestypes, histogramms, contours, etc. - # TODO: colorbars - # TODO: gradients if is3d(series) series_func = PGFPlotsX.Plot3 else series_func = PGFPlotsX.Plot end - if st == :scatter - push!(series_opt, "only marks" => nothing) + if series[:fillrange] !== nothing + series_opt = merge(series_opt, pgfx_fillstyle(opt)) + push!(series_opt, "area legend" => nothing) end - series_plot = series_func( - merge(series_opt, segment_opt), - PGFPlotsX.Coordinates(args..., meta = opt[:marker_z]) - ) + # include additional style + if haskey(_pgfx_series_extrastyle, st) + push!(series_opt, _pgfx_series_extrastyle[st] => nothing) + end + # treat segments + segments = iter_segments(series) + segment_opt = PGFPlotsX.Options() + # @show get_markerstrokecolor(opt, 1) + # @show get_markercolor(opt,1) + for (i, rng) in enumerate(segments) + seg_args = (arg[rng] for arg in args) + segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) + segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) + if st == :shape || series[:fillrange] !== nothing + segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) + end + segment_plot = series_func( + merge(series_opt, segment_opt), + PGFPlotsX.Coordinates(seg_args..., + meta = if !isnothing(opt[:marker_z]) + opt[:marker_z][rng] + else + nothing + end + ), + series[:fillrange] !== nothing ? "\\closedcycle" : "{}" + ) + push!(axis, segment_plot) + # add to legend? + if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) + push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) + ) + end + end + # TODO: different seriestypes, histogramms, contours, etc. + # TODO: colorbars + # TODO: gradients # add series annotations anns = series[:series_annotations] for (xi,yi,str,fnt) in EachAnn(anns, series[:x], series[:y]) pgfx_add_annotation!(series_plot, xi, yi, PlotText(str, fnt), pgfx_thickness_scaling(series)) end - push!( axis, series_plot ) - if opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) - push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) - ) - end end push!( the_plot.elements[1], axis ) if length(plt.o.the_plot.elements) > 0 @@ -247,6 +241,8 @@ const _pgfx_series_extrastyle = KW( :sticks => "ycomb", :ysticks => "ycomb", :xsticks => "xcomb", + :scatter => "only marks", + :shape => "area legends" ) const _pgfx_framestyles = [:box, :axes, :origin, :zerolines, :grid, :none] diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 03e9dce2..7a8c320a 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -36,9 +36,15 @@ end Plots._update_plot_object(pl) axis = Plots.pgfx_axes(pl.o)[1] @test count( x->x isa PGFPlotsX.LegendEntry, axis.contents ) == 5 - @test count( x->x isa PGFPlotsX.Plot, axis.contents ) == 5 - # TODO: marker size does not adjust - # TODO: marker stroke is incorrect + @test count( x->x isa PGFPlotsX.Plot, axis.contents ) == 104 # each marker is its own plot + marker = axis.contents[5] + @test marker isa PGFPlotsX.Plot + @show marker.options.dict |> keys + @test marker.options["mark"] == "none" + @test marker.options["mark options"]["color"] == convert(RGBA{Float64}, colorant"green") + @test marker.options["mark options"]["line width"] == 1 + + # TODO: marker stroke color is incorrect end # testset @testset "Plot in pieces" begin plot(rand(100) / 3, reg=true, fill=(0, :green)) From 642bb9aeadd1e5c120a9565a468c4828326d3b74 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Wed, 20 Nov 2019 18:10:30 +0100 Subject: [PATCH 247/357] tests for marker-stroke-color --- src/backends/pgfplotsx.jl | 2 -- test/test_pgfplotsx.jl | 7 +++---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index c0c6e05e..4995feb5 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -149,8 +149,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) # treat segments segments = iter_segments(series) segment_opt = PGFPlotsX.Options() - # @show get_markerstrokecolor(opt, 1) - # @show get_markercolor(opt,1) for (i, rng) in enumerate(segments) seg_args = (arg[rng] for arg in args) segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 7a8c320a..5ffd62c8 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -37,11 +37,10 @@ end axis = Plots.pgfx_axes(pl.o)[1] @test count( x->x isa PGFPlotsX.LegendEntry, axis.contents ) == 5 @test count( x->x isa PGFPlotsX.Plot, axis.contents ) == 104 # each marker is its own plot - marker = axis.contents[5] + marker = axis.contents[14] @test marker isa PGFPlotsX.Plot - @show marker.options.dict |> keys - @test marker.options["mark"] == "none" - @test marker.options["mark options"]["color"] == convert(RGBA{Float64}, colorant"green") + @test marker.options["mark"] == "*" + @test marker.options["mark options"]["color"] == RGBA{Float64}( colorant"green", 0.8) @test marker.options["mark options"]["line width"] == 1 # TODO: marker stroke color is incorrect From 2cfd1838ca8b3d8d784178d03c9562252178fa9a Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 11:11:05 +0100 Subject: [PATCH 248/357] remove point meta --- src/backends/pgfplotsx.jl | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 4995feb5..ac088762 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -129,10 +129,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) series_opt = PGFPlotsX.Options( "color" => opt[:linecolor], ) - if opt[:marker_z] !== nothing - push!(series_opt, "point meta" => "explicit") - push!(series_opt, "scatter" => nothing) - end if is3d(series) series_func = PGFPlotsX.Plot3 else @@ -158,13 +154,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end segment_plot = series_func( merge(series_opt, segment_opt), - PGFPlotsX.Coordinates(seg_args..., - meta = if !isnothing(opt[:marker_z]) - opt[:marker_z][rng] - else - nothing - end - ), + PGFPlotsX.Coordinates(seg_args...), series[:fillrange] !== nothing ? "\\closedcycle" : "{}" ) push!(axis, segment_plot) From 242d8b290d2661fe964c0e310c5a9ecbe1e78e27 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 11:31:33 +0100 Subject: [PATCH 249/357] adjust color bar limits --- src/backends/pgfplotsx.jl | 20 +++++++++++++++----- test/test_pgfplotsx.jl | 2 -- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index ac088762..53ffbfe7 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -88,13 +88,9 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end end @label colorbar_end - # detect fillranges - # if any(series->series[:fillrange] != nothing, series_list(sp)) - # PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usepgfplotslibrary{fillbetween},\n") - # end push!(axis_opt, "colorbar style" => PGFPlotsX.Options( - "title" => sp[:colorbar_title] + "title" => sp[:colorbar_title], ) ) axisf = if sp[:projection] == :polar @@ -110,6 +106,20 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) ) for series in series_list(sp) opt = series.plotattributes + if opt[:marker_z] !== nothing + cbar_style = axis_opt["colorbar style"] + if !haskey( cbar_style.dict, "point meta max" ) + append!( axis_opt["colorbar style"], + ( + "point meta max" => maximum(opt[:marker_z]), + "point meta min" => minimum(opt[:marker_z]) + ) + ) + else + cbar_style["point meta max"] = maximum(opt[:marker_z]) + cbar_style["point meta min"] = minimum(opt[:marker_z]) + end + end st = series[:seriestype] # function args args = if st == :contour diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 5ffd62c8..21074e93 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -42,8 +42,6 @@ end @test marker.options["mark"] == "*" @test marker.options["mark options"]["color"] == RGBA{Float64}( colorant"green", 0.8) @test marker.options["mark options"]["line width"] == 1 - - # TODO: marker stroke color is incorrect end # testset @testset "Plot in pieces" begin plot(rand(100) / 3, reg=true, fill=(0, :green)) From 1f14a4d4c6fd7e7ff59efcf06219f07f771a081e Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 12:34:09 +0100 Subject: [PATCH 250/357] fix polar plots --- src/backends/pgfplotsx.jl | 31 ++++++++++++++++++++----------- test/test_pgfplotsx.jl | 1 - 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 53ffbfe7..66fc5f02 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -18,14 +18,18 @@ end function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) if !pgfx_plot.is_created cols, rows = size(plt.layout.grid) - the_plot = PGFPlotsX.TikzPicture(PGFPlotsX.GroupPlot( - PGFPlotsX.Options( - "group style" => PGFPlotsX.Options( - "group size" => string(cols)*" by "*string(rows) + the_plot = PGFPlotsX.TikzPicture() + # the combination of groupplot and polaraxis is broken in pgfplots + if !any( sp -> ispolar(sp), plt.subplots ) + push!( the_plot, PGFPlotsX.GroupPlot( + PGFPlotsX.Options( + "group style" => PGFPlotsX.Options( + "group size" => string(cols)*" by "*string(rows) + ) + ) ) ) - )) - + end pushed_colormap = false for sp in plt.subplots bb = bbox(sp) @@ -121,6 +125,9 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end end st = series[:seriestype] + series_opt = PGFPlotsX.Options( + "color" => opt[:linecolor], + ) # function args args = if st == :contour opt[:z].surf, opt[:x], opt[:y] @@ -136,9 +143,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) else opt[:x], opt[:y] end - series_opt = PGFPlotsX.Options( - "color" => opt[:linecolor], - ) if is3d(series) series_func = PGFPlotsX.Plot3 else @@ -183,7 +187,12 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) pgfx_add_annotation!(series_plot, xi, yi, PlotText(str, fnt), pgfx_thickness_scaling(series)) end end - push!( the_plot.elements[1], axis ) + 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 @@ -570,7 +579,7 @@ end function _show(io::IO, mime::MIME"application/x-tex", plt::Plot{PGFPlotsXBackend}) _update_plot_object(plt) - PGFPlotsX.print_tex(plt.o.the_plot) + PGFPlotsX.print_tex(io, plt.o.the_plot) end function _display(plt::Plot{PGFPlotsXBackend}) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 21074e93..4eeeddf7 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -65,7 +65,6 @@ end Θ = range(0, stop=1.5π, length=100) r = abs.(0.1 * randn(100) + sin.(3Θ)) plot(Θ, r, proj=:polar, m=2) - # TODO: handle polar plots end # testset @testset "Histogram 2D" begin histogram2d(randn(10000), randn(10000), nbins=20) From 4c6b96e38a806d7f2c2e8a234be12b878a147d58 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 13:03:37 +0100 Subject: [PATCH 251/357] padding of grouplots --- src/backends/pgfplotsx.jl | 11 ++++++++++- test/test_pgfplotsx.jl | 1 - 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 66fc5f02..0764606e 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -24,7 +24,9 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) push!( the_plot, PGFPlotsX.GroupPlot( PGFPlotsX.Options( "group style" => PGFPlotsX.Options( - "group size" => string(cols)*" by "*string(rows) + "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)), ) ) ) @@ -550,6 +552,13 @@ function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) end # -------------------------------------------------------------------------------------- # display calls this and then _display, its called 3 times for plot(1:5) +# Set the (left, top, right, bottom) minimum padding around the plot area +# to fit ticks, tick labels, guides, colorbars, etc. +function _update_min_padding!(sp::Subplot{PGFPlotsXBackend}) + # TODO: make padding more intelligent + sp.minpad = (20mm, 5mm, 2mm, 10mm) +end + function _create_backend_figure(plt::Plot{PGFPlotsXBackend}) plt.o = PGFPlotsXPlot() end diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 4eeeddf7..68002222 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -59,7 +59,6 @@ end end # testset @testset "Layout" begin plot(Plots.fakedata(100, 10), layout=4, palette=[:grays :blues :heat :lightrainbow], bg_inside=[:orange :pink :darkblue :black]) - # TODO: no extra space for outer legends end # testset @testset "Polar plots" begin Θ = range(0, stop=1.5π, length=100) From 74001a555bd1719734123f187afd060e29f36837 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 13:06:22 +0100 Subject: [PATCH 252/357] remove unneccesary code --- src/backends/pgfplotsx.jl | 49 --------------------------------------- 1 file changed, 49 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 0764606e..07da6b69 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -368,55 +368,6 @@ function pgfx_add_annotation!(o, x, y, val, thickness_scaling = 1) "{$(val.str).};" ]) end -## -------------------------------------------------------------------------------------- -# TODO: translate these if needed -function pgfx_fillrange_series(series, i, fillrange, args...) - st = series[:seriestype] - opt = PGFPlotsX.Options() - push!(opt, "line width" => 0) - push!(opt, "draw opacity" => 0) - opt = merge(opt, pgfx_fillstyle(series, i)) - opt = merge(opt, pgfx_marker(series, i)) - push!(opt, "forget plot" => nothing) - if haskey(_pgfx_series_extrastyle, st) - push!(opt, _pgfx_series_extrastyle[st] => nothing) - end - func = is3d(series) ? PGFPlotsX.Plot3 : PGFPlotsX.Plot - return func(opt, PGFPlotsX.Coordinates(pgfx_fillrange_args(fillrange, args...)...)) -end - -function pgfx_fillrange_args(fillrange, x, y) - n = length(x) - x_fill = [x; x[n:-1:1]; x[1]] - y_fill = [y; _cycle(fillrange, n:-1:1); y[1]] - return x_fill, y_fill -end - -function pgfx_fillrange_args(fillrange, x, y, z) - n = length(x) - x_fill = [x; x[n:-1:1]; x[1]] - y_fill = [y; y[n:-1:1]; x[1]] - z_fill = [z; _cycle(fillrange, n:-1:1); z[1]] - return x_fill, y_fill, z_fill -end - -function pgfx_fill_legend_hack(plotattributes, args) - opt = PGFPlotsX.Options("area legend" => nothing) - opt = merge(opt, pgfx_linestyle(plotattributes, 1)) - opt = merge(opt, pgfx_marker(plotattributes, 1)) - opt = merge(opt, pgfx_fillstyle(plotattributes, 1)) - st = plotattributes[:seriestype] - func = if st == :path3d - PGFPlotsX.Plot3 - else - PGFPlotsX.Plot - end - if st == :scatter - push!(opt, "only marks" => nothing) - end - return func(opt, PGFPlotsX.Coordinates(([arg[1]] for arg in args)...)) -end - # -------------------------------------------------------------------------------------- function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) axis = sp[Symbol(letter,:axis)] From e3a166f04cc22d8a7a1d5338f5beda9d1590fd31 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 14:37:39 +0100 Subject: [PATCH 253/357] basic contour --- src/backends/pgfplotsx.jl | 66 ++++++++++++++++++++++----------------- test/test_pgfplotsx.jl | 9 +++++- 2 files changed, 46 insertions(+), 29 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 07da6b69..bdb7b7f9 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,4 +1,5 @@ -# PGFPlotsX.print_tex(io::IO, data::Symbol) = PGFPlotsX.print_tex(io, string(data)) +using Contour: Contour +# PGFPlotsX.print_tex(io::IO, data::ColorGradient) = write(io, pgfx_colormap(data)) Base.@kwdef mutable struct PGFPlotsXPlot is_created::Bool = false was_shown::Bool = false @@ -132,7 +133,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) ) # function args args = if st == :contour - opt[:z].surf, opt[:x], opt[:y] + opt[:x], opt[:y], opt[:z].surf' elseif is3d(st) opt[:x], opt[:y], opt[:z] elseif st == :straightline @@ -158,35 +159,44 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) if haskey(_pgfx_series_extrastyle, st) push!(series_opt, _pgfx_series_extrastyle[st] => nothing) end - # treat segments - segments = iter_segments(series) - segment_opt = PGFPlotsX.Options() - for (i, rng) in enumerate(segments) - seg_args = (arg[rng] for arg in args) - segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) - segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) - if st == :shape || series[:fillrange] !== nothing - segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) - end - segment_plot = series_func( - merge(series_opt, segment_opt), - PGFPlotsX.Coordinates(seg_args...), - series[:fillrange] !== nothing ? "\\closedcycle" : "{}" + if st == :contour + surface_opt = PGFPlotsX.Options( + "contour prepared" => nothing ) - push!(axis, segment_plot) - # add to legend? - if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) - push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) + surface_plot = series_func( + # merge(series_opt, surface_opt), + surface_opt, + PGFPlotsX.Table(Contour.contours(args...)) + ) + push!(axis, surface_plot) + else + # treat segments + segments = iter_segments(series) + segment_opt = PGFPlotsX.Options() + for (i, rng) in enumerate(segments) + seg_args = (arg[rng] for arg in args) + segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) + segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) + if st == :shape || series[:fillrange] !== nothing + segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) + end + segment_plot = series_func( + merge(series_opt, segment_opt), + PGFPlotsX.Coordinates(seg_args...), + series[:fillrange] !== nothing ? "\\closedcycle" : "{}" ) + push!(axis, segment_plot) + # add to legend? + if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) + push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) + ) + end + 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 - # TODO: different seriestypes, histogramms, contours, etc. - # TODO: colorbars - # TODO: gradients - # add series annotations - anns = series[:series_annotations] - for (xi,yi,str,fnt) in EachAnn(anns, series[:x], series[:y]) - pgfx_add_annotation!(series_plot, xi, yi, PlotText(str, fnt), pgfx_thickness_scaling(series)) end end if ispolar(sp) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 68002222..de775c32 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -65,6 +65,13 @@ end r = abs.(0.1 * randn(100) + sin.(3Θ)) plot(Θ, r, proj=:polar, m=2) end # testset + @testset "Drawing shapes" begin + verts = [(-1.0, 1.0), (-1.28, 0.6), (-0.2, -1.4), (0.2, -1.4), (1.28, 0.6), (1.0, 1.0), (-1.0, 1.0), (-0.2, -0.6), (0.0, -0.2), (-0.4, 0.6), (1.28, 0.6), (0.2, -1.4), (-0.2, -1.4), (0.6, 0.2), (-0.2, 0.2), (0.0, -0.2), (0.2, 0.2), (-0.2, -0.6)] + x = 0.1:0.2:0.9 + y = 0.7 * rand(5) .+ 0.15 + plot(x, y, line=(3, :dash, :lightblue), marker=(Shape(verts), 30, RGBA(0, 0, 0, 0.2)), bg=:pink, fg=:darkblue, xlim=(0, 1), ylim=(0, 1), leg=false) + # TODO: draw those polygons + end # testset @testset "Histogram 2D" begin histogram2d(randn(10000), randn(10000), nbins=20) # TODO: totally broken, errors also for pgfplots @@ -78,8 +85,8 @@ end X = repeat(reshape(x, 1, :), length(y), 1) Y = repeat(y, 1, length(x)) Z = map(f, X, Y) - p1 = contour(x, y, f, fill=true) p2 = contour(x, y, Z) + p1 = contour(x, y, f, fill=true) plot(p1, p2) # TODO: totally broken, also errors for pgfplots end # testset From 567d3688e84e217a1b6047c0849bf1f56648c191 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 15:07:48 +0100 Subject: [PATCH 254/357] filled contours are difficult --- src/backends/pgfplotsx.jl | 20 ++++++++++++++++---- test/test_pgfplotsx.jl | 2 +- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index bdb7b7f9..a523cc48 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -151,7 +151,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) else series_func = PGFPlotsX.Plot end - if series[:fillrange] !== nothing + if series[:fillrange] !== nothing && st != :contour series_opt = merge(series_opt, pgfx_fillstyle(opt)) push!(series_opt, "area legend" => nothing) end @@ -160,13 +160,25 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) push!(series_opt, _pgfx_series_extrastyle[st] => nothing) end if st == :contour + if !isfilledcontour(series) surface_opt = PGFPlotsX.Options( - "contour prepared" => nothing - ) + "contour prepared" => PGFPlotsX.Options( + "labels" => opt[:contour_labels], + ) + ) + else + error("PGFPlotsX backend does not support filled contours at the moment.") + surface_opt = PGFPlotsX.Options( + "contour filled" => PGFPlotsX.Options( + # "levels" => opt[:levels], + # "labels" => opt[:contour_labels], + ) + ) + end surface_plot = series_func( # merge(series_opt, surface_opt), surface_opt, - PGFPlotsX.Table(Contour.contours(args...)) + PGFPlotsX.Table(Contour.contours(args..., opt[:levels])) ) push!(axis, surface_plot) else diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index de775c32..e0a2eacd 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -88,6 +88,6 @@ end p2 = contour(x, y, Z) p1 = contour(x, y, f, fill=true) plot(p1, p2) - # TODO: totally broken, also errors for pgfplots + # TODO: filled contours end # testset end # testset From c9c4de37e68ae72fc577d0f29cca83e95cf7dc5f Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 15:45:35 +0100 Subject: [PATCH 255/357] more than one colorbar --- src/backends/pgfplotsx.jl | 42 +++++++++++---------------------------- test/test_pgfplotsx.jl | 12 +++++++++++ 2 files changed, 24 insertions(+), 30 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index a523cc48..54f8b341 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,4 +1,5 @@ using Contour: Contour +using StatsBase: Histogram, fit # PGFPlotsX.print_tex(io::IO, data::ColorGradient) = write(io, pgfx_colormap(data)) Base.@kwdef mutable struct PGFPlotsXPlot is_created::Bool = false @@ -33,7 +34,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) ) ) end - pushed_colormap = false for sp in plt.subplots bb = bbox(sp) cstr = plot_color(sp[:background_color_legend]) @@ -65,36 +65,16 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) pgfx_axis!(axis_opt, sp, letter) 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 - if !pushed_colormap - PGFPlotsX.push_preamble!(pgfx_plot.the_plot, """\\pgfplotsset{ - colormap={plots}{$(pgfx_colormap(series.plotattributes[col]))}, - }""") - pushed_colormap = true - push!(axis_opt, - "colorbar" => nothing, - "colormap name" => "plots", - ) - end - - # goto is needed to break out of col and series for - @goto colorbar_end - end - end + if hascolorbar(sp) + PGFPlotsX.push_preamble!(pgfx_plot.the_plot, """\\pgfplotsset{ + colormap={plots$(sp.attr[:subplot_index])}{$(pgfx_colormap(series.plotattributes[col]))}, + }""") + pushed_colormap = true + push!(axis_opt, + "colorbar" => nothing, + "colormap name" => "plots$(sp.attr[:subplot_index])", + ) end - @label colorbar_end push!(axis_opt, "colorbar style" => PGFPlotsX.Options( "title" => sp[:colorbar_title], @@ -181,6 +161,8 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) PGFPlotsX.Table(Contour.contours(args..., opt[:levels])) ) push!(axis, surface_plot) + elseif st == :histogram2d + hist_ else # treat segments segments = iter_segments(series) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index e0a2eacd..3d96360d 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -90,4 +90,16 @@ end plot(p1, p2) # TODO: filled contours end # testset + @testset "Varying colors" begin + t = range(0, stop=1, length=100) + θ = (6π) .* t + x = t .* cos.(θ) + y = t .* sin.(θ) + p1 = plot(x, y, line_z=t, linewidth=3, legend=false) + p2 = scatter(x, y, marker_z=((x, y)->begin + x + y + end), color=:bluesreds, legend=false) + plot(p1, p2) + # TODO: handle gradients as color + end # testset end # testset From f5cbb1e341e64f98b35a8528d854e06adb473bab Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 16:07:08 +0100 Subject: [PATCH 256/357] simplifications --- src/backends/pgfplotsx.jl | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 54f8b341..33a2d98a 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -78,6 +78,8 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) 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] ) ) axisf = if sp[:projection] == :polar @@ -93,20 +95,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) ) for series in series_list(sp) opt = series.plotattributes - if opt[:marker_z] !== nothing - cbar_style = axis_opt["colorbar style"] - if !haskey( cbar_style.dict, "point meta max" ) - append!( axis_opt["colorbar style"], - ( - "point meta max" => maximum(opt[:marker_z]), - "point meta min" => minimum(opt[:marker_z]) - ) - ) - else - cbar_style["point meta max"] = maximum(opt[:marker_z]) - cbar_style["point meta min"] = minimum(opt[:marker_z]) - end - end st = series[:seriestype] series_opt = PGFPlotsX.Options( "color" => opt[:linecolor], @@ -147,7 +135,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) ) ) else - error("PGFPlotsX backend does not support filled contours at the moment.") + notimpl() surface_opt = PGFPlotsX.Options( "contour filled" => PGFPlotsX.Options( # "levels" => opt[:levels], From 6378f88ba973af3b942ff2f3dba12f6f6c363e79 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 16:46:15 +0100 Subject: [PATCH 257/357] subplot annotations --- src/backends/pgfplotsx.jl | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 33a2d98a..325d1047 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -18,6 +18,7 @@ function Base.push!(pgfx_plot::PGFPlotsXPlot, item) end function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) + # TODO: annotations! does not trigger _series_added ... if !pgfx_plot.is_created cols, rows = size(plt.layout.grid) the_plot = PGFPlotsX.TikzPicture() @@ -180,6 +181,11 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) 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) + end end if ispolar(sp) axes = the_plot From faa401f0e5a9403270fb882d6bf3249d1f07eed9 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 16:52:35 +0100 Subject: [PATCH 258/357] total plot size --- src/backends/pgfplotsx.jl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 325d1047..267915d7 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -24,13 +24,16 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) the_plot = PGFPlotsX.TikzPicture() # the combination of groupplot and polaraxis is broken in pgfplots 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)), - ) + ), + "height" => pl_height > 0 ? string(pl_height)*"px" : "{}", + "width" => pl_width > 0 ? string(pl_width)*"px" : "{}", ) ) ) From a03ae0be10f9707417e95f52d4b004fecff9843b Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 19:10:58 +0100 Subject: [PATCH 259/357] working heatmap --- src/backends.jl | 2 +- src/backends/pgfplotsx.jl | 75 ++++++++++++++++++++++++++++++++------- test/test_pgfplotsx.jl | 15 +++++++- 3 files changed, 77 insertions(+), 15 deletions(-) diff --git a/src/backends.jl b/src/backends.jl index d2ae4894..87f4dda8 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -711,7 +711,7 @@ const _pgfplotsx_attr = merge_with_base_supported([ # :contour, :path3d, :scatter3d, :surface, :wireframe, :volume, # :shape # ] -const _pgfplotsx_seriestype = [:path, :path3d, :scatter, :steppre, :stepmid, :steppost, :histogram2d, :ysticks, :xsticks, :contour, :shape, :straightline,] +const _pgfplotsx_seriestype = [:path, :path3d, :scatter, :steppre, :heatmap, :stepmid, :steppost, :histogram2d, :ysticks, :xsticks, :contour, :shape, :straightline,] const _pgfplotsx_style = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] const _pgfplotsx_marker = [:none, :auto, :circle, :rect, :diamond, :utriangle, :dtriangle, :ltriangle, :rtriangle, :cross, :xcross, :star5, :pentagon, :hline, :vline, Shape] const _pgfplotsx_scale = [:identity, :ln, :log2, :log10] diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 267915d7..81cabf23 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -9,6 +9,19 @@ end pgfx_axes(pgfx_plot::PGFPlotsXPlot) = pgfx_plot.the_plot.elements[1].elements[1].contents +function surface_to_vecs(x::AVec, y::AVec, s::Union{AMat, Surface}) + a = Array(s) + xn = Vector{eltype(x)}(undef, length(a)) + yn = Vector{eltype(y)}(undef, length(a)) + zn = Vector{eltype(s)}(undef, length(a)) + for (n, (i, j)) in enumerate(Tuple.(CartesianIndices(a))) + xn[n] = x[j] + yn[n] = y[i] + zn[n] = a[i,j] + end + return xn, yn, zn +end + function Base.show(io::IO, mime::MIME, pgfx_plot::PGFPlotsXPlot) show(io::IO, mime, pgfx_plot.the_plot) end @@ -69,16 +82,32 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) pgfx_axis!(axis_opt, sp, letter) end end - if hascolorbar(sp) - PGFPlotsX.push_preamble!(pgfx_plot.the_plot, """\\pgfplotsset{ - colormap={plots$(sp.attr[:subplot_index])}{$(pgfx_colormap(series.plotattributes[col]))}, - }""") - pushed_colormap = true - push!(axis_opt, - "colorbar" => nothing, - "colormap name" => "plots$(sp.attr[:subplot_index])", - ) - 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 + PGFPlotsX.push_preamble!(pgfx_plot.the_plot, """\\pgfplotsset{ + colormap={plots$(sp.attr[:subplot_index])}{$(pgfx_colormap(series.plotattributes[col]))}, + }""") + push!(axis_opt, + "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 push!(axis_opt, "colorbar style" => PGFPlotsX.Options( "title" => sp[:colorbar_title], @@ -101,11 +130,13 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) opt = series.plotattributes st = series[:seriestype] series_opt = PGFPlotsX.Options( - "color" => opt[:linecolor], + "color" => single_color(opt[:linecolor]), ) # function args args = if st == :contour opt[:x], opt[:y], opt[:z].surf' + elseif st == :heatmap + surface_to_vecs(opt[:x], opt[:y], opt[:z]) elseif is3d(st) opt[:x], opt[:y], opt[:z] elseif st == :straightline @@ -153,8 +184,21 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) PGFPlotsX.Table(Contour.contours(args..., opt[:levels])) ) push!(axis, surface_plot) - elseif st == :histogram2d - hist_ + elseif st == :heatmap + # TODO: global view setting + push!(axis.options, + "view" => "{0}{90}", + "shader" => "flat corner", + ) + heatmap_opt = PGFPlotsX.Options( + "surf" => nothing, + "mesh/rows" => length(opt[:x]) + ) + heatmap_plot = PGFPlotsX.Plot3( + merge(series_opt, heatmap_opt), + PGFPlotsX.Table(args) + ) + push!(axis, heatmap_plot) else # treat segments segments = iter_segments(series) @@ -273,6 +317,11 @@ function pgfx_colormap(grad::ColorGradient) @sprintf("rgb=(%.8f,%.8f,%.8f)", red(c), green(c), blue(c)) end,"\n") end +function pgfx_colormap(grad::Vector{<:Colorant}) + join(map(grad) do c + @sprintf("rgb=(%.8f,%.8f,%.8f)", red(c), green(c), blue(c)) + end,"\n") +end function pgfx_framestyle(style::Symbol) if style in _pgfx_framestyles diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 3d96360d..aa21ef71 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -74,7 +74,20 @@ end end # testset @testset "Histogram 2D" begin histogram2d(randn(10000), randn(10000), nbins=20) - # TODO: totally broken, errors also for pgfplots + # TODO: should work, when heatmaps works? + end # testset + @testset "Heatmap" begin + xs = [string("x", i) for i = 1:10] + ys = [string("y", i) for i = 1:4] + z = float((1:4) * reshape(1:10, 1, :)) + pgfx_plot = heatmap(xs, ys, z, aspect_ratio=1) + Plots._update_plot_object(pgfx_plot) + if @test_nowarn(haskey(Plots.pgfx_axes(pgfx_plot.o)[1].options.dict, "colorbar") == true) + @test Plots.pgfx_axes(pgfx_plot.o)[1]["colorbar"] === nothing + @test Plots.pgfx_axes(pgfx_plot.o)[1]["colormap name"] == "plots1" + end + # TODO: wrong colors + # TODO: lines instead of patches end # testset @testset "Contours" begin x = 1:0.5:20 From d6bd10a937afbcfecc352391f988eea60e2bc53a Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 22:28:36 +0100 Subject: [PATCH 260/357] 3D view --- src/backends/pgfplotsx.jl | 4 ++++ test/test_pgfplotsx.jl | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 81cabf23..e2c08795 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -115,6 +115,10 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) "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 # TODO: this errors for some reason # push!(axis_opt, "xmin" => 90) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index aa21ef71..125ee529 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -86,8 +86,6 @@ end @test Plots.pgfx_axes(pgfx_plot.o)[1]["colorbar"] === nothing @test Plots.pgfx_axes(pgfx_plot.o)[1]["colormap name"] == "plots1" end - # TODO: wrong colors - # TODO: lines instead of patches end # testset @testset "Contours" begin x = 1:0.5:20 From 311ace523dd4db5a725e8b748d793d4b2a6237a7 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Thu, 21 Nov 2019 22:34:14 +0100 Subject: [PATCH 261/357] fix gradient scatter plot --- src/backends/pgfplotsx.jl | 2 +- test/test_pgfplotsx.jl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index e2c08795..560b559a 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -364,7 +364,7 @@ end function pgfx_linestyle(plotattributes, i = 1) lw = pgfx_thickness_scaling(plotattributes) * get_linewidth(plotattributes, i) - lc = get_linecolor(plotattributes, i) + lc = single_color(get_linecolor(plotattributes, i)) la = get_linealpha(plotattributes, i) ls = get_linestyle(plotattributes, i) return pgfx_linestyle(lw, lc, la, ls) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 125ee529..a2a96681 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -111,6 +111,6 @@ end x + y end), color=:bluesreds, legend=false) plot(p1, p2) - # TODO: handle gradients as color + # TODO: questionable tiling end # testset end # testset From 6d737dea7b4b983575a1b02a9af8e4fcfc2474ad Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 22 Nov 2019 00:23:47 +0100 Subject: [PATCH 262/357] quiver plots --- src/backends/pgfplotsx.jl | 44 ++++++++++++++++++++++++++++++++++++--- test/test_pgfplotsx.jl | 12 +++++++++++ 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 560b559a..616c2756 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -5,6 +5,11 @@ Base.@kwdef mutable struct PGFPlotsXPlot is_created::Bool = false was_shown::Bool = false the_plot::PGFPlotsX.TikzDocument = PGFPlotsX.TikzDocument() + function PGFPlotsXPlot(is_created, was_shown, the_plot) + pgfx_plot = new(is_created, was_shown, the_plot) + PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usetikzlibrary{arrows.meta}") + pgfx_plot + end end pgfx_axes(pgfx_plot::PGFPlotsXPlot) = pgfx_plot.the_plot.elements[1].elements[1].contents @@ -214,9 +219,21 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) if st == :shape || series[:fillrange] !== nothing segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) end + x, y = collect(seg_args) + coordinates = if opt[:quiver] !== nothing + push!(segment_opt, "quiver" => PGFPlotsX.Options( + "u" => "\\thisrow{u}", + "v" => "\\thisrow{v}", + pgfx_arrow(opt[:arrow]) => nothing + ), + ) + PGFPlotsX.Table([:x => x, :y => y, :u => opt[:quiver][1], :v => opt[:quiver][2]]) + else + PGFPlotsX.Coordinates(seg_args...) + end segment_plot = series_func( merge(series_opt, segment_opt), - PGFPlotsX.Coordinates(seg_args...), + coordinates, series[:fillrange] !== nothing ? "\\closedcycle" : "{}" ) push!(axis, segment_plot) @@ -255,7 +272,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end ## - const _pgfplotsx_linestyles = KW( :solid => "solid", :dash => "dashed", @@ -316,6 +332,27 @@ const _pgfx_annotation_halign = KW( ## -------------------------------------------------------------------------------------- # Generates a colormap for pgfplots based on a ColorGradient # TODO: maybe obsolete +pgfx_arrow(::Nothing) = "-" +function pgfx_arrow( arr::Arrow ) + components = String[] + head = String[] + push!(head, "{stealth[length = $(arr.headlength)pt, width = $(arr.headwidth)pt") + if arr.style == :open + push!(head, ", open") + end + push!(head, "]}") + head = join(head, "") + if arr.side == :both || arr.side == :tail + push!( components, head ) + end + push!(components, "-") + if arr.side == :both || arr.side == :head + push!( components, head ) + end + components = join( components, "" ) + return "every arrow/.append style={$(components)}" +end + function pgfx_colormap(grad::ColorGradient) join(map(grad.colors) do c @sprintf("rgb=(%.8f,%.8f,%.8f)", red(c), green(c), blue(c)) @@ -561,7 +598,8 @@ end # to fit ticks, tick labels, guides, colorbars, etc. function _update_min_padding!(sp::Subplot{PGFPlotsXBackend}) # TODO: make padding more intelligent - sp.minpad = (20mm, 5mm, 2mm, 10mm) + # order: right, top, left, bottom + sp.minpad = (20mm, 12mm, 2mm, 10mm) end function _create_backend_figure(plt::Plot{PGFPlotsXBackend}) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index a2a96681..35a1b05f 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -113,4 +113,16 @@ end plot(p1, p2) # TODO: questionable tiling end # testset + @testset "Framestyles" begin + scatter(fill(randn(10), 6), fill(randn(10), 6), framestyle=[:box :semi :origin :zerolines :grid :none], title=[":box" ":semi" ":origin" ":zerolines" ":grid" ":none"], color=permutedims(1:6), layout=6, label="", markerstrokewidth=0, ticks=-2:2) + # TODO: support :semi + end # testset + @testset "Quiver" begin + x = -2pi:0.2:2*pi + y = sin.(x) + + u = ones(length(x)) + v = cos.(x) + plot( x, y, quiver = (u, v), arrow = true ) + end # testset end # testset From ced201700ef90fb012b2843ce72c67b0823480bb Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 22 Nov 2019 00:45:14 +0100 Subject: [PATCH 263/357] extra styles for 3dTypes --- src/backends.jl | 13 ++++++------- src/backends/pgfplotsx.jl | 6 +++++- test/test_pgfplotsx.jl | 1 + 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/backends.jl b/src/backends.jl index 87f4dda8..1d4b3482 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -705,13 +705,12 @@ const _pgfplotsx_attr = merge_with_base_supported([ :camera, :contour_labels, ]) -# const _pgfplotsx_seriestype = [ -# :path, :scatter, :straightline, -# :heatmap, :pie, :image, -# :contour, :path3d, :scatter3d, :surface, :wireframe, :volume, -# :shape -# ] -const _pgfplotsx_seriestype = [:path, :path3d, :scatter, :steppre, :heatmap, :stepmid, :steppost, :histogram2d, :ysticks, :xsticks, :contour, :shape, :straightline,] +const _pgfplotsx_seriestype = + [:path, :scatter, :straightline, + :path3d, :scatter3d, :surface, :wireframe, :volume, + :heatmap, :contour, :histogram2d, + :shape, + :steppre, :stepmid, :steppost, :ysticks, :xsticks] const _pgfplotsx_style = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] const _pgfplotsx_marker = [:none, :auto, :circle, :rect, :diamond, :utriangle, :dtriangle, :ltriangle, :rtriangle, :cross, :xcross, :star5, :pentagon, :hline, :vline, Shape] const _pgfplotsx_scale = [:identity, :ln, :log2, :log10] diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 616c2756..af67917b 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -316,7 +316,11 @@ const _pgfx_series_extrastyle = KW( :ysticks => "ycomb", :xsticks => "xcomb", :scatter => "only marks", - :shape => "area legends" + :shape => "area legends", + :scatter3D => "only marks" + :surface => "surf", + :wireframe => "mesh", + :volume => "patch" ) const _pgfx_framestyles = [:box, :axes, :origin, :zerolines, :grid, :none] diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 35a1b05f..5af30606 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -124,5 +124,6 @@ end u = ones(length(x)) v = cos.(x) plot( x, y, quiver = (u, v), arrow = true ) + # TODO: could adjust limits to fit arrows if too long, but how? end # testset end # testset From b2852802db417340b7057db6b41d8b542818cb8c Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 22 Nov 2019 00:54:16 +0100 Subject: [PATCH 264/357] fix arrow = false --- 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 af67917b..f97f6e4a 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -336,7 +336,7 @@ const _pgfx_annotation_halign = KW( ## -------------------------------------------------------------------------------------- # Generates a colormap for pgfplots based on a ColorGradient # TODO: maybe obsolete -pgfx_arrow(::Nothing) = "-" +pgfx_arrow(::Nothing) = "every arrow/.append style={-}" function pgfx_arrow( arr::Arrow ) components = String[] head = String[] From b9b69158558148475ebfdd9e1f79b60bcea6346f Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 22 Nov 2019 00:58:03 +0100 Subject: [PATCH 265/357] add patchlibrary --- src/backends/pgfplotsx.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index f97f6e4a..90d97d35 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -8,6 +8,7 @@ Base.@kwdef mutable struct PGFPlotsXPlot function PGFPlotsXPlot(is_created, was_shown, the_plot) pgfx_plot = new(is_created, was_shown, the_plot) PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usetikzlibrary{arrows.meta}") + PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usepgfplotslibrary{patchplots}") pgfx_plot end end From 42e88225c5791163a38787a2bf4740474c565b98 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 22 Nov 2019 13:50:18 +0100 Subject: [PATCH 266/357] restructure --- src/backends/pgfplotsx.jl | 232 ++++++++++++++++++++++---------------- test/test_pgfplotsx.jl | 6 + 2 files changed, 138 insertions(+), 100 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 90d97d35..17129cbd 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -142,24 +142,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) series_opt = PGFPlotsX.Options( "color" => single_color(opt[:linecolor]), ) - # function args - args = if st == :contour - opt[:x], opt[:y], opt[:z].surf' - elseif st == :heatmap - surface_to_vecs(opt[:x], opt[:y], opt[:z]) - elseif is3d(st) - opt[:x], opt[:y], opt[:z] - elseif st == :straightline - straightline_data(series) - elseif st == :shape - shape_data(series) - elseif ispolar(sp) - theta, r = opt[:x], opt[:y] - rad2deg.(theta), r - else - opt[:x], opt[:y] - end - if is3d(series) + if is3d(series) || st == :heatmap series_func = PGFPlotsX.Plot3 else series_func = PGFPlotsX.Plot @@ -168,82 +151,56 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) series_opt = merge(series_opt, pgfx_fillstyle(opt)) push!(series_opt, "area legend" => nothing) end - # include additional style - if haskey(_pgfx_series_extrastyle, st) - push!(series_opt, _pgfx_series_extrastyle[st] => nothing) - end - if st == :contour - if !isfilledcontour(series) - surface_opt = PGFPlotsX.Options( - "contour prepared" => PGFPlotsX.Options( - "labels" => opt[:contour_labels], - ) - ) - else - notimpl() - surface_opt = PGFPlotsX.Options( - "contour filled" => PGFPlotsX.Options( - # "levels" => opt[:levels], - # "labels" => opt[:contour_labels], - ) - ) - end - surface_plot = series_func( - # merge(series_opt, surface_opt), - surface_opt, - PGFPlotsX.Table(Contour.contours(args..., opt[:levels])) - ) - push!(axis, surface_plot) - elseif st == :heatmap - # TODO: global view setting + if st == :heatmap push!(axis.options, "view" => "{0}{90}", "shader" => "flat corner", ) - heatmap_opt = PGFPlotsX.Options( - "surf" => nothing, - "mesh/rows" => length(opt[:x]) - ) - heatmap_plot = PGFPlotsX.Plot3( - merge(series_opt, heatmap_opt), - PGFPlotsX.Table(args) - ) - push!(axis, heatmap_plot) - else - # treat segments - segments = iter_segments(series) - segment_opt = PGFPlotsX.Options() - for (i, rng) in enumerate(segments) - seg_args = (arg[rng] for arg in args) - segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) + end + # treat segments + segments = if iscontour(series) || st == :heatmap + iter_segments(series[:x], series[:y]) + else + iter_segments(series) + end + segment_opt = PGFPlotsX.Options() + for (i, rng) in enumerate(segments) + segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) + if !iscontour(series) && !(st == :heatmap) segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) - if st == :shape || series[:fillrange] !== nothing - segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) - end - x, y = collect(seg_args) - coordinates = if opt[:quiver] !== nothing - push!(segment_opt, "quiver" => PGFPlotsX.Options( - "u" => "\\thisrow{u}", - "v" => "\\thisrow{v}", - pgfx_arrow(opt[:arrow]) => nothing - ), - ) - PGFPlotsX.Table([:x => x, :y => y, :u => opt[:quiver][1], :v => opt[:quiver][2]]) - else - PGFPlotsX.Coordinates(seg_args...) - end - segment_plot = series_func( - merge(series_opt, segment_opt), - coordinates, - series[:fillrange] !== nothing ? "\\closedcycle" : "{}" + end + if st == :shape || series[:fillrange] !== nothing + segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) + end + if iscontour(series) + if !isfilledcontour(series) + push!(series_opt, + "contour prepared" => PGFPlotsX.Options( + "labels" => opt[:contour_labels], + ) ) - push!(axis, segment_plot) - # add to legend? - if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) - push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) + else + notimpl() + push!(series_opt, + "contour filled" => PGFPlotsX.Options( + # "levels" => opt[:levels], + # "labels" => opt[:contour_labels], + ) ) end end + coordinates = pgfx_series_coordinates!( sp, st, segment_opt, opt, rng ) + segment_plot = series_func( + merge(series_opt, segment_opt), + coordinates, + series[:fillrange] !== nothing ? "\\closedcycle" : "{}" + ) + push!(axis, segment_plot) + # add to legend? + if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) + push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) + ) + end # add series annotations anns = series[:series_annotations] for (xi,yi,str,fnt) in EachAnn(anns, series[:x], series[:y]) @@ -271,6 +228,96 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) pgfx_plot.is_created = true end end +## seriestype specifics +@inline function pgfx_series_coordinates!(sp, st, segment_opt, opt, rng) + # function args + args = if st == :contour + opt[:x], opt[:y], opt[:z].surf' + elseif st == :heatmap + surface_to_vecs(opt[:x], opt[:y], opt[:z]) + elseif is3d(st) + opt[:x], opt[:y], opt[:z] + elseif st == :straightline + straightline_data(series) + elseif st == :shape + shape_data(series) + elseif ispolar(sp) + theta, r = opt[:x], opt[:y] + rad2deg.(theta), r + else + opt[:x], opt[:y] + end + seg_args = if st == :contour || st == :heatmap + args + else + (arg[rng] for arg in args) + end + if opt[:quiver] !== nothing + push!(segment_opt, "quiver" => PGFPlotsX.Options( + "u" => "\\thisrow{u}", + "v" => "\\thisrow{v}", + pgfx_arrow(opt[:arrow]) => nothing + ), + ) + x, y = collect(seg_args) + return PGFPlotsX.Table([:x => x, :y => y, :u => opt[:quiver][1], :v => opt[:quiver][2]]) + else + pgfx_series_coordinates!(Val(st), segment_opt, opt, seg_args) + end +end +function pgfx_series_coordinates!(st_val::Union{Val{:path}, Val{:path3d}}, segment_opt, opt, args) + return PGFPlotsX.Coordinates(args...) +end +function pgfx_series_coordinates!(st_val::Union{Val{:scatter}, Val{:scatter3d}}, segment_opt, opt, args) + push!( segment_opt, "only marks" => nothing ) + return PGFPlotsX.Coordinates(args...) +end +function pgfx_series_coordinates!(st_val::Val{:heatmap}, segment_opt, opt, args) + push!(segment_opt, + "surf" => nothing, + "mesh/rows" => length(opt[:x]) + ) + return PGFPlotsX.Table(args...) +end +function pgfx_series_coordinates!(st_val::Val{:stepre}, segment_opt, opt, args) + push!( segment_opt, "const plot mark right" => nothing ) + return PGFPlotsX.Coordinates(args...) +end +function pgfx_series_coordinates!(st_val::Val{:stepmid}, segment_opt, opt, args) + push!( segment_opt, "const plot mark mid" => nothing ) + return PGFPlotsX.Coordinates(args...) +end +function pgfx_series_coordinates!(st_val::Val{:steppost}, segment_opt, opt, args) + push!( segment_opt, "const plot" => nothing ) + return PGFPlotsX.Coordinates(args...) +end +function pgfx_series_coordinates!(st_val::Union{Val{:ysticks},Val{:sticks}}, segment_opt, opt, args) + push!( segment_opt, "ycomb" => nothing ) + return PGFPlotsX.Coordinates(args...) +end +function pgfx_series_coordinates!(st_val::Val{:xsticks}, segment_opt, opt, args) + push!( segment_opt, "xcomb" => nothing ) + return PGFPlotsX.Coordinates(args...) +end +function pgfx_series_coordinates!(st_val::Val{:surface}, segment_opt, opt, args) + push!( segment_opt, "surf" => nothing ) + return PGFPlotsX.Coordinates(args...) +end +function pgfx_series_coordinates!(st_val::Val{:volume}, segment_opt, opt, args) + push!( segment_opt, "patch" => nothing ) + return PGFPlotsX.Coordinates(args...) +end +function pgfx_series_coordinates!(st_val::Val{:wireframe}, segment_opt, opt, args) + push!( segment_opt, "mesh" => nothing ) + return PGFPlotsX.Coordinates(args...) +end +function pgfx_series_coordinates!(st_val::Val{:shape}, segment_opt, opt, args) + push!( segment_opt, "area legends" => nothing, "patch" => nothing ) + return PGFPlotsX.Coordinates(args...) +end +function pgfx_series_coordinates!(st_val::Val{:contour}, segment_opt, opt, args) + return PGFPlotsX.Table(Contour.contours(args..., opt[:levels])) +end ## const _pgfplotsx_linestyles = KW( @@ -309,21 +356,6 @@ const _pgfplotsx_legend_pos = KW( :outertopright => "outer north east", ) -const _pgfx_series_extrastyle = KW( - :steppre => "const plot mark right", - :stepmid => "const plot mark mid", - :steppost => "const plot", - :sticks => "ycomb", - :ysticks => "ycomb", - :xsticks => "xcomb", - :scatter => "only marks", - :shape => "area legends", - :scatter3D => "only marks" - :surface => "surf", - :wireframe => "mesh", - :volume => "patch" -) - const _pgfx_framestyles = [:box, :axes, :origin, :zerolines, :grid, :none] const _pgfx_framestyle_defaults = Dict(:semi => :box) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 5af30606..b8f6b146 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -126,4 +126,10 @@ end plot( x, y, quiver = (u, v), arrow = true ) # TODO: could adjust limits to fit arrows if too long, but how? end # testset + @testset "Annotations" begin + y = rand(10) + plot(y, annotations=(3, y[3], Plots.text("this is \\#3", :left)), leg=false) + annotate!([(5, y[5], Plots.text("this is \\#5", 16, :red, :center)), (10, y[10], Plots.text("this is \\#10", :right, 20, "courier"))]) + scatter!(range(2, stop=8, length=6), rand(6), marker=(50, 0.2, :orange), series_annotations=["series", "annotations", "map", "to", "series", Plots.text("data", :green)]) + end # testset end # testset From c39a6d8ec32117f8d1a2b32d8e999aa8ec1a72b2 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 22 Nov 2019 14:05:34 +0100 Subject: [PATCH 267/357] surface plots --- src/backends/pgfplotsx.jl | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 17129cbd..ecf0833a 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -166,7 +166,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) segment_opt = PGFPlotsX.Options() for (i, rng) in enumerate(segments) segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) - if !iscontour(series) && !(st == :heatmap) + if opt[:markershape] != :none #|| !iscontour(series) && !(st == :heatmap) segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) end if st == :shape || series[:fillrange] !== nothing @@ -233,7 +233,10 @@ end # function args args = if st == :contour opt[:x], opt[:y], opt[:z].surf' - elseif st == :heatmap + elseif st == :heatmap || st == :surface + @show opt[:x] + @show opt[:y] + @show opt[:z] surface_to_vecs(opt[:x], opt[:y], opt[:z]) elseif is3d(st) opt[:x], opt[:y], opt[:z] @@ -300,7 +303,9 @@ function pgfx_series_coordinates!(st_val::Val{:xsticks}, segment_opt, opt, args) return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Val{:surface}, segment_opt, opt, args) - push!( segment_opt, "surf" => nothing ) + push!( segment_opt, "surf" => nothing, + "mesh/rows" => length(opt[:x]) + ) return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Val{:volume}, segment_opt, opt, args) From 195c6d601c546f20cdd3dd9080575d13aabdb701 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 22 Nov 2019 14:08:45 +0100 Subject: [PATCH 268/357] wireframes --- src/backends/pgfplotsx.jl | 9 ++++----- test/test_pgfplotsx.jl | 5 ++++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index ecf0833a..c2b1ef51 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -233,10 +233,7 @@ end # function args args = if st == :contour opt[:x], opt[:y], opt[:z].surf' - elseif st == :heatmap || st == :surface - @show opt[:x] - @show opt[:y] - @show opt[:z] + elseif st in (:heatmap, :surface, :wireframe) surface_to_vecs(opt[:x], opt[:y], opt[:z]) elseif is3d(st) opt[:x], opt[:y], opt[:z] @@ -313,7 +310,9 @@ function pgfx_series_coordinates!(st_val::Val{:volume}, segment_opt, opt, args) return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Val{:wireframe}, segment_opt, opt, args) - push!( segment_opt, "mesh" => nothing ) + push!( segment_opt, "mesh" => nothing, + "mesh/rows" => length(opt[:x]) + ) return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Val{:shape}, segment_opt, opt, args) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index b8f6b146..70f51a72 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -76,7 +76,7 @@ end histogram2d(randn(10000), randn(10000), nbins=20) # TODO: should work, when heatmaps works? end # testset - @testset "Heatmap" begin + @testset "Heatmap-like" begin xs = [string("x", i) for i = 1:10] ys = [string("y", i) for i = 1:4] z = float((1:4) * reshape(1:10, 1, :)) @@ -86,6 +86,9 @@ end @test Plots.pgfx_axes(pgfx_plot.o)[1]["colorbar"] === nothing @test Plots.pgfx_axes(pgfx_plot.o)[1]["colormap name"] == "plots1" end + + pgfx_plot = wireframe(xs, ys, z, aspect_ratio=1) + # TODO: clims are wrong end # testset @testset "Contours" begin x = 1:0.5:20 From 607640ce73210d167ea3e84c41e4cdac3be629e0 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 22 Nov 2019 14:11:43 +0100 Subject: [PATCH 269/357] straightline --- 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 c2b1ef51..f9b9c9a9 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -265,7 +265,7 @@ end pgfx_series_coordinates!(Val(st), segment_opt, opt, seg_args) end end -function pgfx_series_coordinates!(st_val::Union{Val{:path}, Val{:path3d}}, segment_opt, opt, args) +function pgfx_series_coordinates!(st_val::Union{Val{:path}, Val{:path3d}, Val{:straightline}}, segment_opt, opt, args) return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Union{Val{:scatter}, Val{:scatter3d}}, segment_opt, opt, args) From 2bbaf9d50401a3ffd0f0b2195591fa7a8b7c3879 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Sat, 23 Nov 2019 20:10:08 +0100 Subject: [PATCH 270/357] free shapes --- src/backends/pgfplotsx.jl | 77 ++++++++++++++++++++++++--------------- 1 file changed, 48 insertions(+), 29 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index f9b9c9a9..e3441d0b 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -89,31 +89,31 @@ 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 - PGFPlotsX.push_preamble!(pgfx_plot.the_plot, """\\pgfplotsset{ - colormap={plots$(sp.attr[:subplot_index])}{$(pgfx_colormap(series.plotattributes[col]))}, - }""") - push!(axis_opt, - "colorbar" => nothing, - "colormap name" => "plots$(sp.attr[:subplot_index])", - ) - # goto is needed to break out of col and series for - @goto colorbar_end - end + # 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]))}, + }""") + push!(axis_opt, + "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 - @label colorbar_end + end + @label colorbar_end push!(axis_opt, "colorbar style" => PGFPlotsX.Options( "title" => sp[:colorbar_title], @@ -158,8 +158,8 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) ) end # treat segments - segments = if iscontour(series) || st == :heatmap - iter_segments(series[:x], series[:y]) + segments = if st in (:wireframe, :heatmap, :contour, :surface) + iter_segments(surface_to_vecs(series[:x], series[:y], series[:z])...) else iter_segments(series) end @@ -167,6 +167,21 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) for (i, rng) in enumerate(segments) segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) if opt[:markershape] != :none #|| !iscontour(series) && !(st == :heatmap) + 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)], " -- ") + PGFPlotsX.push_preamble!(pgfx_plot.the_plot, + """ + \\pgfdeclareplotmark{PlotsShape}{ + \\draw $path; + } + """ + ) + end segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) end if st == :shape || series[:fillrange] !== nothing @@ -300,8 +315,11 @@ function pgfx_series_coordinates!(st_val::Val{:xsticks}, segment_opt, opt, args) return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Val{:surface}, segment_opt, opt, args) + @show collect(args)[3] |> length + @show args push!( segment_opt, "surf" => nothing, - "mesh/rows" => length(opt[:x]) + "mesh/rows" => length(opt[:x]), + "mesh/cols" => length(opt[:y]), ) return PGFPlotsX.Coordinates(args...) end @@ -316,7 +334,7 @@ function pgfx_series_coordinates!(st_val::Val{:wireframe}, segment_opt, opt, arg return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Val{:shape}, segment_opt, opt, args) - push!( segment_opt, "area legends" => nothing, "patch" => nothing ) + push!( segment_opt, "area legends" => nothing ) return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Val{:contour}, segment_opt, opt, args) @@ -459,9 +477,10 @@ function pgfx_marker(plotattributes, i = 1) a = alpha(cstr) cstr_stroke = plot_color(get_markerstrokecolor(plotattributes, i), get_markerstrokealpha(plotattributes, i)) a_stroke = alpha(cstr_stroke) + mark_size = pgfx_thickness_scaling(plotattributes) * 0.5 * _cycle(plotattributes[:markersize], i) return PGFPlotsX.Options( - "mark" => get(_pgfplotsx_markers, shape, "*"), - "mark size" => pgfx_thickness_scaling(plotattributes) * 0.5 * _cycle(plotattributes[:markersize], i), + "mark" => shape isa Shape ? "PlotsShape" : get(_pgfplotsx_markers, shape, "*"), + "mark size" => "$mark_size pt", "mark options" => PGFPlotsX.Options( "color" => cstr_stroke, "draw opacity" => a_stroke, From 6ba1607bb14b383b32abd909ce23016f18fe720e Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Sat, 23 Nov 2019 20:45:21 +0100 Subject: [PATCH 271/357] filled contour, histogram2d --- src/backends.jl | 2 +- src/backends/pgfplotsx.jl | 11 ----------- test/test_pgfplotsx.jl | 3 --- 3 files changed, 1 insertion(+), 15 deletions(-) diff --git a/src/backends.jl b/src/backends.jl index 1d4b3482..9bf596fd 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -707,7 +707,7 @@ const _pgfplotsx_attr = merge_with_base_supported([ ]) const _pgfplotsx_seriestype = [:path, :scatter, :straightline, - :path3d, :scatter3d, :surface, :wireframe, :volume, + :path3d, :scatter3d, :surface, :wireframe, :heatmap, :contour, :histogram2d, :shape, :steppre, :stepmid, :steppost, :ysticks, :xsticks] diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index e3441d0b..c7a3889b 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -37,7 +37,6 @@ function Base.push!(pgfx_plot::PGFPlotsXPlot, item) end function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) - # TODO: annotations! does not trigger _series_added ... if !pgfx_plot.is_created cols, rows = size(plt.layout.grid) the_plot = PGFPlotsX.TikzPicture() @@ -126,7 +125,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) push!( axis_opt, "view" => (azim, elev) ) end axisf = if sp[:projection] == :polar - # TODO: this errors for some reason # push!(axis_opt, "xmin" => 90) # push!(axis_opt, "xmax" => 450) PGFPlotsX.PolarAxis @@ -194,14 +192,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) "labels" => opt[:contour_labels], ) ) - else - notimpl() - push!(series_opt, - "contour filled" => PGFPlotsX.Options( - # "levels" => opt[:levels], - # "labels" => opt[:contour_labels], - ) - ) end end coordinates = pgfx_series_coordinates!( sp, st, segment_opt, opt, rng ) @@ -390,7 +380,6 @@ const _pgfx_annotation_halign = KW( ) ## -------------------------------------------------------------------------------------- # Generates a colormap for pgfplots based on a ColorGradient -# TODO: maybe obsolete pgfx_arrow(::Nothing) = "every arrow/.append style={-}" function pgfx_arrow( arr::Arrow ) components = String[] diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 70f51a72..4192e354 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -70,11 +70,9 @@ end x = 0.1:0.2:0.9 y = 0.7 * rand(5) .+ 0.15 plot(x, y, line=(3, :dash, :lightblue), marker=(Shape(verts), 30, RGBA(0, 0, 0, 0.2)), bg=:pink, fg=:darkblue, xlim=(0, 1), ylim=(0, 1), leg=false) - # TODO: draw those polygons end # testset @testset "Histogram 2D" begin histogram2d(randn(10000), randn(10000), nbins=20) - # TODO: should work, when heatmaps works? end # testset @testset "Heatmap-like" begin xs = [string("x", i) for i = 1:10] @@ -102,7 +100,6 @@ end p2 = contour(x, y, Z) p1 = contour(x, y, f, fill=true) plot(p1, p2) - # TODO: filled contours end # testset @testset "Varying colors" begin t = range(0, stop=1, length=100) From 95a29f9cbe664d7634e7ec4477aca573da9b81c4 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Sun, 24 Nov 2019 16:46:20 +0100 Subject: [PATCH 272/357] filled contour (really) --- src/backends.jl | 4 +- src/backends/pgfplotsx.jl | 85 ++++++++++++++++++++++++++------------- test/test_pgfplotsx.jl | 1 + 3 files changed, 59 insertions(+), 31 deletions(-) diff --git a/src/backends.jl b/src/backends.jl index 9bf596fd..623a057c 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -707,8 +707,8 @@ const _pgfplotsx_attr = merge_with_base_supported([ ]) const _pgfplotsx_seriestype = [:path, :scatter, :straightline, - :path3d, :scatter3d, :surface, :wireframe, - :heatmap, :contour, :histogram2d, + :path3d, :scatter3d, :surface, :wireframe, + :heatmap, :contour, :contour3d, :histogram2d, :shape, :steppre, :stepmid, :steppost, :ysticks, :xsticks] const _pgfplotsx_style = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index c7a3889b..c6efba0e 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,5 +1,4 @@ using Contour: Contour -using StatsBase: Histogram, fit # PGFPlotsX.print_tex(io::IO, data::ColorGradient) = write(io, pgfx_colormap(data)) Base.@kwdef mutable struct PGFPlotsXPlot is_created::Bool = false @@ -140,13 +139,18 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) series_opt = PGFPlotsX.Options( "color" => single_color(opt[:linecolor]), ) - if is3d(series) || st == :heatmap + if is3d(series) || st == :heatmap #|| isfilledcontour(series) series_func = PGFPlotsX.Plot3 else series_func = PGFPlotsX.Plot end - if series[:fillrange] !== nothing && st != :contour - series_opt = merge(series_opt, pgfx_fillstyle(opt)) + if isfilledcontour(series) + # push!(series_opt, "contour filled" => nothing) + # st = :surface + # axis_opt["view"] = (0, 90) + # push!(series_opt, "shader" => "interp") + end + if series[:fillrange] !== nothing && !isfilledcontour(series) push!(series_opt, "area legend" => nothing) end if st == :heatmap @@ -156,7 +160,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) ) end # treat segments - segments = if st in (:wireframe, :heatmap, :contour, :surface) + segments = if st in (:wireframe, :heatmap, :contour, :surface, :contour3d) iter_segments(surface_to_vecs(series[:x], series[:y], series[:z])...) else iter_segments(series) @@ -164,7 +168,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) segment_opt = PGFPlotsX.Options() for (i, rng) in enumerate(segments) segment_opt = merge( segment_opt, pgfx_linestyle(opt, i) ) - if opt[:markershape] != :none #|| !iscontour(series) && !(st == :heatmap) + if opt[:markershape] != :none marker = opt[:markershape] if marker isa Shape x = marker.x @@ -182,23 +186,17 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) end - if st == :shape || series[:fillrange] !== nothing + if st == :shape || + (series[:fillrange] !== nothing && !isfilledcontour(series)) segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) end - if iscontour(series) - if !isfilledcontour(series) - push!(series_opt, - "contour prepared" => PGFPlotsX.Options( - "labels" => opt[:contour_labels], - ) - ) - end - end - coordinates = pgfx_series_coordinates!( sp, st, segment_opt, opt, rng ) + coordinates = pgfx_series_coordinates!( sp, + isfilledcontour(series) ? :filledcontour : st, + segment_opt, opt, rng ) segment_plot = series_func( merge(series_opt, segment_opt), coordinates, - series[:fillrange] !== nothing ? "\\closedcycle" : "{}" + (series[:fillrange] !== nothing && !isfilledcontour(series)) ? "\\closedcycle" : "{}" ) push!(axis, segment_plot) # add to legend? @@ -236,10 +234,10 @@ end ## seriestype specifics @inline function pgfx_series_coordinates!(sp, st, segment_opt, opt, rng) # function args - args = if st == :contour - opt[:x], opt[:y], opt[:z].surf' + args = if st in (:contour, :contour3d, :filledcontour) + opt[:x], opt[:y], Array(opt[:z])' elseif st in (:heatmap, :surface, :wireframe) - surface_to_vecs(opt[:x], opt[:y], opt[:z]) + surface_to_vecs(opt[:x], opt[:y], opt[:z]) elseif is3d(st) opt[:x], opt[:y], opt[:z] elseif st == :straightline @@ -252,7 +250,7 @@ end else opt[:x], opt[:y] end - seg_args = if st == :contour || st == :heatmap + seg_args = if st in (:contour, :contour3d, :heatmap, :filledcontour) args else (arg[rng] for arg in args) @@ -305,8 +303,6 @@ function pgfx_series_coordinates!(st_val::Val{:xsticks}, segment_opt, opt, args) return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Val{:surface}, segment_opt, opt, args) - @show collect(args)[3] |> length - @show args push!( segment_opt, "surf" => nothing, "mesh/rows" => length(opt[:x]), "mesh/cols" => length(opt[:y]), @@ -327,10 +323,42 @@ function pgfx_series_coordinates!(st_val::Val{:shape}, segment_opt, opt, args) push!( segment_opt, "area legends" => nothing ) return PGFPlotsX.Coordinates(args...) end -function pgfx_series_coordinates!(st_val::Val{:contour}, segment_opt, opt, args) +function pgfx_series_coordinates!(st_val::Union{Val{:contour}, Val{:contour3d}}, segment_opt, opt, args) + push!(segment_opt, + "contour prepared" => PGFPlotsX.Options( + "labels" => opt[:contour_labels], + ), + ) return PGFPlotsX.Table(Contour.contours(args..., opt[:levels])) end +function pgfx_series_coordinates!(st_val::Val{:filledcontour}, segment_opt, opt, args) + xs, ys, zs = collect(args) + push!(segment_opt, + "contour filled" => PGFPlotsX.Options( + "labels" => opt[:contour_labels], + ), + "point meta" => "explicit", + "shader" => "flat" + ) + if opt[:levels] isa Number + push!(segment_opt["contour filled"], + "number" => opt[:levels], + ) + elseif opt[:levels] isa AVec + push!(segment_opt["contour filled"], + "levels" => opt[:levels], + ) + end + cs = join([ + join(["($x, $y) [$(zs[j, i])]" for (j, x) in enumerate(xs)], " ") for (i, y) in enumerate(ys)], "\n\n" + ) + """ +coordinates { +$cs +}; + """ +end ## const _pgfplotsx_linestyles = KW( :solid => "solid", @@ -428,10 +456,9 @@ pgfx_thickness_scaling(series) = pgfx_thickness_scaling(series[:subplot]) function pgfx_fillstyle(plotattributes, i = 1) cstr = get_fillcolor(plotattributes, i) - a = alpha(cstr) - fa = get_fillalpha(plotattributes, i) - if fa !== nothing - a = fa + a = get_fillalpha(plotattributes, i) + if a === nothing + a = alpha(single_color(cstr)) end PGFPlotsX.Options("fill" => cstr, "fill opacity" => a) end diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 4192e354..f38b115b 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -100,6 +100,7 @@ end p2 = contour(x, y, Z) p1 = contour(x, y, f, fill=true) plot(p1, p2) + # TODO: colorbar for filled contours end # testset @testset "Varying colors" begin t = range(0, stop=1, length=100) From 35e24fef2a821d52af5467fbd26670539302ded8 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Sun, 24 Nov 2019 18:03:08 +0100 Subject: [PATCH 273/357] rely on recipe for histogram2d --- src/backends.jl | 2 +- src/backends/pgfplotsx.jl | 27 +++++++++++++-------------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/backends.jl b/src/backends.jl index 623a057c..9bcba334 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -708,7 +708,7 @@ const _pgfplotsx_attr = merge_with_base_supported([ const _pgfplotsx_seriestype = [:path, :scatter, :straightline, :path3d, :scatter3d, :surface, :wireframe, - :heatmap, :contour, :contour3d, :histogram2d, + :heatmap, :contour, :contour3d, :shape, :steppre, :stepmid, :steppost, :ysticks, :xsticks] const _pgfplotsx_style = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index c6efba0e..684253de 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,5 +1,4 @@ using Contour: Contour -# PGFPlotsX.print_tex(io::IO, data::ColorGradient) = write(io, pgfx_colormap(data)) Base.@kwdef mutable struct PGFPlotsXPlot is_created::Bool = false was_shown::Bool = false @@ -250,7 +249,8 @@ end else opt[:x], opt[:y] end - seg_args = if st in (:contour, :contour3d, :heatmap, :filledcontour) + seg_args = if st in (:contour, :contour3d, :filledcontour) + args else (arg[rng] for arg in args) @@ -278,10 +278,12 @@ end function pgfx_series_coordinates!(st_val::Val{:heatmap}, segment_opt, opt, args) push!(segment_opt, "surf" => nothing, - "mesh/rows" => length(opt[:x]) + "mesh/rows" => length(opt[:x]), + "mesh/cols" => length(opt[:y]) ) return PGFPlotsX.Table(args...) end + function pgfx_series_coordinates!(st_val::Val{:stepre}, segment_opt, opt, args) push!( segment_opt, "const plot mark right" => nothing ) return PGFPlotsX.Coordinates(args...) @@ -354,9 +356,9 @@ function pgfx_series_coordinates!(st_val::Val{:filledcontour}, segment_opt, opt, join(["($x, $y) [$(zs[j, i])]" for (j, x) in enumerate(xs)], " ") for (i, y) in enumerate(ys)], "\n\n" ) """ -coordinates { -$cs -}; + coordinates { + $cs + }; """ end ## @@ -590,14 +592,11 @@ function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) end # limits - # TODO: support zlims - if letter != :z - lims = ispolar(sp) && letter == :x ? rad2deg.(axis_limits(sp, :x)) : axis_limits(sp, letter) - push!( opt, - string(letter,:min) => lims[1], - string(letter,:max) => lims[2] - ) - end + lims = ispolar(sp) && letter == :x ? rad2deg.(axis_limits(sp, :x)) : axis_limits(sp, letter) + push!( opt, + string(letter,:min) => lims[1], + string(letter,:max) => lims[2] + ) if !(axis[:ticks] in (nothing, false, :none, :native)) && framestyle != :none ticks = get_ticks(sp, axis) From 92814e71c76b98c7d8e64c9824394b15a480162c Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Sun, 24 Nov 2019 18:04:13 +0100 Subject: [PATCH 274/357] fix steppre --- 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 684253de..4d2921da 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -284,7 +284,7 @@ function pgfx_series_coordinates!(st_val::Val{:heatmap}, segment_opt, opt, args) return PGFPlotsX.Table(args...) end -function pgfx_series_coordinates!(st_val::Val{:stepre}, segment_opt, opt, args) +function pgfx_series_coordinates!(st_val::Val{:steppre}, segment_opt, opt, args) push!( segment_opt, "const plot mark right" => nothing ) return PGFPlotsX.Coordinates(args...) end From 903fb84af06ecf8b3b72c152e8a34564caa77736 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Sun, 24 Nov 2019 18:10:34 +0100 Subject: [PATCH 275/357] fix bar --- src/backends/pgfplotsx.jl | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 4d2921da..373d9ca3 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -143,12 +143,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) else series_func = PGFPlotsX.Plot end - if isfilledcontour(series) - # push!(series_opt, "contour filled" => nothing) - # st = :surface - # axis_opt["view"] = (0, 90) - # push!(series_opt, "shader" => "interp") - end if series[:fillrange] !== nothing && !isfilledcontour(series) push!(series_opt, "area legend" => nothing) end @@ -189,9 +183,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) (series[:fillrange] !== nothing && !isfilledcontour(series)) segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) end - coordinates = pgfx_series_coordinates!( sp, - isfilledcontour(series) ? :filledcontour : st, - segment_opt, opt, rng ) + coordinates = pgfx_series_coordinates!( sp, series, segment_opt, opt, rng ) segment_plot = series_func( merge(series_opt, segment_opt), coordinates, @@ -231,9 +223,10 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end end ## seriestype specifics -@inline function pgfx_series_coordinates!(sp, st, segment_opt, opt, rng) +@inline function pgfx_series_coordinates!(sp, series, segment_opt, opt, rng) + st = series[:seriestype] # function args - args = if st in (:contour, :contour3d, :filledcontour) + args = if st in (:contour, :contour3d) opt[:x], opt[:y], Array(opt[:z])' elseif st in (:heatmap, :surface, :wireframe) surface_to_vecs(opt[:x], opt[:y], opt[:z]) @@ -249,8 +242,7 @@ end else opt[:x], opt[:y] end - seg_args = if st in (:contour, :contour3d, :filledcontour) - + seg_args = if st in (:contour, :contour3d) args else (arg[rng] for arg in args) @@ -265,6 +257,9 @@ end x, y = collect(seg_args) return PGFPlotsX.Table([:x => x, :y => y, :u => opt[:quiver][1], :v => opt[:quiver][2]]) else + if isfilledcontour(series) + st = :filledcontour + end pgfx_series_coordinates!(Val(st), segment_opt, opt, seg_args) end end @@ -322,7 +317,7 @@ function pgfx_series_coordinates!(st_val::Val{:wireframe}, segment_opt, opt, arg return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Val{:shape}, segment_opt, opt, args) - push!( segment_opt, "area legends" => nothing ) + # push!( segment_opt, "area legend" => nothing ) return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Union{Val{:contour}, Val{:contour3d}}, segment_opt, opt, args) From f11d5b1e635a2be59bb69dc775c5844073b44fd1 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Sun, 24 Nov 2019 18:11:52 +0100 Subject: [PATCH 276/357] fix bar2 --- 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 373d9ca3..2be8ec56 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -317,7 +317,7 @@ function pgfx_series_coordinates!(st_val::Val{:wireframe}, segment_opt, opt, arg return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Val{:shape}, segment_opt, opt, args) - # push!( segment_opt, "area legend" => nothing ) + push!( segment_opt, "area legend" => nothing ) return PGFPlotsX.Coordinates(args...) end function pgfx_series_coordinates!(st_val::Union{Val{:contour}, Val{:contour3d}}, segment_opt, opt, args) From 8636718c88871fd567b0a965d6f4e1c4259afda5 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Sun, 24 Nov 2019 18:18:10 +0100 Subject: [PATCH 277/357] fix display --- src/backends/pgfplotsx.jl | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 2be8ec56..27067035 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -26,6 +26,7 @@ function surface_to_vecs(x::AVec, y::AVec, s::Union{AMat, Surface}) return xn, yn, zn end +Base.display(pgfx_plot::PGFPlotsXPlot) = display(pgfx_plot.the_plot) function Base.show(io::IO, mime::MIME, pgfx_plot::PGFPlotsXPlot) show(io::IO, mime, pgfx_plot.the_plot) end @@ -705,8 +706,5 @@ function _show(io::IO, mime::MIME"application/x-tex", plt::Plot{PGFPlotsXBackend end function _display(plt::Plot{PGFPlotsXBackend}) - # fn = string(tempname(),".svg") - # PGFPlotsX.pgfsave(fn, plt.o) - # open_browser_window(fn) plt.o end From c034d7bf1bc197415c9bb393f38860f8f7ffd224 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Sun, 24 Nov 2019 19:12:31 +0100 Subject: [PATCH 278/357] filled custom marker --- src/backends/pgfplotsx.jl | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 27067035..8e21ebcb 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -133,7 +133,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) axis = axisf( axis_opt ) - for series in series_list(sp) + for (series_index, series) in enumerate(series_list(sp)) opt = series.plotattributes st = series[:seriestype] series_opt = PGFPlotsX.Options( @@ -170,10 +170,13 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) 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}{ - \\draw $path; + \\pgfdeclareplotmark{PlotsShape$(series_index)}{ + \\filldraw + $path; } """ ) @@ -493,7 +496,7 @@ function pgfx_marker(plotattributes, i = 1) a_stroke = alpha(cstr_stroke) mark_size = pgfx_thickness_scaling(plotattributes) * 0.5 * _cycle(plotattributes[:markersize], i) return PGFPlotsX.Options( - "mark" => shape isa Shape ? "PlotsShape" : get(_pgfplotsx_markers, shape, "*"), + "mark" => shape isa Shape ? "PlotsShape$i" : get(_pgfplotsx_markers, shape, "*"), "mark size" => "$mark_size pt", "mark options" => PGFPlotsX.Options( "color" => cstr_stroke, From 02b54e72a6ce5d720b6bbae7af63c340711c3a45 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Sun, 24 Nov 2019 19:18:45 +0100 Subject: [PATCH 279/357] increase right padding --- 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 8e21ebcb..54393377 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -673,7 +673,7 @@ end function _update_min_padding!(sp::Subplot{PGFPlotsXBackend}) # TODO: make padding more intelligent # order: right, top, left, bottom - sp.minpad = (20mm, 12mm, 2mm, 10mm) + sp.minpad = (22mm, 12mm, 2mm, 10mm) end function _create_backend_figure(plt::Plot{PGFPlotsXBackend}) From aaaedcab1ae42c772dd38c062ce694ee8b1e83de Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 25 Nov 2019 12:21:12 +0100 Subject: [PATCH 280/357] robust pgfx_axes --- src/backends/pgfplotsx.jl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 54393377..52fbe121 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -11,7 +11,11 @@ Base.@kwdef mutable struct PGFPlotsXPlot end end -pgfx_axes(pgfx_plot::PGFPlotsXPlot) = pgfx_plot.the_plot.elements[1].elements[1].contents +function pgfx_axes(pgfx_plot::PGFPlotsXPlot) + gp = pgfx_plot.the_plot.elements[1] + return gp isa PGFPlotsX.GroupPlot ? gp.elements[1].contents : gp +end + function surface_to_vecs(x::AVec, y::AVec, s::Union{AMat, Surface}) a = Array(s) From f53b070d79d295c42929ec3e2f174c10d7cbf81c Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 25 Nov 2019 12:38:54 +0100 Subject: [PATCH 281/357] add background_color_outside --- src/backends/pgfplotsx.jl | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 52fbe121..fd276505 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -5,7 +5,26 @@ Base.@kwdef mutable struct PGFPlotsXPlot the_plot::PGFPlotsX.TikzDocument = PGFPlotsX.TikzDocument() function PGFPlotsXPlot(is_created, was_shown, the_plot) pgfx_plot = new(is_created, was_shown, the_plot) + # tikz libraries PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usetikzlibrary{arrows.meta}") + PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usetikzlibrary{backgrounds}") + PGFPlotsX.push_preamble!(pgfx_plot.the_plot, + """ + \\pgfkeys{/tikz/.cd, + background color/.initial=white, + background color/.get=\\backcol, + background color/.store in=\\backcol, + } + \\tikzset{background rectangle/.style={ + fill=\\backcol, + }, + use background/.style={ + show background rectangle + } + } + """ + ) + # pgfplots libraries PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usepgfplotslibrary{patchplots}") pgfx_plot end @@ -41,8 +60,19 @@ end function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) if !pgfx_plot.is_created + the_plot = PGFPlotsX.TikzPicture(PGFPlotsX.Options()) cols, rows = size(plt.layout.grid) - the_plot = PGFPlotsX.TikzPicture() + bgc = plt.attr[:background_color_outside] + if bgc isa Colors.Colorant + cstr = plot_color(bgc) + a = alpha(cstr) + push!(the_plot.options, + "draw opacity" => a, + "background color" => cstr, + "use background" => nothing, + ) + end + # the combination of groupplot and polaraxis is broken in pgfplots if !any( sp -> ispolar(sp), plt.subplots ) pl_height, pl_width = plt.attr[:size] From acf4cb4e5b213f252de72adc29c90f6689e8b1f1 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 25 Nov 2019 14:18:25 +0100 Subject: [PATCH 282/357] add ribbons --- src/backends/pgfplotsx.jl | 266 ++++++++++++++++++++++---------------- 1 file changed, 156 insertions(+), 110 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index fd276505..47b9fa9a 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -26,6 +26,7 @@ Base.@kwdef mutable struct PGFPlotsXPlot ) # pgfplots libraries PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usepgfplotslibrary{patchplots}") + PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usepgfplotslibrary{fillbetween}") pgfx_plot end end @@ -147,116 +148,122 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) 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 #|| isfilledcontour(series) - series_func = PGFPlotsX.Plot3 - else - series_func = PGFPlotsX.Plot - end - if series[:fillrange] !== nothing && !isfilledcontour(series) - push!(series_opt, "area legend" => nothing) - end - if st == :heatmap - push!(axis.options, - "view" => "{0}{90}", - "shader" => "flat corner", - ) - 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 - segment_opt = PGFPlotsX.Options() - for (i, rng) in enumerate(segments) - 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 || - (series[:fillrange] !== nothing && !isfilledcontour(series)) - segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) - end - coordinates = pgfx_series_coordinates!( sp, series, segment_opt, opt, rng ) - segment_plot = series_func( - merge(series_opt, segment_opt), - coordinates, - (series[:fillrange] !== nothing && !isfilledcontour(series)) ? "\\closedcycle" : "{}" - ) - push!(axis, segment_plot) - # add to legend? - if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) - push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) - ) - 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) - 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)) + opt = series.plotattributes + st = series[:seriestype] + series_opt = PGFPlotsX.Options( + "color" => single_color(opt[:linecolor]), + ) + if is3d(series) || st == :heatmap #|| isfilledcontour(series) + series_func = PGFPlotsX.Plot3 + else + series_func = PGFPlotsX.Plot + end + if series[:fillrange] !== nothing && !isfilledcontour(series) + push!(series_opt, "area legend" => nothing) + end + if st == :heatmap + push!(axis.options, + "view" => "{0}{90}", + "shader" => "flat corner", + ) + 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 + segment_opt = PGFPlotsX.Options() + for (i, rng) in enumerate(segments) + 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 || + (series[:fillrange] !== nothing && !isfilledcontour(series)) && + series[:ribbon] === nothing + segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) + end + coordinates = pgfx_series_coordinates!( sp, series, segment_opt, opt, rng ) + segment_plot = series_func( + merge(series_opt, segment_opt), + coordinates, + (series[:fillrange] !== nothing && !isfilledcontour(series) && series[:ribbon] === nothing) ? "\\closedcycle" : "{}" + ) + 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) + push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) + ) + 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) + 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 pgfx_plot.is_created = true end end @@ -570,6 +577,45 @@ function pgfx_add_annotation!(o, x, y, val, thickness_scaling = 1) "{$(val.str).};" ]) end + +function pgfx_add_ribbons!( axis, series, segment_plot, series_func, series_index ) + ribbon = series[:ribbon] + opt = series.plotattributes + ribbon_n = length(opt[:y]) ÷ length(ribbon) + ribbon_y = repeat(ribbon, outer = ribbon_n) + # upper ribbon + ribbon_name_plus = "plots_rib_p$series_index" + ribbon_opt_plus = merge(segment_plot.options, PGFPlotsX.Options( + "name path" => ribbon_name_plus, + "color" => opt[:fillcolor], + "draw opacity" => opt[:fillalpha] + )) + coordinates_plus = PGFPlotsX.Coordinates(opt[:x], opt[:y] + ribbon_y) + ribbon_plot_plus = series_func( + ribbon_opt_plus, + coordinates_plus + ) + push!(axis, ribbon_plot_plus) + # lower ribbon + ribbon_name_minus = "plots_rib_m$series_index" + ribbon_opt_minus = merge(segment_plot.options, PGFPlotsX.Options( + "name path" => ribbon_name_minus, + "color" => opt[:fillcolor], + "draw opacity" => opt[:fillalpha] + )) + coordinates_plus = PGFPlotsX.Coordinates(opt[:x], opt[:y] - ribbon_y) + ribbon_plot_plus = series_func( + ribbon_opt_minus, + coordinates_plus + ) + push!(axis, ribbon_plot_plus) + # fill + push!(axis, series_func( + pgfx_fillstyle(opt, series_index), + "fill between [of=$(ribbon_name_plus) and $(ribbon_name_minus)]" + )) + return axis +end # -------------------------------------------------------------------------------------- function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) axis = sp[Symbol(letter,:axis)] From 3eafc67654d1222331650ceac83b475d0a6f633e Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 25 Nov 2019 14:37:48 +0100 Subject: [PATCH 283/357] fix scalar ribbons --- src/backends/pgfplotsx.jl | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 47b9fa9a..012b2dfd 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -579,10 +579,12 @@ function pgfx_add_annotation!(o, x, y, val, thickness_scaling = 1) end function pgfx_add_ribbons!( axis, series, segment_plot, series_func, series_index ) - ribbon = series[:ribbon] + ribbon_y = series[:ribbon] opt = series.plotattributes - ribbon_n = length(opt[:y]) ÷ length(ribbon) - ribbon_y = repeat(ribbon, outer = ribbon_n) + if ribbon_y isa AVec + ribbon_n = length(opt[:y]) ÷ length(ribbon) + ribbon_y = repeat(ribbon, outer = ribbon_n) + end # upper ribbon ribbon_name_plus = "plots_rib_p$series_index" ribbon_opt_plus = merge(segment_plot.options, PGFPlotsX.Options( @@ -590,7 +592,7 @@ function pgfx_add_ribbons!( axis, series, segment_plot, series_func, series_inde "color" => opt[:fillcolor], "draw opacity" => opt[:fillalpha] )) - coordinates_plus = PGFPlotsX.Coordinates(opt[:x], opt[:y] + ribbon_y) + coordinates_plus = PGFPlotsX.Coordinates(opt[:x], opt[:y] .+ ribbon_y) ribbon_plot_plus = series_func( ribbon_opt_plus, coordinates_plus @@ -603,7 +605,7 @@ function pgfx_add_ribbons!( axis, series, segment_plot, series_func, series_inde "color" => opt[:fillcolor], "draw opacity" => opt[:fillalpha] )) - coordinates_plus = PGFPlotsX.Coordinates(opt[:x], opt[:y] - ribbon_y) + coordinates_plus = PGFPlotsX.Coordinates(opt[:x], opt[:y] .- ribbon_y) ribbon_plot_plus = series_func( ribbon_opt_minus, coordinates_plus From 7b2be59b7b9be91fe5f619da57d78ccd8a46e675 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 25 Nov 2019 14:51:53 +0100 Subject: [PATCH 284/357] arbitrary legend position --- src/backends/pgfplotsx.jl | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 012b2dfd..09fc06bc 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -106,7 +106,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) "draw opacity" => title_a, "rotate" => sp[:titlefontrotation] ), - "legend pos" => get(_pgfplotsx_legend_pos, sp[:legend], "outer north east"), "legend style" => PGFPlotsX.Options( pgfx_linestyle(pgfx_thickness_scaling(sp), sp[:foreground_color_legend], 1.0, "solid") => nothing, "fill" => cstr, @@ -116,6 +115,14 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) "fill" => sp[:background_color_inside] ) ) + # legend position + if sp[:legend] isa Tuple + x, y = sp[:legend] + push!(axis_opt["legend style"], "at={($x, $y)}" ) + else + push!(axis_opt, "legend pos" => get(_pgfplotsx_legend_pos, sp[:legend], "outer north east"), + ) + end for letter in (:x, :y, :z) if letter != :z || is3d(sp) pgfx_axis!(axis_opt, sp, letter) From 5335159203f19a72827634d681b45631ced60550 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 25 Nov 2019 15:49:25 +0100 Subject: [PATCH 285/357] respect user margins --- src/backends/pgfplotsx.jl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 09fc06bc..66dfe4e5 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -762,7 +762,10 @@ end function _update_min_padding!(sp::Subplot{PGFPlotsXBackend}) # TODO: make padding more intelligent # order: right, top, left, bottom - sp.minpad = (22mm, 12mm, 2mm, 10mm) + sp.minpad = (22mm + sp[:right_margin], + 12mm + sp[:top_margin], + 2mm + sp[:left_margin], + 10mm + sp[:bottom_margin]) end function _create_backend_figure(plt::Plot{PGFPlotsXBackend}) From 3d735911784029174d706c1e1c426a497121902c Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 25 Nov 2019 17:44:25 +0100 Subject: [PATCH 286/357] respect standalone flag --- src/backends/pgfplotsx.jl | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 66dfe4e5..b13125fe 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -36,6 +36,14 @@ function pgfx_axes(pgfx_plot::PGFPlotsXPlot) return gp isa PGFPlotsX.GroupPlot ? gp.elements[1].contents : gp end +function pgfx_preample(pgfx_plot::Plots.Plot{Plots.PGFPlotsXBackend}) + old_flag = pgfx_plot.attr[:tex_output_standalone] + pgfx_plot.attr[:tex_output_standalone] = true + fulltext = String(repr("application/x-tex", pgfx_plot)) + preamble = fulltext[1:first(findfirst("\\begin{document}", fulltext)) - 1] + pgfx_plot.attr[:tex_output_standalone] = old_flag + preamble +end function surface_to_vecs(x::AVec, y::AVec, s::Union{AMat, Surface}) a = Array(s) @@ -797,7 +805,7 @@ end function _show(io::IO, mime::MIME"application/x-tex", plt::Plot{PGFPlotsXBackend}) _update_plot_object(plt) - PGFPlotsX.print_tex(io, plt.o.the_plot) + PGFPlotsX.print_tex(io, plt.o.the_plot, include_preamble = plt.attr[:tex_output_standalone]) end function _display(plt::Plot{PGFPlotsXBackend}) From 7ea1eebc9e01e16c7c02a406e205ccd4f9fb151b Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 25 Nov 2019 18:56:20 +0100 Subject: [PATCH 287/357] line legend for ribbon plots --- src/backends/pgfplotsx.jl | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index b13125fe..09496a67 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -194,7 +194,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) else series_func = PGFPlotsX.Plot end - if series[:fillrange] !== nothing && !isfilledcontour(series) + if series[:fillrange] !== nothing && !isfilledcontour(series) && series[:ribbon] === nothing push!(series_opt, "area legend" => nothing) end if st == :heatmap @@ -252,8 +252,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end # add to legend? if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) - push!( axis, PGFPlotsX.LegendEntry( opt[:label] ) - ) + push!( axis, PGFPlotsX.LegendEntry(opt[:label]) ) end # add series annotations anns = series[:series_annotations] From c4354c86c009334b934415bea63dbb05f83316f6 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 25 Nov 2019 20:10:09 +0100 Subject: [PATCH 288/357] legend opacity --- src/backends/pgfplotsx.jl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 09496a67..94a76b3b 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -102,8 +102,9 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) bb = bbox(sp) cstr = plot_color(sp[:background_color_legend]) a = alpha(cstr) + fg_alpha = alpha(plot_color(sp[:foreground_color_legend])) title_cstr = plot_color(sp[:titlefontcolor]) - title_a = alpha(cstr) + title_a = alpha(title_cstr) axis_opt = PGFPlotsX.Options( "height" => string(height(bb)), "width" => string(width(bb)), @@ -115,8 +116,10 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) "rotate" => sp[:titlefontrotation] ), "legend style" => PGFPlotsX.Options( - pgfx_linestyle(pgfx_thickness_scaling(sp), sp[:foreground_color_legend], 1.0, "solid") => nothing, + pgfx_linestyle(pgfx_thickness_scaling(sp), sp[:foreground_color_legend], fg_alpha, "solid") => nothing, "fill" => cstr, + "fill opacity" => a, + "text opacity" => alpha(plot_color(sp[:legendfontcolor])), "font" => pgfx_font(sp[:legendfontsize], pgfx_thickness_scaling(sp)) ), "axis background/.style" => PGFPlotsX.Options( From fe07fe0a7b5c66d0fb555a7d0c8f7146bfecea84 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 25 Nov 2019 23:05:27 +0100 Subject: [PATCH 289/357] fix background color --- 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 94a76b3b..2e210ab3 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -71,7 +71,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) if !pgfx_plot.is_created the_plot = PGFPlotsX.TikzPicture(PGFPlotsX.Options()) cols, rows = size(plt.layout.grid) - bgc = plt.attr[:background_color_outside] + bgc = plt.attr[:background_color_outside] == :match ? plt.attr[:background_color] : plt.attr[:background_color] if bgc isa Colors.Colorant cstr = plot_color(bgc) a = alpha(cstr) From f2af1216612e6d48934a2b79ad487d1b2479a8a3 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 25 Nov 2019 23:12:20 +0100 Subject: [PATCH 290/357] fix pgfx_axes --- src/backends/pgfplotsx.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 2e210ab3..056405eb 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -32,8 +32,8 @@ Base.@kwdef mutable struct PGFPlotsXPlot end function pgfx_axes(pgfx_plot::PGFPlotsXPlot) - gp = pgfx_plot.the_plot.elements[1] - return gp isa PGFPlotsX.GroupPlot ? gp.elements[1].contents : gp + gp = pgfx_plot.the_plot.elements[1].elements[1] + return gp isa PGFPlotsX.GroupPlot ? gp.contents : gp end function pgfx_preample(pgfx_plot::Plots.Plot{Plots.PGFPlotsXBackend}) From 091ca327ba4a1363f4d511e23ca74bb7cd7acf4f Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 26 Nov 2019 00:07:45 +0100 Subject: [PATCH 291/357] direct colormap access --- src/backends/pgfplotsx.jl | 13 +++++++------ test/test_pgfplotsx.jl | 3 ++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 056405eb..ec210aab 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -158,6 +158,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) push!(axis_opt, "colorbar" => nothing, "colormap name" => "plots$(sp.attr[:subplot_index])", + "colormap access" => "direct", ) # goto is needed to break out of col and series for @goto colorbar_end @@ -167,10 +168,10 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) @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] - ) + "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] @@ -192,7 +193,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) series_opt = PGFPlotsX.Options( "color" => single_color(opt[:linecolor]), ) - if is3d(series) || st == :heatmap #|| isfilledcontour(series) + if is3d(series) || st == :heatmap series_func = PGFPlotsX.Plot3 else series_func = PGFPlotsX.Plot @@ -336,7 +337,7 @@ function pgfx_series_coordinates!(st_val::Val{:heatmap}, segment_opt, opt, args) push!(segment_opt, "surf" => nothing, "mesh/rows" => length(opt[:x]), - "mesh/cols" => length(opt[:y]) + "mesh/cols" => length(opt[:y]), ) return PGFPlotsX.Table(args...) end diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index f38b115b..4c62ef4f 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -80,7 +80,8 @@ end z = float((1:4) * reshape(1:10, 1, :)) pgfx_plot = heatmap(xs, ys, z, aspect_ratio=1) Plots._update_plot_object(pgfx_plot) - if @test_nowarn(haskey(Plots.pgfx_axes(pgfx_plot.o)[1].options.dict, "colorbar") == true) + if + @test_nowarn(haskey(Plots.pgfx_axes(pgfx_plot.o)[1].options.dict, "colorbar") == true) @test Plots.pgfx_axes(pgfx_plot.o)[1]["colorbar"] === nothing @test Plots.pgfx_axes(pgfx_plot.o)[1]["colormap name"] == "plots1" end From 9488176a2d8e05ed4b7e441088c71e8014864a1d Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 26 Nov 2019 00:15:54 +0100 Subject: [PATCH 292/357] flip layout --- 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 ec210aab..4ae9370f 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -70,7 +70,7 @@ end function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) if !pgfx_plot.is_created the_plot = PGFPlotsX.TikzPicture(PGFPlotsX.Options()) - cols, rows = size(plt.layout.grid) + rows, cols = size(plt.layout.grid) bgc = plt.attr[:background_color_outside] == :match ? plt.attr[:background_color] : plt.attr[:background_color] if bgc isa Colors.Colorant cstr = plot_color(bgc) From 47900b1a8014a8ad7dd63c1953d793126afd2e34 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 26 Nov 2019 00:28:11 +0100 Subject: [PATCH 293/357] fix framestyle error --- 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 4ae9370f..82ca9e32 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -646,7 +646,7 @@ function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) ) # set to supported framestyle - framestyle = pgfx_framestyle(sp[:framestyle]) + framestyle = pgfx_framestyle(sp[:framestyle] == false ? :none : sp[:framestyle]) # axis label position labelpos = "" From f9ea9cd999bee5871fe13a03284a3aec243fb461 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 26 Nov 2019 01:41:54 +0100 Subject: [PATCH 294/357] add quiver bug test --- test/test_pgfplotsx.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 4c62ef4f..289a5c93 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -15,6 +15,7 @@ end pgfx_plot = plot(1:5) Plots._update_plot_object(pgfx_plot) @test pgfx_plot.o.the_plot isa PGFPlotsX.TikzDocument + @test pgfx_plot.series_list[1].plotattributes[:quiver] === nothing @testset "3D docs example" begin n = 100 @@ -80,8 +81,7 @@ end z = float((1:4) * reshape(1:10, 1, :)) pgfx_plot = heatmap(xs, ys, z, aspect_ratio=1) Plots._update_plot_object(pgfx_plot) - if - @test_nowarn(haskey(Plots.pgfx_axes(pgfx_plot.o)[1].options.dict, "colorbar") == true) + if @test_nowarn(haskey(Plots.pgfx_axes(pgfx_plot.o)[1].options.dict, "colorbar") == true) @test Plots.pgfx_axes(pgfx_plot.o)[1]["colorbar"] === nothing @test Plots.pgfx_axes(pgfx_plot.o)[1]["colormap name"] == "plots1" end From 39cb3733db1ba013982545aa72297171ba26f61f Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 26 Nov 2019 13:22:37 +0100 Subject: [PATCH 295/357] fifty shades of show --- src/backends/pgfplotsx.jl | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 82ca9e32..9dbfb1a1 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -59,6 +59,7 @@ function surface_to_vecs(x::AVec, y::AVec, s::Union{AMat, Surface}) end Base.display(pgfx_plot::PGFPlotsXPlot) = display(pgfx_plot.the_plot) + function Base.show(io::IO, mime::MIME, pgfx_plot::PGFPlotsXPlot) show(io::IO, mime, pgfx_plot.the_plot) end @@ -284,6 +285,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end pgfx_plot.is_created = true end + return pgfx_plot end ## seriestype specifics @inline function pgfx_series_coordinates!(sp, series, segment_opt, opt, rng) @@ -791,26 +793,21 @@ function _update_plot_object(plt::Plot{PGFPlotsXBackend}) plt.o(plt) end -function _show(io::IO, mime::MIME"image/svg+xml", plt::Plot{PGFPlotsXBackend}) - _update_plot_object(plt) - show(io, mime, plt.o) +for mime in ("application/pdf", "image/png", "image/svg+xml") + @eval function _show(io::IO, mime::MIME{Symbol($mime)}, plt::Plot{PGFPlotsXBackend}) + show(io, mime, plt.o.the_plot) + end end -function _show(io::IO, mime::MIME"application/pdf", plt::Plot{PGFPlotsXBackend}) - _update_plot_object(plt) - show(io, mime, plt.o) -end - -function _show(io::IO, mime::MIME"image/png", plt::Plot{PGFPlotsXBackend}) - _update_plot_object(plt) - show(io, mime, plt.o) -end - -function _show(io::IO, mime::MIME"application/x-tex", plt::Plot{PGFPlotsXBackend}) - _update_plot_object(plt) +function _show(io::IO, mime::MIME{Symbol("application/x-tex")}, plt::Plot{PGFPlotsXBackend}) PGFPlotsX.print_tex(io, plt.o.the_plot, include_preamble = plt.attr[:tex_output_standalone]) end -function _display(plt::Plot{PGFPlotsXBackend}) - plt.o +Base.show(io::IO, ::MIME{Symbol("text/plain")}, plt::Plot{PGFPlotsXBackend}) = show(io, plt) + +function Base.show(io::IO, plt::Plot{PGFPlotsXBackend}) display(PGFPlotsX.PGFPlotsXDisplay(), plt.o.the_plot) +end + +function _display(plt::Plot{PGFPlotsXBackend}) + display(PGFPlotsX.PGFPlotsXDisplay(), plt.o.the_plot) end From e3239bf31200770d081fc3c5e66bb4261ed21091 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 26 Nov 2019 13:30:04 +0100 Subject: [PATCH 296/357] fix typo --- 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 9dbfb1a1..172c4470 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -36,7 +36,7 @@ function pgfx_axes(pgfx_plot::PGFPlotsXPlot) return gp isa PGFPlotsX.GroupPlot ? gp.contents : gp end -function pgfx_preample(pgfx_plot::Plots.Plot{Plots.PGFPlotsXBackend}) +function pgfx_preamble(pgfx_plot::Plot{PGFPlotsXBackend}) old_flag = pgfx_plot.attr[:tex_output_standalone] pgfx_plot.attr[:tex_output_standalone] = true fulltext = String(repr("application/x-tex", pgfx_plot)) From 985d43bf4ca293b98a39fd60461d6826e40ef228 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 26 Nov 2019 18:55:44 +0100 Subject: [PATCH 297/357] fix show --- src/backends/pgfplotsx.jl | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 172c4470..b3007bc7 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -31,6 +31,7 @@ Base.@kwdef mutable struct PGFPlotsXPlot end end +## end user utility functions function pgfx_axes(pgfx_plot::PGFPlotsXPlot) gp = pgfx_plot.the_plot.elements[1].elements[1] return gp isa PGFPlotsX.GroupPlot ? gp.contents : gp @@ -44,6 +45,7 @@ function pgfx_preamble(pgfx_plot::Plot{PGFPlotsXBackend}) pgfx_plot.attr[:tex_output_standalone] = old_flag preamble end +## function surface_to_vecs(x::AVec, y::AVec, s::Union{AMat, Surface}) a = Array(s) @@ -58,12 +60,6 @@ function surface_to_vecs(x::AVec, y::AVec, s::Union{AMat, Surface}) return xn, yn, zn end -Base.display(pgfx_plot::PGFPlotsXPlot) = display(pgfx_plot.the_plot) - -function Base.show(io::IO, mime::MIME, pgfx_plot::PGFPlotsXPlot) - show(io::IO, mime, pgfx_plot.the_plot) -end - function Base.push!(pgfx_plot::PGFPlotsXPlot, item) push!(pgfx_plot.the_plot, item) end @@ -803,11 +799,6 @@ function _show(io::IO, mime::MIME{Symbol("application/x-tex")}, plt::Plot{PGFPlo PGFPlotsX.print_tex(io, plt.o.the_plot, include_preamble = plt.attr[:tex_output_standalone]) end -Base.show(io::IO, ::MIME{Symbol("text/plain")}, plt::Plot{PGFPlotsXBackend}) = show(io, plt) - -function Base.show(io::IO, plt::Plot{PGFPlotsXBackend}) display(PGFPlotsX.PGFPlotsXDisplay(), plt.o.the_plot) -end - function _display(plt::Plot{PGFPlotsXBackend}) display(PGFPlotsX.PGFPlotsXDisplay(), plt.o.the_plot) end From 68b29f63a6ca395579b9ffbf8d8e52a94ea6362e Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 26 Nov 2019 19:10:25 +0100 Subject: [PATCH 298/357] improved fillrange --- src/backends/pgfplotsx.jl | 57 ++++++++++++++++++++++++++++++++++----- test/test_pgfplotsx.jl | 1 - 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index b3007bc7..4cc09fc4 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -210,8 +210,8 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) else iter_segments(series) end - segment_opt = PGFPlotsX.Options() 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] @@ -235,15 +235,28 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) end if st == :shape || - (series[:fillrange] !== nothing && !isfilledcontour(series)) && - series[:ribbon] === nothing + isfilledcontour(series) || + series[:ribbon] !== nothing 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) + # add to legend? + if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) + io = IOBuffer() + PGFPlotsX.print_tex(io, pgfx_fillstyle(opt, i)) + style = strip(String(take!(io)),['[',']', ' ']) + push!( segment_opt, "legend image code/.code" => """{ + \\draw[##1,/tikz/.cd, $style] (0cm,-0.1cm) rectangle (0.6cm,0.1cm); + }""" ) + end + end + # series coordinates = pgfx_series_coordinates!( sp, series, segment_opt, opt, rng ) segment_plot = series_func( - merge(series_opt, segment_opt), - coordinates, - (series[:fillrange] !== nothing && !isfilledcontour(series) && series[:ribbon] === nothing) ? "\\closedcycle" : "{}" + merge(series_opt, segment_opt), + coordinates, ) push!(axis, segment_plot) # add ribbons? @@ -253,7 +266,8 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end # add to legend? if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) - push!( axis, PGFPlotsX.LegendEntry(opt[:label]) ) + legend = PGFPlotsX.LegendEntry(PGFPlotsX.Options(), opt[:label], true) + push!( axis, legend ) end # add series annotations anns = series[:series_annotations] @@ -634,6 +648,35 @@ function pgfx_add_ribbons!( axis, series, segment_plot, series_func, series_inde )) return axis end + +function pgfx_fillrange_series!(axis, series, series_func, i, fillrange, rng) + fillrange_opt = PGFPlotsX.Options( + "line width" => "0", + "draw opacity" => "0", + ) + fillrange_opt = merge( fillrange_opt, pgfx_fillstyle(series, i) ) + fillrange_opt = merge( fillrange_opt, pgfx_marker(series, i) ) + push!( fillrange_opt, "forget plot" => nothing ) + opt = series.plotattributes + args = is3d(series) ? (opt[:x][rng], opt[:y][rng], opt[:z][rng]) : (opt[:x][rng], opt[:y][rng]) + push!(axis, PGFPlotsX.PlotInc(fillrange_opt, pgfx_fillrange_args(fillrange, args...))) + return axis +end + +function pgfx_fillrange_args(fillrange, x, y) + n = length(x) + x_fill = [x; x[n:-1:1]; x[1]] + y_fill = [y; _cycle(fillrange, n:-1:1); y[1]] + return PGFPlotsX.Coordinates(x_fill, y_fill) +end + +function pgfx_fillrange_args(fillrange, x, y, z) + n = length(x) + x_fill = [x; x[n:-1:1]; x[1]] + y_fill = [y; y[n:-1:1]; x[1]] + z_fill = [z; _cycle(fillrange, n:-1:1); z[1]] + return PGFPlotsX.Coordiantes(x_fill, y_fill, z_fill) +end # -------------------------------------------------------------------------------------- function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) axis = sp[Symbol(letter,:axis)] diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 289a5c93..fc27f0e8 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -113,7 +113,6 @@ end x + y end), color=:bluesreds, legend=false) plot(p1, p2) - # TODO: questionable tiling end # testset @testset "Framestyles" begin scatter(fill(randn(10), 6), fill(randn(10), 6), framestyle=[:box :semi :origin :zerolines :grid :none], title=[":box" ":semi" ":origin" ":zerolines" ":grid" ":none"], color=permutedims(1:6), layout=6, label="", markerstrokewidth=0, ticks=-2:2) From 58cf8e471e40bd454f4af701c8c86d22840cd3e2 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 26 Nov 2019 21:28:15 +0100 Subject: [PATCH 299/357] improve annotations --- src/backends/pgfplotsx.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 4cc09fc4..c7e8e7e1 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -278,7 +278,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) # add subplot annotations anns = sp.attr[:annotations] for (xi,yi,txt) in anns - pgfx_add_annotation!(axis, xi, yi, txt) + pgfx_add_annotation!(axis, xi, yi, txt, pgfx_thickness_scaling(sp)) end end if ispolar(sp) @@ -604,7 +604,7 @@ function pgfx_add_annotation!(o, x, y, val, thickness_scaling = 1) ), " at ", PGFPlotsX.Coordinate(x, y), - "{$(val.str).};" + "{$(val.str)};" ]) end From 68b344e7c3afe594c168c41578f8a29f867bdeb9 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Wed, 27 Nov 2019 12:23:39 +0100 Subject: [PATCH 300/357] axis cs for annotations --- src/backends/pgfplotsx.jl | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index c7e8e7e1..5f487c8c 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -591,20 +591,17 @@ end function pgfx_add_annotation!(o, x, y, val, thickness_scaling = 1) # Construct the style string. - # Currently supports color and orientation cstr = val.font.color a = alpha(cstr) push!(o, ["\\node", PGFPlotsX.Options( - get(_pgfx_annotation_halign,val.font.halign,"") => nothing, + get(_pgfx_annotation_halign, val.font.halign, "") => nothing, "color" => cstr, "draw opacity" => convert(Float16, a), "rotate" => val.font.rotation, "font" => pgfx_font(val.font.pointsize, thickness_scaling) ), - " at ", - PGFPlotsX.Coordinate(x, y), - "{$(val.str)};" + " at (axis cs:$x, $y) {$(val.str)};" ]) end From 899c8b36340d71d7bb413e469227ae2d7d59d339 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 29 Nov 2019 11:53:35 +0100 Subject: [PATCH 301/357] add require --- src/init.jl | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/init.jl b/src/init.jl index 2e1a3404..ee629f73 100644 --- a/src/init.jl +++ b/src/init.jl @@ -46,6 +46,12 @@ function __init__() @require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn) end + @require PGFPlotsX = "8314cec4-20b6-5062-9cdb-752b83310925" begin + fn = joinpath(@__DIR__, "backends", "pgfplotsx.jl") + include(fn) + @require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn) + end + @require PlotlyJS = "f0f68f2c-4968-5e81-91da-67840de0976a" begin fn = joinpath(@__DIR__, "backends", "plotlyjs.jl") include(fn) From 715181585ab9589a1fc61acebd602ed8a77e64c1 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 29 Nov 2019 16:06:00 +0100 Subject: [PATCH 302/357] trigger CI --- src/backends/pgfplotsx.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 4dfa71ff..cc8d7013 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,4 +1,5 @@ using Contour: Contour + Base.@kwdef mutable struct PGFPlotsXPlot is_created::Bool = false was_shown::Bool = false From a3fc47a7debffee70b49d76b7c1964cf1e5718cf Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Fri, 29 Nov 2019 16:22:32 +0100 Subject: [PATCH 303/357] update package dependencies to require latest --- Project.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Project.toml b/Project.toml index 6b6c0284..0b76a8ef 100644 --- a/Project.toml +++ b/Project.toml @@ -33,8 +33,8 @@ UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" [compat] Contour = "0.5" FFMPEG = "0.2" -FixedPointNumbers = "0.3, 0.6" -GR = "0.31, 0.44" +FixedPointNumbers = "0.6" +GR = "0.44" GeometryTypes = "0.7" JSON = "0.21" Measures = "0.3" @@ -45,7 +45,7 @@ RecipesBase = "0.6, 0.7" Reexport = "0.2" Requires = "0.5" Showoff = "0.3.1" -StatsBase = "0.14, 0.32" +StatsBase = "0.32" julia = "1" [extras] From 0458c18c133812ddd08364d56387bc9224e7c521 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Fri, 29 Nov 2019 16:27:57 +0100 Subject: [PATCH 304/357] require PlotThemes v1 --- Project.toml | 2 +- src/themes.jl | 9 --------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/Project.toml b/Project.toml index 0b76a8ef..55b71f8b 100644 --- a/Project.toml +++ b/Project.toml @@ -39,7 +39,7 @@ GeometryTypes = "0.7" JSON = "0.21" Measures = "0.3" NaNMath = "0.3" -PlotThemes = "0.2, 1" +PlotThemes = "1" PlotUtils = "0.6.1" RecipesBase = "0.6, 0.7" Reexport = "0.2" diff --git a/src/themes.jl b/src/themes.jl index eaa69636..aed8ecc0 100644 --- a/src/themes.jl +++ b/src/themes.jl @@ -13,7 +13,6 @@ function _theme(s::Symbol, defaults::KW; kw...) reset_defaults() # Set the theme's gradient as default - fix_colorgradient!(defaults) if haskey(defaults, :colorgradient) PlotUtils.clibrary(:misc) PlotUtils.default_cgrad(default = :sequential, sequential = PlotThemes.gradient_name(s)) @@ -41,13 +40,6 @@ function _theme(s::Symbol, defaults::KW; kw...) return end -# be compatible with old PlotThemes specifying the colorgradient with `:gradient` -function fix_colorgradient!(defaults) - if haskey(defaults, :gradient) && !haskey(defaults, :colorgradient) - defaults[:colorgradient] = pop!(defaults, :gradient) - end -end - @deprecate set_theme(s) theme(s) @userplot ShowTheme @@ -65,7 +57,6 @@ _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func defaults = PlotThemes._themes[thm].defaults # get the gradient - fix_colorgradient!(defaults) gradient_colors = get(defaults, :colorgradient, cgrad(:inferno).colors) colorgradient = cgrad(cfunc.(RGB.(gradient_colors))) From 39e93f40c26c526725b36744001b970e8e2b7e1f Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 29 Nov 2019 16:38:40 +0100 Subject: [PATCH 305/357] fix tests --- test/test_pgfplotsx.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index fc27f0e8..ca033a52 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -37,8 +37,8 @@ end Plots._update_plot_object(pl) axis = Plots.pgfx_axes(pl.o)[1] @test count( x->x isa PGFPlotsX.LegendEntry, axis.contents ) == 5 - @test count( x->x isa PGFPlotsX.Plot, axis.contents ) == 104 # each marker is its own plot - marker = axis.contents[14] + @test count( x->x isa PGFPlotsX.Plot, axis.contents ) == 108 # each marker is its own plot, fillranges create 2 plot-objects + marker = axis.contents[15] @test marker isa PGFPlotsX.Plot @test marker.options["mark"] == "*" @test marker.options["mark options"]["color"] == RGBA{Float64}( colorant"green", 0.8) From 0ab42eb008e7d0f6c1553191821ff122390baf34 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Fri, 29 Nov 2019 16:43:24 +0100 Subject: [PATCH 306/357] update precompiles --- deps/generateprecompiles.jl | 3 +- src/precompile.jl | 1665 +++++++++++++++++------------------ 2 files changed, 832 insertions(+), 836 deletions(-) diff --git a/deps/generateprecompiles.jl b/deps/generateprecompiles.jl index dfbd4d0b..5bf3d6be 100644 --- a/deps/generateprecompiles.jl +++ b/deps/generateprecompiles.jl @@ -42,7 +42,8 @@ blacklist = [ # the following are not visible to Plots, only its dependencies "CategoricalArrays", "FixedPointNumbers", - "SparseArrays" + "SparseArrays", + r"#{1,2}[^\"#]+#{1,2}\d+", ] data = SnoopCompile.read(log_path) diff --git a/src/precompile.jl b/src/precompile.jl index fc6f27a3..c8e29950 100644 --- a/src/precompile.jl +++ b/src/precompile.jl @@ -1,878 +1,873 @@ function _precompile_() ccall(:jl_generating_output, Cint, ()) == 1 || return nothing - precompile(Tuple{typeof(Plots.legendtitlefont), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.preprocessArgs!), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Float64, Float64, Int64, Plots.Shape}) precompile(Tuple{typeof(Plots.gr_display), Plots.Subplot{Plots.GRBackend}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}}) precompile(Tuple{typeof(Plots.legendtitlefont), Plots.Subplot{Plots.GRBackend}}) precompile(Tuple{typeof(Plots.shape_data), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots.gr_display), Plots.Subplot{Plots.GRBackend}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.pie_labels), Plots.Subplot{Plots.GRBackend}, Plots.Series}) - precompile(Tuple{typeof(Plots.axis_drawing_info), Plots.Subplot{Plots.GRBackend}}) precompile(Tuple{typeof(Plots.preprocessArgs!), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.gr_draw_marker), Float64, Float64, Int64, Plots.Shape}) - precompile(Tuple{typeof(Plots.iscontour), Plots.Series}) - precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Int64, Plots.Shape}) - precompile(Tuple{typeof(Plots.iscontour), Plots.Series}) - precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Float64, 1}, Array{Any, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.replaceAlias!), Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Symbol}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.get_clims), Plots.Series}) - precompile(Tuple{typeof(Plots.axis_drawing_info), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._backend_instance), Symbol}) - precompile(Tuple{typeof(Plots._update_subplot_colors), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.warnOnUnsupported), Plots.GRBackend, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._heatmap_edges), Array{Float64, 1}, Bool}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._plots_defaults)}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._backend_instance), Symbol}) - precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64, Array{Plots.Plot{T} where T<:RecipesBase.AbstractBackend, 1}}) - precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64, Array{Plots.Plot{T} where T<:RecipesBase.AbstractBackend, 1}}) - precompile(Tuple{typeof(Plots.hasgrid), Symbol, Symbol}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}}) - precompile(Tuple{typeof(Plots._cbar_unique), Array{Symbol, 1}, String}) - precompile(Tuple{typeof(Plots.get_clims), Plots.Series}) - precompile(Tuple{typeof(Plots.__init__)}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.make_fillrange_side), Array{Float64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy}}) - precompile(Tuple{typeof(Plots.warnOnUnsupported_args), Plots.GRBackend, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots.replaceAlias!), Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Symbol}}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Int64, Plots.Shape}) + precompile(Tuple{typeof(Plots.preprocessArgs!), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.warnOnUnsupported), Plots.GRBackend, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._update_min_padding!), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.legendtitlefont), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.layout_args), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots.contour_levels), Plots.Series, Tuple{Float64, Float64}}) precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}}) - precompile(Tuple{typeof(Plots.is_marker_supported), Plots.GRBackend, Symbol}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.gr_xaxis_height), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.gr_legend_pos), Plots.Subplot{Plots.GRBackend}, Float64, Float64}) - precompile(Tuple{typeof(Plots.default_should_widen), Plots.Axis}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._hist_edges), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Tuple{Int64, Int64}}) + precompile(Tuple{typeof(Plots.color_or_nothing!), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.warnOnUnsupported_args), Plots.GRBackend, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.gr_display), Plots.Subplot{Plots.GRBackend}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Float64, 1}, Array{Any, 1}}}) precompile(Tuple{typeof(Plots.gr_text), Float64, Float64, String}) + precompile(Tuple{typeof(Plots._update_subplot_colors), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}}) + precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64, Array{Plots.Plot{T} where T<:RecipesBase.AbstractBackend, 1}}) precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Float64, Plots.Shape}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.axis_drawing_info), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}}) + precompile(Tuple{typeof(Plots.get_markercolor), Plots.Series, Float64, Float64, Int64}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots.gr_xaxis_height), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.layout_args), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Array{T, 1} where T, 1}}}) + precompile(Tuple{typeof(Plots.iscontour), Plots.Series}) + precompile(Tuple{typeof(Plots.__init__)}) + precompile(Tuple{typeof(Plots.gr_set_gradient), PlotUtils.ColorGradient}) + precompile(Tuple{typeof(Plots.get_clims), Plots.Series}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}}) + precompile(Tuple{typeof(Plots.gr_draw_colorbar), Plots.GRColorbar, Plots.Subplot{Plots.GRBackend}, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64, Array{Plots.Plot{T} where T<:RecipesBase.AbstractBackend, 1}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Float64, 1}, Array{String, 1}}}) precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.Spy}}) - precompile(Tuple{typeof(Plots.nanappend!), Array{Float64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._update_min_padding!), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.slice_arg), Array{String, 2}, Int64}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._cbar_unique), Array{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, 1}, String}) + precompile(Tuple{typeof(Plots.default_should_widen), Plots.Axis}) + precompile(Tuple{typeof(Plots.add_layout_pct!), Base.Dict{Symbol, Any}, Expr, Int64, Int64}) precompile(Tuple{typeof(Plots.gr_set_linecolor), PlotUtils.ColorGradient}) - precompile(Tuple{typeof(Plots.default), Symbol}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots.getxy), Plots.Plot{Plots.GRBackend}, Int64}) + precompile(Tuple{typeof(Plots.recompute_lengths), Array{Measures.Measure, 1}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}}) + precompile(Tuple{typeof(Plots.has_attribute_segments), Plots.Series}) precompile(Tuple{typeof(Plots.gr_set_viewport_cmap), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.layout_args), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.gr_polaraxes), Int64, Float64, Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Float64}) precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots.is_attr_supported), Symbol}) + precompile(Tuple{typeof(Plots._backend_instance), Symbol}) + precompile(Tuple{typeof(Plots.axis_drawing_info), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._backend_instance), Symbol}) + precompile(Tuple{typeof(Plots._plots_defaults)}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Int64, 1}}}) + precompile(Tuple{typeof(Plots.pie_labels), Plots.Subplot{Plots.GRBackend}, Plots.Series}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._preprocess_barlike), Base.Dict{Symbol, Any}, Array{Int64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.link_axes!), Plots.Axis, Plots.Axis}) + precompile(Tuple{typeof(Plots.showaxis), Symbol, Symbol}) + precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, Base.StepRange{Int64, Int64}, Symbol}) + precompile(Tuple{typeof(Plots._heatmap_edges), Array{Float64, 1}, Bool}) + precompile(Tuple{typeof(Plots.convertToAnyVector), Int64, Base.Dict{Symbol, Any}}) precompile(Tuple{typeof(Plots.gr_get_color), Plots.Series}) precompile(Tuple{typeof(Plots._cbar_unique), Array{Int64, 1}, String}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, typeof(Base.log), Int64}}) - precompile(Tuple{typeof(Plots.layout_args), Base.Dict{Symbol, Any}, Int64}) - precompile(Tuple{typeof(Plots.color_or_nothing!), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.getxy), Plots.Plot{Plots.GRBackend}, Int64}) - precompile(Tuple{typeof(Plots.ensure_gradient!), Base.Dict{Symbol, Any}, Symbol, Symbol}) - precompile(Tuple{typeof(Plots.link_axes!), Plots.Axis, Plots.Axis}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{}}) - precompile(Tuple{typeof(Plots.contour_levels), Plots.Series, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.gr_xaxis_height), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Function, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.is_attr_supported), Symbol}) precompile(Tuple{typeof(Plots.gr_viewport_from_bbox), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.ispolar), Plots.Series}) - precompile(Tuple{typeof(Plots.default_should_widen), Plots.Axis}) - precompile(Tuple{typeof(Plots.shape_data), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Float64}) - precompile(Tuple{typeof(Plots.gr_polaraxes), Int64, Float64, Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._add_markershape), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) - precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Char}) - precompile(Tuple{typeof(Plots.has_attribute_segments), Plots.Series}) - precompile(Tuple{typeof(Plots._preprocess_barlike), Base.Dict{Symbol, Any}, Array{Float64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._bin_centers), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.add_layout_pct!), Base.Dict{Symbol, Any}, Expr, Int64, Int64}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Int64, 1}}}) - precompile(Tuple{typeof(Plots._preprocess_barlike), Base.Dict{Symbol, Any}, Array{Int64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.gr_draw_colorbar), Plots.GRColorbar, Plots.Subplot{Plots.GRBackend}, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.gr_set_line), Int64, Symbol, ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.Spy}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Float64}) - precompile(Tuple{typeof(Plots.is_seriestype_supported), Plots.GRBackend, Symbol}) - precompile(Tuple{typeof(Plots.make_steps), Base.UnitRange{Int64}, Symbol}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{String, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Union{Base.Missing, Int64}, 1}}) - precompile(Tuple{typeof(Plots._series_index), Base.Dict{Symbol, Any}, Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.GRBackend}, Symbol, Bool, Bool}) - precompile(Tuple{typeof(Plots.process_annotation), Plots.Subplot{Plots.GRBackend}, Int64, Float64, Plots.PlotText, Plots.Font}) - precompile(Tuple{typeof(Plots.get_markercolor), Plots.Series, Float64, Float64, Int64}) - precompile(Tuple{typeof(Plots.gr_get_color), Plots.Series}) - precompile(Tuple{typeof(Plots.convertToAnyVector), Int64, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) - precompile(Tuple{typeof(Plots.gr_set_line), Float64, Symbol, ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Float64, Float64, Int64}) - precompile(Tuple{typeof(Plots.fix_colorgradient!), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Plots.PortfolioComposition}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) + precompile(Tuple{typeof(Plots.ensure_gradient!), Base.Dict{Symbol, Any}, Symbol, Symbol}) precompile(Tuple{typeof(Plots._cbar_unique), Array{Nothing, 1}, String}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) - precompile(Tuple{typeof(Plots.series_annotations_shapes!), Plots.Series, Symbol}) + precompile(Tuple{typeof(Plots.isvertical), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.hasgrid), Symbol, Symbol}) + precompile(Tuple{typeof(Plots._cbar_unique), Array{Symbol, 1}, String}) precompile(Tuple{typeof(Plots.titlefont), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.convert_sci_unicode), String}) - precompile(Tuple{typeof(Plots.create_grid_curly), Expr}) - precompile(Tuple{typeof(Plots.showaxis), Symbol, Symbol}) - precompile(Tuple{typeof(Plots._update_series_attributes!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Union{Base.Missing, Int64}, 1}}}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) - precompile(Tuple{typeof(Plots.gr_text), Float64, Float64, String}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.Spy}}) - precompile(Tuple{typeof(Plots.warnOnUnsupported_args), Plots.GRBackend, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Base.Complex{Float64}, 1}}}) - precompile(Tuple{typeof(Plots.get_markerstrokecolor), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Plots.OHLC{T} where T<:Real, 1}}}) - precompile(Tuple{typeof(Plots.get_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis}) - precompile(Tuple{typeof(Plots._update_axis), Plots.Axis, Base.Dict{Symbol, Any}, Symbol, Int64}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) - precompile(Tuple{typeof(Plots.link_subplots), Array{RecipesBase.AbstractLayout, 1}, Symbol}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.gr_display), Plots.Plot{Plots.GRBackend}, String}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Function, 1}, Int64}}) - precompile(Tuple{typeof(Plots.gr_fill_viewport), Array{Float64, 1}, ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots.gr_viewport_from_bbox), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.gr_set_yticks_font), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.GRBackend}, Symbol, Bool, Bool}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.isvertical), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.xlims), Int64}) - precompile(Tuple{typeof(Plots.reset_extrema!), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Function, 1}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Array{T, 1} where T, 1}}}) - precompile(Tuple{typeof(Plots._plot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.UnitRange{Int64}}}) - precompile(Tuple{typeof(Plots._process_seriesrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) - precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Base.UnitRange{Int64}}) - precompile(Tuple{typeof(Plots.warnOnUnsupported_scales), Plots.GRBackend, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._update_axis), Plots.Axis, Base.Dict{Symbol, Any}, Symbol, Int64}) - precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Float64, Plots.Shape}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Plots.Surface{Array{Float64, 2}}}) precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.gr_set_gradient), PlotUtils.ColorGradient}) - precompile(Tuple{typeof(Plots._update_series_attributes!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._process_seriesrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._pick_default_backend)}) - precompile(Tuple{typeof(Plots.warnOnUnsupported), Plots.GRBackend, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Int64, Int64, Plots.Shape}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._replace_linewidth), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, Tuple{Int64, Int64}, Symbol}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Int64}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Plots.Spy}}) - precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Array{Float64, 1}, 1}}) - precompile(Tuple{typeof(Plots._plot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) - precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Symbol, Symbol}) - precompile(Tuple{typeof(Plots.png), Plots.Plot{Plots.GRBackend}, String}) - precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, Base.StepRange{Int64, Int64}, Symbol}) - precompile(Tuple{typeof(Plots._update_min_padding!), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.aliasesAndAutopick), Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Symbol}, Array{Symbol, 1}, Int64}) - precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Int64, Symbol}) - precompile(Tuple{typeof(Plots.recompute_lengths), Array{Measures.Measure, 1}}) - precompile(Tuple{typeof(Plots.make_steps), Array{Int64, 1}, Symbol}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}}) - precompile(Tuple{typeof(Plots.recompute_lengths), Array{Measures.Measure, 1}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}}) - precompile(Tuple{typeof(Plots._update_min_padding!), Plots.GridLayout}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{Any, 1}}, Int64}) - precompile(Tuple{typeof(Plots._process_seriesrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.is_scale_supported), Plots.GRBackend, Symbol}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.isvertical), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) - precompile(Tuple{typeof(Plots.add_layout_pct!), Base.Dict{Symbol, Any}, Expr, Int64, Int64}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}}) - precompile(Tuple{typeof(Plots._update_subplot_periphery), Plots.Subplot{Plots.GRBackend}, Array{Any, 1}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}}) - precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Symbol, Symbol}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Int64}) - precompile(Tuple{typeof(Plots._add_defaults!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Int64}) - precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Base.Missing}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._update_min_padding!), Plots.GridLayout}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.should_add_to_legend), Plots.Series}) - precompile(Tuple{typeof(Plots.gr_set_fillcolor), ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots.make_steps), Array{Float64, 1}, Symbol}) - precompile(Tuple{typeof(Plots.setxy!), Plots.Plot{Plots.GRBackend}, Tuple{Array{Float64, 1}, Array{Float64, 1}}, Int64}) - precompile(Tuple{typeof(Plots.colorbar_style), Plots.Series}) - precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Float64, Float64, Int64}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.gr_draw_marker), Float64, Float64, Int64, Symbol}) - precompile(Tuple{typeof(Plots.is3d), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.convert_to_polar), Array{Float64, 1}, Array{Float64, 1}, Tuple{Int64, Float64}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) - precompile(Tuple{typeof(Plots._replace_linewidth), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Tuple{Int64, Int64}, Int64, Bool}) - precompile(Tuple{typeof(Plots.compute_gridsize), Int64, Int64, Int64}) - precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Int64, Symbol}) - precompile(Tuple{typeof(Plots._add_defaults!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Int64}) - precompile(Tuple{typeof(Plots.like_histogram), Symbol}) - precompile(Tuple{typeof(Plots.make_fillrange_side), Array{Float64, 1}, Int64}) - precompile(Tuple{typeof(Plots.gr_inqtext), Int64, Int64, String}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) - precompile(Tuple{typeof(Plots._add_markershape), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._add_smooth_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.backend), Symbol}) - precompile(Tuple{typeof(Plots.get_fillalpha), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots._process_plotrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}, Array{Base.Dict{Symbol, Any}, 1}}) - precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, String}) - precompile(Tuple{typeof(Plots.wraptuple), Int64}) - precompile(Tuple{typeof(Plots.colorbar_style), Plots.Series}) - precompile(Tuple{typeof(Plots.reset_extrema!), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._update_subplot_periphery), Plots.Subplot{Plots.GRBackend}, Array{Any, 1}}) - precompile(Tuple{typeof(Plots.filter_data), Base.UnitRange{Int64}, Array{Int64, 1}}) - precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.straightline_data), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots.fg_color), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.get_markercolor), Plots.Series, Float64, Float64, Int64}) - precompile(Tuple{typeof(Plots.get_linealpha), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots.warnOnUnsupported_scales), Plots.GRBackend, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.supported_markers)}) - precompile(Tuple{typeof(Plots.get_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis}) - precompile(Tuple{typeof(Plots.gr_set_line), Int64, Symbol, PlotUtils.ColorGradient}) - precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, String, Symbol}) - precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, Symbol, Symbol}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Measures.Length{:mm, Float64}, Int64, Bool}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Function, 1}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Plots.Spy}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) - precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Float64, Float64, Int64}) - precompile(Tuple{typeof(Plots._preprocess_binlike), Base.Dict{Symbol, Any}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._preprocess_userrecipe), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Bool}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Plots.Surface{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.xlims), Int64}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Array{Any, 1}, Int64, Bool}) - precompile(Tuple{typeof(Plots._filter_input_data!), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Plots.Shape}) - precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, typeof(identity), Nothing}) - precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Function, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.gr_yaxis_width), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Int64, Int64, Bool}) - precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Array{T, 1} where T, 1}}) - precompile(Tuple{typeof(Plots.should_add_to_legend), Plots.Series}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Any}, Int64, Bool}) - precompile(Tuple{typeof(Plots.is_marker_supported), Symbol}) - precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Base.StepRange{Int64, Int64}}) - precompile(Tuple{typeof(Plots.is3d), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.gr_set_viewport_polar)}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Plots.Surface{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Array{ColorTypes.RGBA{Float64}, 1}, Int64, Bool}) - precompile(Tuple{typeof(Plots.all3D), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Tuple{Int64, Int64}, Int64, Bool}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Int64, 1}}) - precompile(Tuple{typeof(Plots.supported_styles)}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Nothing, Int64, Bool}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Array{ColorTypes.RGBA{Float64}, 1}, Int64, Bool}) - precompile(Tuple{typeof(Plots._cbar_unique), Array{PlotUtils.ColorGradient, 1}, String}) - precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Symbol}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Plots.Stroke}) - precompile(Tuple{typeof(Plots.gr_lims), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Bool, Nothing}) - precompile(Tuple{typeof(Plots.create_grid_curly), Expr}) - precompile(Tuple{typeof(Plots._cycle), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int64}) - precompile(Tuple{typeof(Plots.is_style_supported), Plots.GRBackend, Symbol}) - precompile(Tuple{typeof(Plots._update_min_padding!), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Symbol, Int64, Bool}) - precompile(Tuple{typeof(Plots.gr_set_textcolor), ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots._prepare_subplot), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.UnitRange{Int64}}) - precompile(Tuple{typeof(Plots._pick_default_backend)}) - precompile(Tuple{typeof(Plots.ignorenan_extrema), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, String, Int64, Bool}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Int64}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Float64, Int64, Bool}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Bool, Int64, Bool}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots.gr_set_fill), ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Symbol, Symbol}) - precompile(Tuple{typeof(Plots._add_errorbar_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Bool}) - precompile(Tuple{typeof(Plots.is_marker_supported), Symbol}) - precompile(Tuple{typeof(Plots.fg_color), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.convertLegendValue), Symbol}) - precompile(Tuple{typeof(Plots.gr_inqtext), Int64, Int64, String}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Int64}) - precompile(Tuple{typeof(Plots.ignorenan_extrema), Array{Float64, 2}}) - precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64}) - precompile(Tuple{typeof(Plots._update_series_attributes!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.gr_yaxis_width), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._process_plotrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}, Array{Base.Dict{Symbol, Any}, 1}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Any}, Int64, Bool}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Symbol, Int64, Bool}) - precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Symbol, Symbol}) - precompile(Tuple{typeof(Plots._add_errorbar_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.frame), Plots.Animation}) - precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Nothing}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Array{Any, 1}, Int64, Bool}) - precompile(Tuple{typeof(Plots.tickfont), Plots.Axis}) - precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.update_inset_bboxes!), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.fakedata), Int64, Int64}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, String, Int64, Bool}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Measures.Length{:mm, Float64}, Int64, Bool}) - precompile(Tuple{typeof(Plots.is3d), Symbol}) - precompile(Tuple{typeof(Plots.get_xy), Plots.OHLC{Float64}, Int64, Float64}) - precompile(Tuple{typeof(Plots.wraptuple), Bool}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Nothing, Int64, Bool}) - precompile(Tuple{typeof(Plots.straightline_data), Tuple{Int64, Int64}, Tuple{Float64, Float64}, Array{Float64, 1}, Array{Float64, 1}, Int64}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Float64, Int64, Bool}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) - precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout, Array{Measures.Length{:mm, Float64}, 1}}) - precompile(Tuple{typeof(Plots.filter_data), Array{Float64, 1}, Array{Int64, 1}}) - precompile(Tuple{typeof(Plots.inline), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Array{Any, 1}}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Array{String, 1}, Int64}) - precompile(Tuple{typeof(Plots.extendSeriesData), Array{Float64, 1}, Float64}) - precompile(Tuple{typeof(Plots.trueOrAllTrue), typeof(Plots.is3d), Symbol}) - precompile(Tuple{typeof(Plots.gr_set_yticks_font), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.color_or_nothing!), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.convert_sci_unicode), String}) - precompile(Tuple{typeof(Plots.like_surface), Symbol}) - precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout, Array{Measures.Length{:mm, Float64}, 1}}) - precompile(Tuple{typeof(Plots.gr_set_markercolor), ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots.tickfont), Plots.Axis}) - precompile(Tuple{typeof(Plots.backend)}) - precompile(Tuple{typeof(Plots._prepare_annotations), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Int64, Int64, Bool}) - precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64}) - precompile(Tuple{typeof(Plots.backend), Symbol}) - precompile(Tuple{typeof(Plots.wand_edges), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.calc_num_subplots), Plots.GridLayout}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Bool, Int64, Bool}) - precompile(Tuple{typeof(Plots.iter_segments), Base.UnitRange{Int64}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.isijulia)}) - precompile(Tuple{typeof(Plots._update_axis_colors), Plots.Axis}) - precompile(Tuple{typeof(Plots.create_grid), Symbol}) - precompile(Tuple{typeof(Plots.get_linewidth), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots.series_annotations), Array{Any, 1}}) - precompile(Tuple{typeof(Plots.has_attribute_segments), Plots.Series}) - precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{String, 1}}, Int64}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) - precompile(Tuple{typeof(Plots.straightline_data), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots.arrow), Int64}) - precompile(Tuple{typeof(Plots._cycle), Base.StepRange{Int64, Int64}, Int64}) - precompile(Tuple{typeof(Plots.link_axes!), Plots.Axis, Plots.Axis}) - precompile(Tuple{typeof(Plots.ignorenan_extrema), Base.StepRange{Int64, Int64}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.get_xy), Array{Plots.OHLC{T} where T<:Real, 1}, Base.UnitRange{Int64}}) - precompile(Tuple{typeof(Plots.gr_set_yticks_font), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.gr_text_size), String}) - precompile(Tuple{typeof(Plots.update_inset_bboxes!), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Nothing}) - isdefined(Plots, Symbol("#kw##gr_polyline")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_polyline")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.compute_xyz), Nothing, Nothing, Nothing}) - precompile(Tuple{typeof(Plots._update_clims), Float64, Float64, Float64, Float64}) - precompile(Tuple{typeof(Plots.frame), Plots.Animation, Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._subplot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) - precompile(Tuple{typeof(Plots._cycle), Array{String, 1}, Int64}) - precompile(Tuple{typeof(Plots._subplot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) - precompile(Tuple{typeof(Plots._update_clims), Float64, Float64, Int64, Int64}) - precompile(Tuple{typeof(Plots._update_subplot_args), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Int64, Bool}) - precompile(Tuple{typeof(Plots.ignorenan_maximum), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.command_idx), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Float64, Symbol}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Float64}) - precompile(Tuple{typeof(Plots.annotate!), Array{Tuple{Int64, Float64, Plots.PlotText}, 1}}) - precompile(Tuple{typeof(Plots.autopick), Array{ColorTypes.RGBA{Float64}, 1}, Int64}) - precompile(Tuple{typeof(Plots.iter_segments), Plots.Series}) - precompile(Tuple{typeof(Plots.ensure_gradient!), Base.Dict{Symbol, Any}, Symbol, Symbol}) - precompile(Tuple{typeof(Plots.link_axes!), Plots.GridLayout, Symbol}) - precompile(Tuple{typeof(Plots._override_seriestype_check), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.UnitRange{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.convertLegendValue), Bool}) - precompile(Tuple{typeof(Plots.ensure_gradient!), Base.Dict{Symbol, Any}, Symbol, Symbol}) - precompile(Tuple{typeof(Plots._preprocess_userrecipe), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Array{Symbol, 2}, Int64}) - precompile(Tuple{typeof(Plots.layout_args), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) - precompile(Tuple{typeof(Plots.iter_segments), Array{Float64, 1}, Array{Float64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._update_axis_links), Plots.Plot{Plots.GRBackend}, Plots.Axis, Symbol}) - precompile(Tuple{typeof(Plots._cycle), Array{Plots.Subplot{T} where T<:RecipesBase.AbstractBackend, 1}, Int64}) - precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{String, 1}}, Int64}) - precompile(Tuple{typeof(Plots._update_axis_links), Plots.Plot{Plots.GRBackend}, Plots.Axis, Symbol}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Int64, 1}, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}, Float64}) - precompile(Tuple{typeof(Plots.iter_segments), Array{Float64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Float64, 1}, Array{String, 1}}}) - isdefined(Plots, Symbol("#kw##gr_set_font")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_set_font")), NamedTuple{(:halign, :valign, :rotation), Tuple{Symbol, Symbol, Int64}}, typeof(Plots.gr_set_font), Plots.Font}) - precompile(Tuple{typeof(Plots._binbarlike_baseline), Float64, Symbol}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.prepare_output), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Int64}) - precompile(Tuple{typeof(Plots.get_series_color), ColorTypes.RGBA{Float64}, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Array{Int64, 1}, Int64}) - precompile(Tuple{typeof(Plots.get_series_color), Int64, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) - precompile(Tuple{typeof(Plots.filter_data!), Base.Dict{Symbol, Any}, Array{Int64, 1}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}}) - precompile(Tuple{typeof(Plots.iter_segments), Plots.Series}) - precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Int64}) - precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Function, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._cycle), Array{Any, 1}, Int64}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.addExtension), String, String}) precompile(Tuple{typeof(Plots.series_annotations_shapes!), Plots.Series, Symbol}) - precompile(Tuple{typeof(Plots.wrap_surfaces), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._update_subplot_args), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Int64, Bool}) - precompile(Tuple{typeof(Plots.legendfont), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}}) - precompile(Tuple{typeof(Plots._update_subplot_args), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Int64, Bool}) - precompile(Tuple{typeof(Plots.gr_set_xticks_font), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._hist_edges), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Int64}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.rowsize), Expr}) - precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}, Plots.Series}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}}) - precompile(Tuple{typeof(Plots.gr_update_colorbar!), Plots.GRColorbar, Plots.Series}) - precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Float64}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Float64, Plots.Stroke}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}}) - precompile(Tuple{typeof(Plots.default), Symbol, Array{ColorTypes.RGBA{Float64}, 1}}) - precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Bool}) - precompile(Tuple{typeof(Plots._add_the_series), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) - precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots._display), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._update_plot_args), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._prepare_subplot), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.get_series_color), ColorTypes.RGBA{Float64}, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) - precompile(Tuple{typeof(Plots.compute_xyz), Nothing, Array{Union{Base.Missing, Float64}, 1}, Nothing}) - precompile(Tuple{typeof(Plots.layout_args), Tuple{Int64, Int64}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) - precompile(Tuple{typeof(Plots.get_linestyle), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.UnitRange{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.ylims), Int64}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.UnitRange{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) - precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Array{Float64, 1}, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.get_series_color), ColorTypes.RGBA{Float64}, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) - precompile(Tuple{typeof(Plots.get_series_color), PlotUtils.ColorGradient, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) - precompile(Tuple{typeof(Plots._add_smooth_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._update_axis_colors), Plots.Axis}) - precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Symbol}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._update_plot_args), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.transpose_z), Plots.Series, Array{Float64, 2}, Bool}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.get_series_color), PlotUtils.ColorGradient, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) - precompile(Tuple{typeof(Plots.get_series_color), Symbol, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) - isdefined(Plots, Symbol("#kw##scatter!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter!")), NamedTuple{(:zcolor, :m, :ms, :lab), Tuple{Array{Float64, 1}, Tuple{Symbol, Float64, Plots.Stroke}, Array{Float64, 1}, String}}, typeof(Plots.scatter!), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.slice_arg), Tuple{Int64, Int64}, Int64}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}}) - precompile(Tuple{typeof(Plots.guidefont), Plots.Axis}) - precompile(Tuple{typeof(Plots.allStyles), Symbol}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}}) - precompile(Tuple{typeof(Plots.gr_set_xticks_font), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.ignorenan_minimum), Base.UnitRange{Int64}}) - isdefined(Plots, Symbol("#kw##gr_set_font")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_set_font")), NamedTuple{(:halign, :valign, :rotation), Tuple{Symbol, Symbol, Int64}}, typeof(Plots.gr_set_font), Plots.Font}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.iter_segments), Array{Int64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._add_the_series), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.plotarea!), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) - precompile(Tuple{typeof(Plots.get_markeralpha), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots.slice_arg), Base.ReshapedArray{Int64, 2, Base.UnitRange{Int64}, Tuple{}}, Int64}) - precompile(Tuple{typeof(Plots.compute_xyz), Array{String, 1}, Array{String, 1}, Plots.Surface{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.get_series_color), Symbol, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) - precompile(Tuple{typeof(Plots.legendfont), Plots.Subplot{Plots.GRBackend}}) - isdefined(Plots, Symbol("#kw##scatter")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter")), NamedTuple{(:m, :lab, :bg, :xlim, :ylim), Tuple{Tuple{Int64, Symbol}, Array{String, 2}, Symbol, Tuple{Int64, Int64}, Tuple{Int64, Int64}}}, typeof(Plots.scatter), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.process_ribbon), Int64, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) - precompile(Tuple{typeof(Plots.slice_arg), Base.StepRange{Int64, Int64}, Int64}) - precompile(Tuple{typeof(Plots._hist_edge), Tuple{Array{Float64, 1}}, Int64, Symbol}) - precompile(Tuple{typeof(Plots.process_fillrange), Int64, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, Array{Float64, 1}, Plots.Surface{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.gr_colorbar_colors), Plots.Series, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Bool, Symbol}) - precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.Subplot{Plots.GRBackend}, Array{Measures.Length{:mm, Float64}, 1}}) - precompile(Tuple{typeof(Plots.is_marker_supported), Plots.Shape}) - precompile(Tuple{typeof(Plots.compute_xyz), Nothing, Array{Float64, 1}, Nothing}) - precompile(Tuple{typeof(Plots.attr), Plots.EmptyLayout, Symbol}) - isdefined(Plots, Symbol("#kw##hline!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##hline!")), NamedTuple{(:line,), Tuple{Tuple{Int64, Symbol, Float64, Array{Symbol, 2}}}}, typeof(Plots.hline!), Array{Float64, 2}}) - precompile(Tuple{typeof(Plots.gr_text_size), String, Int64}) - precompile(Tuple{typeof(Plots._prepare_subplot), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._cycle), ColorTypes.RGBA{Float64}, Int64}) - precompile(Tuple{typeof(Plots.ignorenan_maximum), Base.UnitRange{Int64}}) - precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Bool}) - precompile(Tuple{typeof(Plots.process_ribbon), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, typeof(identity), Nothing}) - isdefined(Plots, Symbol("#kw##scatter!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter!")), NamedTuple{(:markersize, :c), Tuple{Int64, Symbol}}, typeof(Plots.scatter!), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.process_ribbon), Nothing, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.ispolar), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.build_layout), Base.Dict{Symbol, Any}}) - isdefined(Plots, Symbol("#kw##portfoliocomposition")) && precompile(Tuple{getfield(Plots, Symbol("#kw##portfoliocomposition")), NamedTuple{(:labels,), Tuple{Array{String, 2}}}, typeof(Plots.portfoliocomposition), Array{Float64, 2}, Int}) - precompile(Tuple{typeof(Plots._cycle), Int64, Int64}) - precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}, Nothing}) - precompile(Tuple{typeof(Plots._update_subplot_colors), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.plotarea!), Plots.GridLayout, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) - precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Bool}) - isdefined(Plots, Symbol("#kw##histogram2d")) && precompile(Tuple{getfield(Plots, Symbol("#kw##histogram2d")), NamedTuple{(:nbins,), Tuple{Int64}}, typeof(Plots.histogram2d), Array{Float64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.titlefont), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.yaxis!), String, Symbol}) precompile(Tuple{typeof(Plots.aliasesAndAutopick), Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Symbol}, Array{Symbol, 1}, Int64}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, typeof(identity)}) - precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, Array{Float64, 1}, Array{Float64, 1}}) - isdefined(Plots, Symbol("#kw##scatter!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter!")), NamedTuple{(:marker, :series_annotations), Tuple{Tuple{Int64, Float64, Symbol}, Array{Any, 1}}}, typeof(Plots.scatter!), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) - precompile(Tuple{typeof(Plots.bbox!), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Char}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, typeof(Base.log), Int64}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}}) + precompile(Tuple{typeof(Plots.default_should_widen), Plots.Axis}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy}}) + precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, String, Symbol}) + precompile(Tuple{typeof(Plots.warnOnUnsupported_scales), Plots.GRBackend, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._update_series_attributes!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._plot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Function, 1}, Int64}}) + precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, String}) + precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Float64, 1}, Array{String, 1}}}) + precompile(Tuple{typeof(Plots.iscontour), Plots.Series}) + precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, Tuple{Int64, Int64}, Symbol}) + precompile(Tuple{typeof(Plots.gr_display), Plots.Plot{Plots.GRBackend}, String}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{String, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.reset_extrema!), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.gr_inqtext), Int64, Int64, String}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._cbar_unique), Array{PlotUtils.ColorGradient, 1}, String}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}}) + precompile(Tuple{typeof(Plots.convert_to_polar), Array{Float64, 1}, Array{Float64, 1}, Tuple{Int64, Float64}}) + precompile(Tuple{typeof(Plots._update_min_padding!), Plots.GridLayout}) + precompile(Tuple{typeof(Plots._process_seriesrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Function, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.ispolar), Plots.Series}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.gr_xaxis_height), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.UnitRange{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Int64}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.process_annotation), Plots.Subplot{Plots.GRBackend}, Int64, Float64, Plots.PlotText, Plots.Font}) + precompile(Tuple{typeof(Plots._add_defaults!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Int64}) + precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{Any, 1}}, Int64}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}}) + precompile(Tuple{typeof(Plots.colorbar_style), Plots.Series}) + precompile(Tuple{typeof(Plots._process_seriesrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._add_markershape), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.make_steps), Array{Float64, 1}, Symbol}) + precompile(Tuple{typeof(Plots.wraptuple), Int64}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Union{Base.Missing, Int64}, 1}}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Array{T, 1} where T, 1}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._bin_centers), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.gr_yaxis_width), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._pick_default_backend)}) + precompile(Tuple{typeof(Plots.gr_legend_pos), Plots.Subplot{Plots.GRBackend}, Float64, Float64}) + precompile(Tuple{typeof(Plots.get_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis}) + precompile(Tuple{typeof(Plots.get_clims), Plots.Series}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Float64, Float64, Int64, Symbol}) + precompile(Tuple{typeof(Plots._hist_edges), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Tuple{Int64, Int64}}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Int64, Symbol}) + precompile(Tuple{typeof(Plots.straightline_data), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}}) + precompile(Tuple{typeof(Plots.is_marker_supported), Symbol}) + precompile(Tuple{typeof(Plots.straightline_data), Tuple{Int64, Int64}, Tuple{Float64, Float64}, Array{Float64, 1}, Array{Float64, 1}, Int64}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.get_markerstrokecolor), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots._preprocess_userrecipe), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots.is_seriestype_supported), Plots.GRBackend, Symbol}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}}) + precompile(Tuple{typeof(Plots._update_subplot_periphery), Plots.Subplot{Plots.GRBackend}, Array{Any, 1}}) + precompile(Tuple{typeof(Plots.gr_set_line), Float64, Symbol, ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.make_steps), Array{Int64, 1}, Symbol}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Function, 1}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.filter_data), Base.UnitRange{Int64}, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.is3d), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Int64, Symbol}) + precompile(Tuple{typeof(Plots._update_series_attributes!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Float64, Int64, Bool}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Float64}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Plots.Spy}}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) + precompile(Tuple{typeof(Plots.recompute_lengths), Array{Measures.Measure, 1}}) + precompile(Tuple{typeof(Plots._preprocess_barlike), Base.Dict{Symbol, Any}, Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Plots.OHLC{T} where T<:Real, 1}}}) + precompile(Tuple{typeof(Plots.create_grid_curly), Expr}) + precompile(Tuple{typeof(Plots._replace_linewidth), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._cbar_unique), Array{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, 1}, String}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.ignorenan_extrema), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.frame), Plots.Animation}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots.xlims), Int64}) + precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Base.StepRange{Int64, Int64}}) + precompile(Tuple{typeof(Plots._prepare_subplot), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Float64, Float64, Int64}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Any}, Int64, Bool}) + precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.GRBackend}, Symbol, Bool, Bool}) + precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Array{Any, 1}}) + precompile(Tuple{typeof(Plots.filter_data), Array{Float64, 1}, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) precompile(Tuple{typeof(Plots.gr_lims), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Bool, Nothing}) + precompile(Tuple{typeof(Plots.make_steps), Base.UnitRange{Int64}, Symbol}) + precompile(Tuple{typeof(Plots.reset_extrema!), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) + precompile(Tuple{typeof(Plots.gr_set_markercolor), ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Array{Any, 1}, Int64, Bool}) + precompile(Tuple{typeof(Plots._update_plot_args), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Float64, Float64, Int64}) + precompile(Tuple{typeof(Plots.gr_inqtext), Int64, Int64, String}) + precompile(Tuple{typeof(Plots._add_errorbar_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Bool}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Plots.PortfolioComposition}}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Nothing, Int64, Bool}) + precompile(Tuple{typeof(Plots.get_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis}) + precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots._update_min_padding!), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.gr_set_line), Int64, Symbol, ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.gr_get_color), Plots.Series}) + precompile(Tuple{typeof(Plots.fg_color), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Array{Float64, 1}, 1}}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Int64, Int64, Plots.Shape}) + precompile(Tuple{typeof(Plots.shape_data), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots._prepare_annotations), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.should_add_to_legend), Plots.Series}) + precompile(Tuple{typeof(Plots._update_min_padding!), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.is_scale_supported), Plots.GRBackend, Symbol}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout, Array{Measures.Length{:mm, Float64}, 1}}) + precompile(Tuple{typeof(Plots._series_index), Base.Dict{Symbol, Any}, Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._process_plotrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}, Array{Base.Dict{Symbol, Any}, 1}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Base.Complex{Float64}, 1}}}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Tuple{Int64, Int64}, Int64, Bool}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.Spy}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.warnOnUnsupported_args), Plots.GRBackend, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Union{Base.Missing, Int64}, 1}}}) + precompile(Tuple{typeof(Plots.backend), Symbol}) + precompile(Tuple{typeof(Plots.ignorenan_extrema), Base.StepRange{Int64, Int64}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.is_marker_supported), Plots.GRBackend, Symbol}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.convert_sci_unicode), String}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Measures.Length{:mm, Float64}, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Int64, Int64, Bool}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots.build_layout), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) + precompile(Tuple{typeof(Plots._cycle), Array{String, 1}, Int64}) + precompile(Tuple{typeof(Plots.ensure_gradient!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots.make_fillrange_side), Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.setxy!), Plots.Plot{Plots.GRBackend}, Tuple{Array{Float64, 1}, Array{Float64, 1}}, Int64}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Bool, Int64, Bool}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.link_subplots), Array{RecipesBase.AbstractLayout, 1}, Symbol}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Symbol, Int64, Bool}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, String, Int64, Bool}) + precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol, Bool}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Function, 1}}) + precompile(Tuple{typeof(Plots._update_subplot_periphery), Plots.Subplot{Plots.GRBackend}, Array{Any, 1}}) + precompile(Tuple{typeof(Plots.ignorenan_extrema), Array{Float64, 2}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Int64}) + precompile(Tuple{typeof(Plots.process_fillrange), Int64, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.make_fillrange_side), Array{Float64, 1}, Int64}) + precompile(Tuple{typeof(Plots.iter_segments), Plots.Series}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}}) + precompile(Tuple{typeof(Plots._update_min_padding!), Plots.GridLayout}) + precompile(Tuple{typeof(Plots.like_histogram), Symbol}) + precompile(Tuple{typeof(Plots.get_series_color), ColorTypes.RGBA{Float64}, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots._replace_linewidth), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.get_markercolor), Plots.Series, Float64, Float64, Int64}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.update_inset_bboxes!), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.gr_text_size), String}) + precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Function, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) + precompile(Tuple{typeof(Plots._process_seriesrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}}) + precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout, Array{Measures.Length{:mm, Float64}, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.slice_arg), ColorTypes.RGBA{Float64}, Int64}) + precompile(Tuple{typeof(Plots._update_subplot_args), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Int64, Bool}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Float64, Float64, Int64}) + precompile(Tuple{typeof(Plots._cycle), Base.StepRange{Int64, Int64}, Int64}) + precompile(Tuple{typeof(Plots.ignorenan_maximum), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.warnOnUnsupported), Plots.GRBackend, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Float64, Int64, Bool}) + precompile(Tuple{typeof(Plots.isvertical), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.warnOnUnsupported_scales), Plots.GRBackend, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Base.Missing}) + precompile(Tuple{typeof(Plots.gr_fill_viewport), Array{Float64, 1}, ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots._process_plotrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}, Array{Base.Dict{Symbol, Any}, 1}}) + precompile(Tuple{typeof(Plots.create_grid_curly), Expr}) + precompile(Tuple{typeof(Plots._add_markershape), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._add_defaults!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Int64}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Bool}) + precompile(Tuple{typeof(Plots._add_smooth_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.title!), String}) + precompile(Tuple{typeof(Plots.prepare_output), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Float64}) + precompile(Tuple{typeof(Plots.has_attribute_segments), Plots.Series}) + precompile(Tuple{typeof(Plots.supported_markers)}) + isdefined(Plots, Symbol("#kw##histogram2d")) && precompile(Tuple{getfield(Plots, Symbol("#kw##histogram2d")), NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio), Tuple{Tuple{Int64, Int64}, Bool, Bool, Int64}}, typeof(Plots.histogram2d), Array{Base.Complex{Float64}, 1}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}}) + precompile(Tuple{typeof(Plots.tickfont), Plots.Axis}) + precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{String, 1}}, Int64}) + precompile(Tuple{typeof(Plots._update_clims), Float64, Float64, Int64, Int64}) + precompile(Tuple{typeof(Plots.wand_edges), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Plots.Surface{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._update_subplot_args), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Int64, Bool}) + precompile(Tuple{typeof(Plots._preprocess_userrecipe), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}}) + precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots.is_marker_supported), Symbol}) + precompile(Tuple{typeof(Plots._update_axis), Plots.Axis, Base.Dict{Symbol, Any}, Symbol, Int64}) + precompile(Tuple{typeof(Plots._subplot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Plots.Stroke}) + precompile(Tuple{typeof(Plots.calc_num_subplots), Plots.GridLayout}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.extendSeriesData), Array{Float64, 1}, Float64}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Int64, Int64, Bool}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Plots.Shape}) + precompile(Tuple{typeof(Plots.is_style_supported), Plots.GRBackend, Symbol}) + precompile(Tuple{typeof(Plots.compute_gridsize), Int64, Int64, Int64}) + precompile(Tuple{typeof(Plots.gr_set_fill), ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots._subplot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{String, 1}, Array{Float64, 1}, Nothing}) + precompile(Tuple{typeof(Plots.is3d), Symbol}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Symbol, Int64, Bool}) + precompile(Tuple{typeof(Plots._update_axis_links), Plots.Plot{Plots.GRBackend}, Plots.Axis, Symbol}) + precompile(Tuple{typeof(Plots._update_series_attributes!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.xlims), Int64}) + precompile(Tuple{typeof(Plots._preprocess_binlike), Base.Dict{Symbol, Any}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Array{String, 1}, Int64}) + precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots.supported_styles)}) + precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Function, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._cycle), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int64}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Array{Int64, 1}, Int64}) + precompile(Tuple{typeof(Plots._add_errorbar_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Nothing}) + precompile(Tuple{typeof(Plots.arrow), Int64}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{String, 1}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Int64}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.filter_data!), Base.Dict{Symbol, Any}, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.add_layout_pct!), Base.Dict{Symbol, Any}, Expr, Int64, Int64}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Array{Any, 1}, Int64, Bool}) + precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{String, 1}}, Int64}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Any}, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, String, Int64, Bool}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.iter_segments), Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.gr_set_yticks_font), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.gr_viewport_from_bbox), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.like_surface), Symbol}) + precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64}) + precompile(Tuple{typeof(Plots._prepare_subplot), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.convertLegendValue), Bool}) + precompile(Tuple{typeof(Plots.get_series_color), Symbol, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Measures.Length{:mm, Float64}, Int64, Bool}) + precompile(Tuple{typeof(Plots.get_series_color), PlotUtils.ColorGradient, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Bool, Int64, Bool}) + precompile(Tuple{typeof(Plots.link_axes!), Plots.GridLayout, Symbol}) + precompile(Tuple{typeof(Plots.process_ribbon), Int64, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Tuple{Int64, Int64}, Int64, Bool}) + precompile(Tuple{typeof(Plots._update_axis_colors), Plots.Axis}) + precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Nothing, Int64, Bool}) + precompile(Tuple{typeof(Plots.gr_text), Float64, Float64, String}) + precompile(Tuple{typeof(Plots.update_inset_bboxes!), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.backend)}) + precompile(Tuple{typeof(Plots.get_series_color), ColorTypes.RGBA{Float64}, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots._add_the_series), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._pick_default_backend)}) + precompile(Tuple{typeof(Plots.trueOrAllTrue), typeof(identity), Array{Symbol, 2}}) + precompile(Tuple{typeof(Plots.nanappend!), Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}}) + precompile(Tuple{typeof(Plots.get_linealpha), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.get_xy), Plots.OHLC{Float64}, Int64, Float64}) + precompile(Tuple{typeof(Plots.tickfont), Plots.Axis}) + precompile(Tuple{typeof(Plots.legendfont), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.all3D), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.get_series_color), Symbol, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.fakedata), Int64, Int64}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._update_subplot_args), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Int64, Bool}) + precompile(Tuple{typeof(Plots.get_series_color), ColorTypes.RGBA{Float64}, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.get_series_color), PlotUtils.ColorGradient, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.convertLegendValue), Symbol}) + precompile(Tuple{typeof(Plots.gr_yaxis_width), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Bool}) + precompile(Tuple{typeof(Plots.link_axes!), Plots.Axis, Plots.Axis}) + precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}, Float64}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Bool, Symbol}) + precompile(Tuple{typeof(Plots.should_add_to_legend), Plots.Series}) + precompile(Tuple{typeof(Plots.gr_set_xticks_font), Plots.Subplot{Plots.GRBackend}}) precompile(Tuple{typeof(Plots.guidefont), Plots.Axis}) - precompile(Tuple{typeof(Plots._preprocess_barlike), Base.Dict{Symbol, Any}, Base.UnitRange{Int64}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.get_markerstrokealpha), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.gr_set_textcolor), ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Float64, Symbol}) + isdefined(Plots, Symbol("#kw##scatter!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter!")), NamedTuple{(:zcolor, :m, :ms, :lab), Tuple{Array{Float64, 1}, Tuple{Symbol, Float64, Plots.Stroke}, Array{Float64, 1}, String}}, typeof(Plots.scatter!), Array{Float64, 1}}) + isdefined(Plots, Symbol("#kw##gr_set_font")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_set_font")), NamedTuple{(:halign, :valign, :rotation), Tuple{Symbol, Symbol, Int64}}, typeof(Plots.gr_set_font), Plots.Font}) + precompile(Tuple{typeof(Plots.backend), Symbol}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + isdefined(Plots, Symbol("#kw##contour")) && precompile(Tuple{getfield(Plots, Symbol("#kw##contour")), NamedTuple{(:fill,), Tuple{Bool}}, typeof(Plots.contour), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) + precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Array{T, 1} where T, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.iter_segments), Base.UnitRange{Int64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.allAlphas), Int64}) + precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots.is_marker_supported), Plots.Shape}) + precompile(Tuple{typeof(Plots.series_annotations), Array{Any, 1}}) + precompile(Tuple{typeof(Plots.gr_set_fillcolor), ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.colorbar_style), Plots.Series}) + precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol, Array{Float64, 1}, Symbol, Tuple{Int64, Int64}}) + isdefined(Plots, Symbol("#kw##hline!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##hline!")), NamedTuple{(:line,), Tuple{Tuple{Int64, Symbol, Float64, Array{Symbol, 2}}}}, typeof(Plots.hline!), Array{Float64, 2}}) + precompile(Tuple{typeof(Plots._display), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.font), String, Int}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.isijulia)}) + precompile(Tuple{typeof(Plots.gr_colorbar_colors), Plots.Series, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.iter_segments), Array{Float64, 1}, Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.plotarea!), Plots.GridLayout, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Array{Symbol, 2}, Int64}) precompile(Tuple{typeof(Plots._transform_ticks), Base.StepRange{Int64, Int64}}) - precompile(Tuple{typeof(Plots.gr_set_gradient), Plots.Series}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Float64}) + precompile(Tuple{typeof(Plots.compute_xyz), Nothing, Nothing, Nothing}) + precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64}) + precompile(Tuple{typeof(Plots.command_idx), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._plot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.yaxis!), String, Symbol}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.gr_set_xticks_font), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._hist_edges), Tuple{Array{Float64, 1}}, Symbol}) + precompile(Tuple{typeof(Plots.rowsize), Expr}) + isdefined(Plots, Symbol("#kw##pie")) && precompile(Tuple{getfield(Plots, Symbol("#kw##pie")), NamedTuple{(:title, :l), Tuple{String, Float64}}, typeof(Plots.pie), Array{String, 1}, Int}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.ohlc), Array{Plots.OHLC{T} where T<:Real, 1}}) + precompile(Tuple{typeof(Plots.get_fillalpha), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots._add_smooth_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._cycle), Int64, Base.StepRange{Int64, Int64}}) + precompile(Tuple{typeof(Plots.create_grid), Symbol}) + precompile(Tuple{typeof(Plots.gr_text_size), String, Int64}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, typeof(identity)}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Array{Float64, 1}, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.gr_text_size), String, Int64}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Array{Symbol, 2}, Symbol}) + precompile(Tuple{typeof(Plots.compute_xyz), Nothing, Array{Union{Base.Missing, Float64}, 1}, Nothing}) + precompile(Tuple{typeof(Plots.gr_contour_levels), Plots.Series, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.slice_arg), Tuple{Int64, Int64}, Int64}) + precompile(Tuple{typeof(Plots.straightline_data), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.UnitRange{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, typeof(identity), Nothing}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{String, 1}, Array{String, 1}, Plots.Surface{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.layout_args), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Int64, 1}, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Nothing}) + precompile(Tuple{typeof(Plots.layout_args), Tuple{Int64, Int64}}) + precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Bool}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, Array{Float64, 1}, Nothing}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.stroke), Int64, Int}) + precompile(Tuple{typeof(Plots.slice_arg), Array{Symbol, 2}, Int64}) precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Float64}) isdefined(Plots, Symbol("#kw##heatmap")) && precompile(Tuple{getfield(Plots, Symbol("#kw##heatmap")), NamedTuple{(:aspect_ratio,), Tuple{Int64}}, typeof(Plots.heatmap), Array{String, 1}, Int}) - precompile(Tuple{typeof(Plots.process_fillrange), Nothing, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.gr_contour_levels), Plots.Series, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots._display), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.is_2tuple), Tuple{Int64, Int64}}) - precompile(Tuple{typeof(Plots._prepare_annotations), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.bottom), Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.trueOrAllTrue), typeof(identity), Array{Symbol, 2}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.labelfunc), Symbol, Plots.GRBackend}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.right), Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) - precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, ColorTypes.RGBA{Float64}, Symbol}) - precompile(Tuple{typeof(Plots._cycle), Int64, Base.StepRange{Int64, Int64}}) - precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Plots.Shape, Symbol}) - precompile(Tuple{typeof(Plots.bbox!), Plots.GridLayout, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) - isdefined(Plots, Symbol("#kw##scatter")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter")), NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks), Tuple{Array{Symbol, 2}, Array{String, 2}, Base.ReshapedArray{Int64, 2, Base.UnitRange{Int64}, Tuple{}}, Int64, String, Int64, Base.UnitRange{Int64}}}, typeof(Plots.scatter), Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}) - precompile(Tuple{typeof(Plots._transform_ticks), Base.UnitRange{Int64}}) - precompile(Tuple{typeof(Plots.process_ribbon), typeof(identity), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) - isdefined(Plots, Symbol("#kw##contour")) && precompile(Tuple{getfield(Plots, Symbol("#kw##contour")), NamedTuple{(:fill,), Tuple{Bool}}, typeof(Plots.contour), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, Array{Float64, 1}, Nothing}) - precompile(Tuple{typeof(Plots.vline!), Array{Int64, 1}}) - precompile(Tuple{typeof(Plots.attr), Plots.EmptyLayout, Symbol, Symbol}) - precompile(Tuple{typeof(Plots.link_axes!), Plots.GridLayout, Symbol}) - isdefined(Plots, Symbol("#kw##pie")) && precompile(Tuple{getfield(Plots, Symbol("#kw##pie")), NamedTuple{(:title, :l), Tuple{String, Float64}}, typeof(Plots.pie), Array{String, 1}, Int}) - precompile(Tuple{typeof(Plots._expand_subplot_extrema), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{String, 1}}) - precompile(Tuple{typeof(Plots.compute_xyz), Array{String, 1}, Array{Float64, 1}, Nothing}) - precompile(Tuple{typeof(Plots.is_marker_supported), Plots.Stroke}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Array{T, 1} where T, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.tovec), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.slice_arg), Base.UnitRange{Int64}, Int64}) - precompile(Tuple{typeof(Plots._hist_edges), Tuple{Array{Float64, 1}}, Symbol}) - precompile(Tuple{typeof(Plots.slice_arg), ColorTypes.RGBA{Float64}, Int64}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.gr_text_size), String, Int64}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._show), Base.IOStream, Base.Multimedia.MIME{Symbol("image/png")}, Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.allAlphas), Int64}) - precompile(Tuple{typeof(Plots.text), String, Symbol}) - precompile(Tuple{typeof(Plots.filter_data), Nothing, Array{Int64, 1}}) - precompile(Tuple{typeof(Plots.title!), String}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:lims, :flip, :ticks, :guide), Tuple{Tuple{Int64, Int64}, Bool, Base.StepRange{Int64, Int64}, String}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.is_attr_supported), Plots.GRBackend, Symbol}) - precompile(Tuple{typeof(Plots.bar), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.nobigs), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Float64, Float64, Tuple{Float64, Float64}, Int64}) - precompile(Tuple{typeof(Plots.text), String, Int64, Symbol, Symbol}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.allStyles), Int64}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Int64, 1}, Tuple{Float64, Float64}, Int64}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Union{Base.Missing, Number}, 1}}) - precompile(Tuple{typeof(Plots.is_seriestype_supported), Symbol}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) - precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Nothing}) - precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}, Plots.Series}) - precompile(Tuple{typeof(Plots.is_2tuple), Tuple{Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._create_backend_figure), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.is_seriestype_supported), Symbol}) - precompile(Tuple{typeof(Plots.text), String, Symbol, Int64, Int}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.extractGroupArgs), Array{String, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.slice_arg), Tuple{Int64, Float64}, Int64}) - precompile(Tuple{typeof(Plots.ylims), Int64}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.xgrid!), Plots.Plot{Plots.GRBackend}, Symbol, Int}) - precompile(Tuple{typeof(Plots.widen), Float64, Float64, Symbol}) - precompile(Tuple{typeof(Plots.slice_arg), Float64, Int64}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Union{Base.Missing, Number}, 1}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Symbol, Symbol, Int64, Float64}}) - precompile(Tuple{typeof(Plots.locate_annotation), Plots.Subplot{Plots.GRBackend}, Int64, Float64, Plots.PlotText}) - precompile(Tuple{typeof(Plots.layout_args), Int64}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._update_subplot_colors), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.autopick_ignore_none_auto), Array{Symbol, 1}, Int64}) - precompile(Tuple{typeof(Plots.gr_update_colorbar!), Plots.GRColorbar, Plots.Series}) - precompile(Tuple{typeof(Plots._scale_adjusted_values), Type{Float64}, Array{Float64, 1}, Symbol}) - precompile(Tuple{typeof(Plots.toppad), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Int64}) - precompile(Tuple{typeof(Plots._cycle), Nothing, Int64}) - precompile(Tuple{typeof(Plots.is_2tuple), Int64}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:foreground_color_grid, :grid, :gridalpha, :gridstyle, :gridlinewidth), Tuple{ColorTypes.RGBA{Float64}, Bool, Float64, Symbol, Int64}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.contour), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:ticks,), Tuple{Nothing}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.create_grid_vcat), Expr}) - precompile(Tuple{typeof(Plots.wraptuple), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.leftpad), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.make_fillrange_from_ribbon), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.wraptuple), Nothing}) - precompile(Tuple{typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}, typeof(identity)}) - precompile(Tuple{typeof(Plots._cycle), Symbol, Int64}) - precompile(Tuple{typeof(Plots.wraptuple), Float64}) - precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Symbol}) - precompile(Tuple{typeof(Plots.slice_arg), Array{ColorTypes.RGBA{Float64}, 2}, Int64}) - precompile(Tuple{typeof(Plots.font), String, Int}) - precompile(Tuple{typeof(Plots.create_grid_vcat), Expr}) - precompile(Tuple{typeof(Plots.fakedata), Int64, Int64}) - precompile(Tuple{typeof(Plots.font), String, Int}) - precompile(Tuple{typeof(Plots.stroke), Int64, Int}) - precompile(Tuple{typeof(Plots.supported_styles), Plots.GRBackend}) - precompile(Tuple{typeof(Plots.xlims), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.gr_set_gradient), Plots.Series}) - precompile(Tuple{typeof(Plots.bottompad), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.slice_arg), Symbol, Int64}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Plots.GridLayout, Int64}) - precompile(Tuple{typeof(Plots.rightpad), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._transform_ticks), Nothing}) - precompile(Tuple{typeof(Plots.slice_arg), String, Int64}) - precompile(Tuple{typeof(Plots.supported_markers), Plots.GRBackend}) - precompile(Tuple{typeof(Plots._expand_subplot_extrema), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.calc_num_subplots), Plots.EmptyLayout}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:grid, :lims, :flip), Tuple{Bool, Tuple{Int64, Int64}, Bool}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.slice_arg), Nothing, Int64}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{String, Tuple{Int64, Int64}, Base.StepRange{Int64, Int64}, Symbol}}) - precompile(Tuple{typeof(Plots.ylims), Plots.Subplot{Plots.GRBackend}}) - isdefined(Plots, Symbol("#@layout")) && precompile(Tuple{getfield(Plots, Symbol("#@layout")), LineNumberNode, Module, Expr}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, ColorTypes.RGB{Float64}, Int64}) - precompile(Tuple{typeof(Plots.rowsize), Symbol}) - precompile(Tuple{typeof(Plots.wraptuple), Array{Any, 1}}) - precompile(Tuple{typeof(Plots.create_grid), Expr}) - precompile(Tuple{typeof(Plots.slice_arg), Int64, Int64}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) precompile(Tuple{typeof(Plots.splittable_kw), Symbol, String, Int64}) - precompile(Tuple{typeof(Plots.slice_arg), Bool, Int64}) - isdefined(Plots, Symbol("#kw##gr_polyline")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_polyline")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Base.UnitRange{Int64}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Array{String, 1}}) - precompile(Tuple{typeof(Plots.unzip), Array{Tuple{Float64, Float64, Float64}, 1}}) - precompile(Tuple{typeof(Plots.gui), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Bool}) - precompile(Tuple{typeof(Plots.font), Symbol, Int}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Float64, Symbol}}) - precompile(Tuple{typeof(Plots._cycle), Float64, Int64}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Base.LinRange{Float64}}) - precompile(Tuple{typeof(Plots.is_2tuple), Tuple{Int64, Float64}}) - precompile(Tuple{typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.get_linewidth), Plots.Series}) - precompile(Tuple{typeof(Plots.gr_display), Plots.Plot{Plots.GRBackend}, String}) - precompile(Tuple{typeof(Plots.wraptuple), Plots.SeriesAnnotations}) - precompile(Tuple{typeof(Plots.slice_arg), Array{Measures.Length{:mm, Float64}, 2}, Int64}) - precompile(Tuple{typeof(Plots._update_axis), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol, Int64}) - precompile(Tuple{typeof(Plots.gr_set_font), Plots.Font}) - precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Bool}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Symbol, Symbol}}) - precompile(Tuple{typeof(Plots.gr_set_font), Plots.Font}) - precompile(Tuple{typeof(Plots._cycle), Plots.Shape, Int64}) - precompile(Tuple{typeof(Plots.font), Int64, Int}) - precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Array{Union{Base.Missing, Float64}, 1}}) - precompile(Tuple{typeof(Plots.slice_arg), Array{Symbol, 2}, Int64}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Array{Symbol, 2}, Int64, Float64, Plots.Stroke}}) - precompile(Tuple{typeof(Plots.get_fillalpha), Plots.Series}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Float64}) - precompile(Tuple{typeof(Plots.replaceAliases!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Symbol}}) - precompile(Tuple{typeof(Plots.get_linealpha), Plots.Series}) - precompile(Tuple{typeof(Plots.is_2tuple), Symbol}) - precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol, Bool}) - precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Tuple{Int64, Int64}}) - precompile(Tuple{typeof(Plots.create_grid), Expr}) - precompile(Tuple{typeof(Plots.get_linestyle), Plots.Series}) - precompile(Tuple{typeof(Plots.get_subplot), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Symbol, Int64, Symbol, Float64}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{}}) - precompile(Tuple{typeof(Plots.make_steps), Nothing, Symbol}) - precompile(Tuple{typeof(Plots._replace_markershape), Array{Symbol, 2}}) - precompile(Tuple{typeof(Plots.prepare_output), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Float64, Symbol, Plots.Stroke}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Symbol}}) - precompile(Tuple{typeof(Plots.prepare_output), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Array{Symbol, 2}}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Float64, Symbol}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Int64}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Symbol, Float64, Array{Symbol, 2}}}) - precompile(Tuple{typeof(Plots.annotations), Array{Any, 1}}) - precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol, Bool}) - precompile(Tuple{typeof(Plots._replace_markershape), Plots.Shape}) + precompile(Tuple{typeof(Plots.is3d), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}}) + precompile(Tuple{typeof(Plots.wraptuple), Nothing}) + precompile(Tuple{typeof(Plots.gr_set_viewport_polar)}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.wrap_surfaces), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._update_axis_links), Plots.Plot{Plots.GRBackend}, Plots.Axis, Symbol}) precompile(Tuple{typeof(Plots._show), Base.IOStream, Base.Multimedia.MIME{Symbol("image/png")}, Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Plots.Shape, Int64, ColorTypes.RGBA{Float64}}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.link_axes!), Plots.Subplot{Plots.GRBackend}, Symbol}) - precompile(Tuple{typeof(Plots.get_series_color), Symbol, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{String, Symbol}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Float64, Array{Symbol, 2}, Int64}}) - precompile(Tuple{typeof(Plots._transform_ticks), Symbol}) - precompile(Tuple{typeof(Plots.link_axes!), Array{RecipesBase.AbstractLayout, 1}, Symbol}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Array{Symbol, 2}, Int64}}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:lims,), Tuple{Tuple{Int64, Float64}}}, typeof(Plots.attr!), Plots.Axis}) - isdefined(Plots, Symbol("#kw##histogram2d")) && precompile(Tuple{getfield(Plots, Symbol("#kw##histogram2d")), NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio), Tuple{Tuple{Int64, Int64}, Bool, Bool, Int64}}, typeof(Plots.histogram2d), Array{Base.Complex{Float64}, 1}}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Union{Base.Missing, Int64}, 1}}) - precompile(Tuple{typeof(Plots.series_annotations), Plots.SeriesAnnotations}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:lims,), Tuple{Tuple{Int64, Int64}}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.ohlc), Array{Plots.OHLC{T} where T<:Real, 1}}) - isdefined(Plots, Symbol("#kw##histogram")) && precompile(Tuple{getfield(Plots, Symbol("#kw##histogram")), NamedTuple{(:bins, :weights), Tuple{Symbol, Array{Int64, 1}}}, typeof(Plots.histogram), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._update_axis), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol, Int64}) - precompile(Tuple{typeof(Plots.get_axis), Plots.Subplot{Plots.GRBackend}, Symbol}) - precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol, Array{Float64, 1}, Symbol, Tuple{Int64, Int64}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.UnitRange{Int64}}) - precompile(Tuple{typeof(Plots._process_userrecipe), Plots.Plot{Plots.GRBackend}, Array{Base.Dict{Symbol, Any}, 1}, RecipesBase.RecipeData}) - precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Tuple{Float64, Float64}, Int64}) - precompile(Tuple{typeof(Plots.link_axes!), Array{RecipesBase.AbstractLayout, 1}, Symbol}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:scale, :guide), Tuple{Symbol, String}}, typeof(Plots.attr!), Plots.Axis}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:grid, :lims), Tuple{Bool, Tuple{Int64, Int64}}}, typeof(Plots.attr!), Plots.Axis}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:ticks,), Tuple{Base.UnitRange{Int64}}}, typeof(Plots.attr!), Plots.Axis}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:grid,), Tuple{Bool}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Float64, 2}, Base.Dict{Symbol, Any}}) - isdefined(Plots, Symbol("#kw##test_examples")) && precompile(Tuple{getfield(Plots, Symbol("#kw##test_examples")), NamedTuple{(:disp,), Tuple{Bool}}, typeof(Plots.test_examples), Symbol}) - isdefined(Plots, Symbol("#kw##default")) && precompile(Tuple{getfield(Plots, Symbol("#kw##default")), NamedTuple{(:palette,), Tuple{Array{ColorTypes.RGBA{Float64}, 1}}}, typeof(Plots.default)}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Int64, 1}}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Int64, 1}}) - isdefined(Plots, Symbol("#kw##_make_hist")) && precompile(Tuple{getfield(Plots, Symbol("#kw##_make_hist")), NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Tuple{Int64, Int64}}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:guide,), Tuple{String}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.is_marker_supported), Plots.Stroke}) + precompile(Tuple{typeof(Plots.inline), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.UnitRange{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.get_xy), Array{Plots.OHLC{T} where T<:Real, 1}, Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots._update_clims), Float64, Float64, Float64, Float64}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) + precompile(Tuple{typeof(Plots._update_subplot_colors), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots._override_seriestype_check), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Nothing}) + precompile(Tuple{typeof(Plots.process_ribbon), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.gr_update_colorbar!), Plots.GRColorbar, Plots.Series}) + precompile(Tuple{typeof(Plots.is_attr_supported), Plots.GRBackend, Symbol}) + precompile(Tuple{typeof(Plots.autopick), Array{ColorTypes.RGBA{Float64}, 1}, Int64}) + precompile(Tuple{typeof(Plots.ensure_gradient!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots._expand_subplot_extrema), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.Spy}}) + precompile(Tuple{typeof(Plots._cycle), Array{Plots.Subplot{T} where T<:RecipesBase.AbstractBackend, 1}, Int64}) + isdefined(Plots, Symbol("#kw##scatter")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter")), NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks), Tuple{Array{Symbol, 2}, Array{String, 2}, Base.ReshapedArray{Int64, 2, Base.UnitRange{Int64}, Tuple{}}, Int64, String, Int64, Base.UnitRange{Int64}}}, typeof(Plots.scatter), Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}) + precompile(Tuple{typeof(Plots._update_axis), Plots.Axis, Base.Dict{Symbol, Any}, Symbol, Int64}) + precompile(Tuple{typeof(Plots.frame), Plots.Animation, Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.get_markeralpha), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots._binbarlike_baseline), Float64, Symbol}) + precompile(Tuple{typeof(Plots._cycle), Array{Any, 1}, Int64}) + precompile(Tuple{typeof(Plots._add_the_series), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}, Plots.Series}) + precompile(Tuple{typeof(Plots._transform_ticks), Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots.create_grid_vcat), Expr}) + precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Bool}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Float64, Float64, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.ylims), Int64}) + precompile(Tuple{typeof(Plots.fg_color), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.slice_arg), Base.StepRange{Int64, Int64}, Int64}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._hist_edges), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Int64}) + precompile(Tuple{typeof(Plots.extractGroupArgs), Array{String, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.get_linestyle), Plots.Series}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + isdefined(Plots, Symbol("#kw##gr_polyline")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_polyline")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Int64}) precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Plots.Plot{Plots.GRBackend}, Int64}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:flip,), Tuple{Bool}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Base.StepRange{Int64, Int64}}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:rotation,), Tuple{Int64}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.ignorenan_minimum), Array{Int64, 1}}) - precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Float64, Symbol}) - isdefined(Plots, Symbol("#kw##_make_hist")) && precompile(Tuple{getfield(Plots, Symbol("#kw##_make_hist")), NamedTuple{(:normed, :weights), Tuple{Bool, Array{Int64, 1}}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}}, Symbol}) + precompile(Tuple{typeof(Plots.get_linealpha), Plots.Series}) + precompile(Tuple{typeof(Plots.slice_arg), Tuple{Int64, Float64}, Int64}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}}) + precompile(Tuple{typeof(Plots.gr_set_gradient), Plots.Series}) + precompile(Tuple{typeof(Plots.get_markerstrokealpha), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots._hist_edge), Tuple{Array{Float64, 1}}, Int64, Symbol}) + precompile(Tuple{typeof(Plots._display), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.allStyles), Int64}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:lims,), Tuple{Tuple{Int64, Float64}}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.get_series_color), Int64, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}}) + precompile(Tuple{typeof(Plots.addExtension), String, String}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.color_or_nothing!), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.xlims), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.guidefont), Plots.Axis}) + precompile(Tuple{typeof(Plots.bottom), Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + precompile(Tuple{typeof(Plots.is_2tuple), Int64}) + precompile(Tuple{typeof(Plots.unzip), Array{Tuple{Float64, Float64, Float64}, 1}}) + precompile(Tuple{typeof(Plots.prepare_output), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.png), Plots.Plot{Plots.GRBackend}, String}) + isdefined(Plots, Symbol("#kw##gr_set_font")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_set_font")), NamedTuple{(:halign, :valign, :rotation), Tuple{Symbol, Symbol, Int64}}, typeof(Plots.gr_set_font), Plots.Font}) + precompile(Tuple{typeof(Plots.compute_xyz), Nothing, Array{Float64, 1}, Nothing}) + precompile(Tuple{typeof(Plots.slice_arg), Array{Measures.Length{:mm, Float64}, 2}, Int64}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._update_axis_colors), Plots.Axis}) + precompile(Tuple{typeof(Plots.iter_segments), Array{Int64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.ispolar), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, ColorTypes.RGBA{Float64}, Symbol}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Float64}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}}) + precompile(Tuple{typeof(Plots.wraptuple), Float64}) + precompile(Tuple{typeof(Plots.process_fillrange), Nothing, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._replace_markershape), Array{Symbol, 2}}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, Array{Float64, 1}, Plots.Surface{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.replaceAliases!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Symbol}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots.vline!), Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.get_linewidth), Plots.Series}) precompile(Tuple{typeof(Plots.series_annotations), Nothing}) + precompile(Tuple{typeof(Plots.ignorenan_maximum), Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}, typeof(identity)}) + precompile(Tuple{typeof(Plots.is_seriestype_supported), Symbol}) + precompile(Tuple{typeof(Plots.ignorenan_minimum), Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots.slice_arg), Array{ColorTypes.RGBA{Float64}, 2}, Int64}) + precompile(Tuple{typeof(Plots.gr_set_font), Plots.Font}) + precompile(Tuple{typeof(Plots.convert_sci_unicode), String}) + precompile(Tuple{typeof(Plots.get_linewidth), Plots.Series, Int64}) + isdefined(Plots, Symbol("#kw##scatter!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter!")), NamedTuple{(:markersize, :c), Tuple{Int64, Symbol}}, typeof(Plots.scatter!), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.process_ribbon), typeof(identity), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.is_2tuple), Tuple{Int64, Int64}}) + precompile(Tuple{typeof(Plots.slice_arg), Int64, Int64}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Plots.GridLayout, Int64}) + precompile(Tuple{typeof(Plots.is_2tuple), Tuple{Int64, Float64}}) + precompile(Tuple{typeof(Plots.slice_arg), Symbol, Int64}) + precompile(Tuple{typeof(Plots._cycle), Float64, Int64}) + precompile(Tuple{typeof(Plots.attr), Plots.EmptyLayout, Symbol}) + precompile(Tuple{typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots._prepare_subplot), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.process_ribbon), Nothing, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._update_plot_args), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.bbox!), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + precompile(Tuple{typeof(Plots.create_grid), Expr}) + isdefined(Plots, Symbol("#kw##histogram2d")) && precompile(Tuple{getfield(Plots, Symbol("#kw##histogram2d")), NamedTuple{(:nbins,), Tuple{Int64}}, typeof(Plots.histogram2d), Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.right), Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + precompile(Tuple{typeof(Plots.slice_arg), String, Int64}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Symbol, Int64, Symbol, Float64}}) + precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.legendfont), Plots.Subplot{Plots.GRBackend}}) isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:grid, :ticks), Tuple{Bool, Nothing}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.process_ribbon), Tuple{Base.LinRange{Float64}, Base.LinRange{Float64}}, Base.Dict{Symbol, Any}}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:lims,), Tuple{Tuple{Int64, Int64}}}, typeof(Plots.attr!), Plots.Axis}) - isdefined(Plots, Symbol("#kw##gr_polyline")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_polyline")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Array{Int64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Int64, Int64, Symbol}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Int32, 1}}) - isdefined(Plots, Symbol("#kw##_make_hist")) && precompile(Tuple{getfield(Plots, Symbol("#kw##_make_hist")), NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Int64}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:grid,), Tuple{Bool}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Int64, Int64}) - precompile(Tuple{typeof(Plots.ignorenan_extrema), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:formatter,), Tuple{Symbol}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Base.UnitRange{Int64}}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Float64, 2}}) - isdefined(Plots, Symbol("#kw##_make_hist")) && precompile(Tuple{getfield(Plots, Symbol("#kw##_make_hist")), NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}}, Symbol}) - precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Array{Symbol, 2}, Symbol}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Plots.Spy}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.aliasesAndAutopick), Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Symbol}, Array{Symbol, 1}, Int64}) + precompile(Tuple{typeof(Plots.slice_arg), Bool, Int64}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.titlefont), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.link_axes!), Plots.GridLayout, Symbol}) + precompile(Tuple{typeof(Plots.slice_arg), Float64, Int64}) + precompile(Tuple{typeof(Plots._update_axis), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol, Int64}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:scale, :guide), Tuple{Symbol, String}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}}) + isdefined(Plots, Symbol("#kw##scatter!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter!")), NamedTuple{(:marker, :series_annotations), Tuple{Tuple{Int64, Float64, Symbol}, Array{Any, 1}}}, typeof(Plots.scatter!), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) + precompile(Tuple{typeof(Plots._preprocess_barlike), Base.Dict{Symbol, Any}, Base.UnitRange{Int64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.gr_lims), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Bool, Nothing}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Array{Symbol, 2}, Int64, Float64, Plots.Stroke}}) precompile(Tuple{typeof(Plots.process_annotation), Plots.Subplot{Plots.GRBackend}, Int64, Float64, Plots.PlotText}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Symbol, Int64}) - precompile(Tuple{typeof(Plots._cycle), Base.UnitRange{Int64}, Array{Int64, 1}}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Float64, Int64}) + isdefined(Plots, Symbol("#kw##portfoliocomposition")) && precompile(Tuple{getfield(Plots, Symbol("#kw##portfoliocomposition")), NamedTuple{(:labels,), Tuple{Array{String, 2}}}, typeof(Plots.portfoliocomposition), Array{Float64, 2}, Int}) + precompile(Tuple{typeof(Plots.plotarea!), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + precompile(Tuple{typeof(Plots.autopick_ignore_none_auto), Array{Symbol, 1}, Int64}) + isdefined(Plots, Symbol("#kw##scatter")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter")), NamedTuple{(:m, :lab, :bg, :xlim, :ylim), Tuple{Tuple{Int64, Symbol}, Array{String, 2}, Symbol, Tuple{Int64, Int64}, Tuple{Int64, Int64}}}, typeof(Plots.scatter), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) + precompile(Tuple{typeof(Plots.get_axis), Plots.Subplot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots.ylims), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.labelfunc), Symbol, Plots.GRBackend}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Plots.Shape, Symbol}) + precompile(Tuple{typeof(Plots.attr), Plots.EmptyLayout, Symbol, Symbol}) + precompile(Tuple{typeof(Plots.bbox!), Plots.GridLayout, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + precompile(Tuple{typeof(Plots.series_annotations_shapes!), Plots.Series, Symbol}) + precompile(Tuple{typeof(Plots.widen), Float64, Float64, Symbol}) + precompile(Tuple{typeof(Plots.link_axes!), Array{RecipesBase.AbstractLayout, 1}, Symbol}) + precompile(Tuple{typeof(Plots.filter_data), Nothing, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.annotate!), Array{Tuple{Int64, Float64, Plots.PlotText}, 1}}) + precompile(Tuple{typeof(Plots._prepare_annotations), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Array{String, 1}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Int64, 1}, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Int64}}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:foreground_color_grid, :grid, :gridalpha, :gridstyle, :gridlinewidth), Tuple{ColorTypes.RGBA{Float64}, Bool, Float64, Symbol, Int64}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots._update_subplot_colors), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.nobigs), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.slice_arg), Base.UnitRange{Int64}, Int64}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, ColorTypes.RGB{Float64}, Int64}) + precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol, Bool}) + precompile(Tuple{typeof(Plots.locate_annotation), Plots.Subplot{Plots.GRBackend}, Int64, Float64, Plots.PlotText}) + precompile(Tuple{typeof(Plots.tovec), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Float64, Symbol}}) + precompile(Tuple{typeof(Plots._cycle), ColorTypes.RGBA{Float64}, Int64}) + precompile(Tuple{typeof(Plots.is_seriestype_supported), Symbol}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Symbol, Float64, Array{Symbol, 2}}}) + precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Float64, Array{Symbol, 2}, Int64}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Symbol, Symbol, Int64, Float64}}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:lims,), Tuple{Tuple{Int64, Int64}}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, typeof(identity), Nothing}) + precompile(Tuple{typeof(Plots._filter_input_data!), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Union{Base.Missing, Number}, 1}}) + precompile(Tuple{typeof(Plots.supported_markers), Plots.GRBackend}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.iter_segments), Plots.Series}) + precompile(Tuple{typeof(Plots.wraptuple), Bool}) + precompile(Tuple{typeof(Plots.text), String, Int64, Symbol, Symbol}) + precompile(Tuple{typeof(Plots.rightpad), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Int32, 1}}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:lims,), Tuple{Tuple{Int64, Int64}}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#@layout")) && precompile(Tuple{getfield(Plots, Symbol("#@layout")), LineNumberNode, Module, Expr}) + precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}, Nothing}) + precompile(Tuple{typeof(Plots.get_linestyle), Plots.Series, Int64}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:lims, :flip, :ticks, :guide), Tuple{Tuple{Int64, Int64}, Bool, Base.StepRange{Int64, Int64}, String}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.leftpad), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.xgrid!), Plots.Plot{Plots.GRBackend}, Symbol, Int}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:guide,), Tuple{String}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:formatter,), Tuple{Symbol}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Int64, 1}}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:rotation,), Tuple{Int64}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.text), String, Symbol, Int64, Int}) + precompile(Tuple{typeof(Plots.supported_styles), Plots.GRBackend}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:flip,), Tuple{Bool}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Int64, 1}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{String, Tuple{Int64, Int64}, Base.StepRange{Int64, Int64}, Symbol}}) + precompile(Tuple{typeof(Plots.is_2tuple), Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.bottompad), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.slice_arg), Base.ReshapedArray{Int64, 2, Base.UnitRange{Int64}, Tuple{}}, Int64}) + precompile(Tuple{typeof(Plots.contour), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) + precompile(Tuple{typeof(Plots.ignorenan_extrema), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) + precompile(Tuple{typeof(Plots.font), String, Int}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots.prepare_output), Plots.Plot{Plots.GRBackend}}) precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Array{Int64, 1}}) - precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout}) - precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout}) - precompile(Tuple{typeof(Plots.build_layout), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.hascolorbar), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{String, Symbol}}) + precompile(Tuple{typeof(Plots.calc_num_subplots), Plots.EmptyLayout}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Symbol}}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Float64, Symbol}) + precompile(Tuple{typeof(Plots.gr_set_line), Int64, Symbol, PlotUtils.ColorGradient}) + precompile(Tuple{typeof(Plots._scale_adjusted_values), Type{Float64}, Array{Float64, 1}, Symbol}) precompile(Tuple{typeof(Plots._process_userrecipe), Plots.Plot{Plots.GRBackend}, Array{Base.Dict{Symbol, Any}, 1}, RecipesBase.RecipeData}) - precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.hascolorbar), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Array{Symbol, 2}, Symbol}) + precompile(Tuple{typeof(Plots.layout_args), Int64}) precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots.toppad), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._expand_subplot_extrema), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.trueOrAllTrue), typeof(Plots.is3d), Symbol}) + precompile(Tuple{typeof(Plots.gui), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Float64, Symbol, Plots.Stroke}}) + precompile(Tuple{typeof(Plots.ylims), Int64}) + precompile(Tuple{typeof(Plots._cycle), Plots.Shape, Int64}) + precompile(Tuple{typeof(Plots.rowsize), Symbol}) + precompile(Tuple{typeof(Plots.create_grid_vcat), Expr}) + precompile(Tuple{typeof(Plots.gr_update_colorbar!), Plots.GRColorbar, Plots.Series}) + precompile(Tuple{typeof(Plots.font), Symbol, Int}) + precompile(Tuple{typeof(Plots._transform_ticks), Nothing}) + precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.get_fillalpha), Plots.Series}) + precompile(Tuple{typeof(Plots.wraptuple), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.fakedata), Int64, Int64}) + precompile(Tuple{typeof(Plots.wraptuple), Plots.SeriesAnnotations}) + precompile(Tuple{typeof(Plots.ignorenan_extrema), Plots.Axis}) + precompile(Tuple{typeof(Plots.slice_arg), Nothing, Int64}) + precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}, Plots.Series}) + precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Bool}) + precompile(Tuple{typeof(Plots.gr_set_gradient), Plots.Series}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Base.LinRange{Float64}}) + precompile(Tuple{typeof(Plots.font), Int64, Int}) + precompile(Tuple{typeof(Plots.hascolorbar), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.gr_display), Plots.Plot{Plots.GRBackend}, String}) + precompile(Tuple{typeof(Plots.gr_set_font), Plots.Font}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Float64, Plots.Stroke}}) + precompile(Tuple{typeof(Plots.slice_arg), Array{String, 2}, Int64}) + precompile(Tuple{typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.wraptuple), Array{Any, 1}}) + precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout}) + precompile(Tuple{typeof(Plots._cycle), Nothing, Int64}) + precompile(Tuple{typeof(Plots._replace_markershape), Plots.Shape}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Array{Symbol, 2}, Symbol}) + precompile(Tuple{typeof(Plots.transpose_z), Plots.Series, Array{Float64, 2}, Bool}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Array{Symbol, 2}}}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Array{Symbol, 2}, Symbol}) + precompile(Tuple{typeof(Plots._cycle), Int64, Int64}) + precompile(Tuple{typeof(Plots.create_grid), Expr}) + precompile(Tuple{typeof(Plots.get_series_color), Symbol, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.is_2tuple), Symbol}) + precompile(Tuple{typeof(Plots._create_backend_figure), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{}}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:grid,), Tuple{Bool}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots._cycle), Symbol, Int64}) + precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.Subplot{Plots.GRBackend}, Array{Measures.Length{:mm, Float64}, 1}}) + precompile(Tuple{typeof(Plots.text), String, Symbol}) + precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Array{Union{Base.Missing, Float64}, 1}}) + precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Tuple{Float64, Float64}, Int64}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:grid, :lims), Tuple{Bool, Tuple{Int64, Int64}}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.link_axes!), Plots.Subplot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Bool}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Int64, Int64}) + precompile(Tuple{typeof(Plots.series_annotations), Plots.SeriesAnnotations}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Symbol, Symbol}}) + precompile(Tuple{typeof(Plots.get_subplot), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Plots.Shape, Int64, ColorTypes.RGBA{Float64}}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Float64, Symbol}}) + precompile(Tuple{typeof(Plots.make_steps), Nothing, Symbol}) + precompile(Tuple{typeof(Plots.annotations), Array{Any, 1}}) + precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Tuple{Int64, Int64}}) + precompile(Tuple{typeof(Plots.bar), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Array{Symbol, 2}, Int64}}) + precompile(Tuple{typeof(Plots._transform_ticks), Symbol}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._show), Base.IOStream, Base.Multimedia.MIME{Symbol("image/png")}, Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Union{Base.Missing, Number}, 1}}) + precompile(Tuple{typeof(Plots.link_axes!), Array{RecipesBase.AbstractLayout, 1}, Symbol}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:grid, :lims, :flip), Tuple{Bool, Tuple{Int64, Int64}, Bool}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Float64, Int64}) + precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout}) + precompile(Tuple{typeof(Plots.process_ribbon), Tuple{Base.LinRange{Float64}, Base.LinRange{Float64}}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._update_axis), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol, Int64}) + precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Float64, 2}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Symbol, Int64}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Int64, Int64, Symbol}) + precompile(Tuple{typeof(Plots.default), Symbol}) + precompile(Tuple{typeof(Plots.layout_args), Plots.GridLayout}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:ticks,), Tuple{Base.UnitRange{Int64}}}, typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.make_fillrange_from_ribbon), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Union{Base.Missing, Int64}, 1}}) + precompile(Tuple{typeof(Plots.hascolorbar), Plots.Subplot{Plots.GRBackend}}) + isdefined(Plots, Symbol("#kw##_make_hist")) && precompile(Tuple{getfield(Plots, Symbol("#kw##_make_hist")), NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Int64}) + precompile(Tuple{typeof(Plots.ignorenan_minimum), Array{Int64, 1}}) + isdefined(Plots, Symbol("#kw##gr_polyline")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_polyline")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Base.UnitRange{Int64}, Array{Float64, 1}}) + isdefined(Plots, Symbol("#kw##histogram")) && precompile(Tuple{getfield(Plots, Symbol("#kw##histogram")), NamedTuple{(:bins, :weights), Tuple{Symbol, Array{Int64, 1}}}, typeof(Plots.histogram), Array{Float64, 1}}) + isdefined(Plots, Symbol("#kw##_make_hist")) && precompile(Tuple{getfield(Plots, Symbol("#kw##_make_hist")), NamedTuple{(:normed, :weights), Tuple{Bool, Array{Int64, 1}}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}}, Symbol}) + precompile(Tuple{typeof(Plots.ignorenan_extrema), Plots.Axis}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:grid,), Tuple{Bool}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##gr_polyline")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_polyline")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Array{Int64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._cycle), Base.UnitRange{Int64}, Array{Int64, 1}}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:ticks,), Tuple{Nothing}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##_make_hist")) && precompile(Tuple{getfield(Plots, Symbol("#kw##_make_hist")), NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Tuple{Int64, Int64}}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Float64, 2}}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._process_userrecipe), Plots.Plot{Plots.GRBackend}, Array{Base.Dict{Symbol, Any}, 1}, RecipesBase.RecipeData}) + precompile(Tuple{typeof(Plots.build_layout), Base.Dict{Symbol, Any}}) + isdefined(Plots, Symbol("#kw##test_examples")) && precompile(Tuple{getfield(Plots, Symbol("#kw##test_examples")), NamedTuple{(:disp,), Tuple{Bool}}, typeof(Plots.test_examples), Symbol}) + isdefined(Plots, Symbol("#kw##_make_hist")) && precompile(Tuple{getfield(Plots, Symbol("#kw##_make_hist")), NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}}, Symbol}) + precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol}) + precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Base.StepRange{Int64, Int64}}) precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Tuple{Float64, Float64}, Int64}) precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.GRBackend}, Symbol}) - precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Array{Symbol, 2}, Symbol}) + precompile(Tuple{typeof(Plots.allStyles), Symbol}) + precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol}) precompile(Tuple{typeof(Plots.get_axis), Plots.Subplot{Plots.GRBackend}, Symbol}) - precompile(Tuple{typeof(Plots.ignorenan_extrema), Plots.Axis}) - precompile(Tuple{typeof(Plots.ignorenan_extrema), Plots.Axis}) - precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol}) - precompile(Tuple{typeof(Plots.backend), Plots.GRBackend}) - precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Tuple{Float64, Float64}, Int64}) - precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol}) precompile(Tuple{typeof(Plots.backend)}) - precompile(Tuple{typeof(Plots.layout_args), Plots.GridLayout}) - precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol}) + precompile(Tuple{typeof(Plots.backend), Plots.GRBackend}) + precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol}) end From a1130efa2f1f257893df39dcd848e5e2ab7ddeb4 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Sat, 30 Nov 2019 09:51:44 +0100 Subject: [PATCH 307/357] allow saving to png with orca --- src/backends/orca.jl | 15 +++++++++++++++ src/init.jl | 6 ++++++ 2 files changed, 21 insertions(+) create mode 100644 src/backends/orca.jl diff --git a/src/backends/orca.jl b/src/backends/orca.jl new file mode 100644 index 00000000..cfd33fe7 --- /dev/null +++ b/src/backends/orca.jl @@ -0,0 +1,15 @@ +function plotlybase_syncplot(plt::Plot) + plt.o = ORCA.PlotlyBase.Plot() + traces = ORCA.PlotlyBase.GenericTrace[] + for series_dict in plotly_series(plt) + plotly_type = pop!(series_dict, :type) + push!(traces, ORCA.PlotlyBase.GenericTrace(plotly_type; series_dict...)) + end + ORCA.PlotlyBase.addtraces!(plt.o, traces...) + layout = plotly_layout(plt) + w, h = plt[:size] + ORCA.PlotlyBase.relayout!(plt.o, layout, width = w, height = h) + return plt.o +end + +_show(io::IO, ::MIME{Symbol("image/png")}, plt::Plot{PlotlyBackend}) = ORCA.PlotlyBase.savefig(io, plotlybase_syncplot(plt), format = "png") diff --git a/src/init.jl b/src/init.jl index ee629f73..c6213001 100644 --- a/src/init.jl +++ b/src/init.jl @@ -46,6 +46,12 @@ function __init__() @require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn) end + @require ORCA = "47be7bcc-f1a6-5447-8b36-7eeeff7534fd" begin + fn = joinpath(@__DIR__, "backends", "orca.jl") + include(fn) + @require Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Revise.track(Plots, fn) + end + @require PGFPlotsX = "8314cec4-20b6-5062-9cdb-752b83310925" begin fn = joinpath(@__DIR__, "backends", "pgfplotsx.jl") include(fn) From 7e05bb0aca34484957808405f3904e93fa9bd38c Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Sat, 30 Nov 2019 10:45:24 +0100 Subject: [PATCH 308/357] try to import ORCA on plotly initialization --- src/backends.jl | 15 +++++++++++---- src/backends/plotly.jl | 1 - 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/backends.jl b/src/backends.jl index 9bcba334..143a929e 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -296,9 +296,6 @@ end _initialize_backend(pkg::GRBackend) = nothing -_initialize_backend(pkg::PlotlyBackend) = nothing - - # ------------------------------------------------------------------------------ # gr @@ -357,6 +354,16 @@ is_marker_supported(::GRBackend, shape::Shape) = true # ------------------------------------------------------------------------------ # plotly +function _initialize_backend(pkg::PlotlyBackend) + try + @eval Main begin + import ORCA + end + catch + @info "For saving to png with the Plotly backend ORCA has to be installed." + end +end + const _plotly_attr = merge_with_base_supported([ :annotations, :background_color_legend, :background_color_inside, :background_color_outside, @@ -708,7 +715,7 @@ const _pgfplotsx_attr = merge_with_base_supported([ const _pgfplotsx_seriestype = [:path, :scatter, :straightline, :path3d, :scatter3d, :surface, :wireframe, - :heatmap, :contour, :contour3d, + :heatmap, :contour, :contour3d, :shape, :steppre, :stepmid, :steppost, :ysticks, :xsticks] const _pgfplotsx_style = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index 4fcb334f..aad9aac1 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -26,7 +26,6 @@ const plotly_remote_file_path = "https://cdn.plot.ly/plotly-latest.min.js" # end using UUIDs -push!(_initialized_backends, :plotly) # ---------------------------------------------------------------- const _plotly_legend_pos = KW( From 2249aaafdf4070b0b52fb67cf5b66f93435bb5c7 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Mon, 2 Dec 2019 11:53:27 +0100 Subject: [PATCH 309/357] up version --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 6304b79a..32baca94 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.1" +version = "0.28.2" [deps] Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" From acbce64be9ec4c6fc951431599ac94463a3cfe11 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 2 Dec 2019 16:31:10 +0100 Subject: [PATCH 310/357] fix fillrange legends --- src/backends/pgfplotsx.jl | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index cc8d7013..8124fbd9 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,5 +1,4 @@ using Contour: Contour - Base.@kwdef mutable struct PGFPlotsXPlot is_created::Bool = false was_shown::Bool = false @@ -249,7 +248,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) PGFPlotsX.print_tex(io, pgfx_fillstyle(opt, i)) style = strip(String(take!(io)),['[',']', ' ']) push!( segment_opt, "legend image code/.code" => """{ - \\draw[##1,/tikz/.cd, $style] (0cm,-0.1cm) rectangle (0.6cm,0.1cm); + \\draw[$style] (0cm,-0.1cm) rectangle (0.6cm,0.1cm); }""" ) end end From ee521107d3706d1ae207fbefe96af6e0520c97b1 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 3 Dec 2019 00:27:11 +0100 Subject: [PATCH 311/357] fix heatmap --- src/backends/pgfplotsx.jl | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index cc8d7013..153d1ced 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -156,7 +156,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) push!(axis_opt, "colorbar" => nothing, "colormap name" => "plots$(sp.attr[:subplot_index])", - "colormap access" => "direct", ) # goto is needed to break out of col and series for @goto colorbar_end @@ -202,7 +201,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) if st == :heatmap push!(axis.options, "view" => "{0}{90}", - "shader" => "flat corner", ) end # treat segments @@ -348,7 +346,7 @@ function pgfx_series_coordinates!(st_val::Union{Val{:scatter}, Val{:scatter3d}}, end function pgfx_series_coordinates!(st_val::Val{:heatmap}, segment_opt, opt, args) push!(segment_opt, - "surf" => nothing, + "matrix plot*" => nothing, "mesh/rows" => length(opt[:x]), "mesh/cols" => length(opt[:y]), ) From e0148ba1a8f0f4fbedd3162e6a43a7a7dce1de00 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Tue, 3 Dec 2019 14:01:36 +0100 Subject: [PATCH 312/357] add checks in get_minor_ticks --- src/axes.jl | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/axes.jl b/src/axes.jl index 085d2bc5..0bf6c2a7 100644 --- a/src/axes.jl +++ b/src/axes.jl @@ -311,7 +311,9 @@ function get_minor_ticks(sp, axis, ticks) minorticks = typeof(ticks[1])[] for (i,hi) in enumerate(ticks[2:end]) lo = ticks[i] - append!(minorticks,collect(lo + (hi-lo)/n :(hi-lo)/n: hi - (hi-lo)/2n)) + if isfinite(lo) && hi > lo + append!(minorticks,collect(lo + (hi-lo)/n :(hi-lo)/n: hi - (hi-lo)/2n)) + end end minorticks[amin .<= minorticks .<= amax] end From e1d45dec5d8b826aa373e3169bee60971e11ad75 Mon Sep 17 00:00:00 2001 From: yha Date: Tue, 3 Dec 2019 17:40:55 +0200 Subject: [PATCH 313/357] Use GR.drawimage for uniform heatmaps; Fix for general color spaces. --- src/backends/gr.jl | 43 +++++++++++++++++++++++++++++++------------ src/utils.jl | 5 +++++ 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index f64eab57..ec93edb7 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -69,6 +69,19 @@ const gr_font_family = Dict( # -------------------------------------------------------------------------------------- +gr_color(c) = gr_color(c, color_type(c)) + +gr_color(c, ::Type{<:AbstractRGB}) = UInt32( round(UInt, clamp(alpha(c) * 255, 0, 255)) << 24 + + round(UInt, clamp(blue(c) * 255, 0, 255)) << 16 + + round(UInt, clamp(green(c) * 255, 0, 255)) << 8 + + round(UInt, clamp(red(c) * 255, 0, 255)) ) +function gr_color(c, ::Type{<:AbstractGray}) + g = round(UInt, clamp(gray(c) * 255, 0, 255)) + α = round(UInt, clamp(alpha(c) * 255, 0, 255)) + rgba = UInt32( α<<24 + g<<16 + g<<8 + g ) +end +gr_color(c, ::Type) = gr_color(RGBA(c), RGB) + function gr_getcolorind(c) gr_set_transparency(float(alpha(c))) convert(Int, GR.inqcolorfromrgb(red(c), green(c), blue(c))) @@ -1318,9 +1331,23 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) x, y = heatmap_edges(series[:x], sp[:xaxis][:scale], series[:y], sp[:yaxis][:scale], size(series[:z])) w, h = length(x) - 1, length(y) - 1 z_normalized = map(x -> GR.jlgr.normalize_color(x, zmin, zmax), z) - z_normalized = map(x -> isnan(x) ? 256/255 : x, z_normalized) # results in color index = 1256 -> transparent - colors = Int32[round(Int32, 1000 + _i * 255) for _i in z_normalized] - GR.nonuniformcellarray(x, y, w, h, colors) + if is_uniformly_spaced(x) && is_uniformly_spaced(y) + # For uniformly spaced data use GR.drawimage, which can be + # much faster than GR.nonuniformcellarray, especially for + # pdf output, and also supports alpha values. + # Note that drawimage draws uniformly spaced data correctly + # even on log scales, where it is visually non-uniform. + colors = plot_color.(series[:fillcolor][z_normalized], series[:fillalpha]) + colors[isnan.(z_normalized)] .= RGBA(0,0,0,0) + rgba = gr_color.(colors) + GR.drawimage(first(x), last(x), last(y), first(y), w, h, rgba) + else + (something(series[:fillalpha],1) < 1 || any(_gr_gradient_alpha .< 1)) && @warn( + "GR: transparency not supported in non-uniform heatmaps. Alpha values ignored.") + z_normalized = map(x -> isnan(x) ? 256/255 : x, z_normalized) # results in color index = 1256 -> transparent + colors = Int32[round(Int32, 1000 + _i * 255) for _i in z_normalized] + GR.nonuniformcellarray(x, y, w, h, colors) + end else phimin, phimax = 0.0, 360.0 # nonuniform polar array is not yet supported in GR.jl nx, ny = length(series[:x]), length(series[:y]) @@ -1439,15 +1466,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) z = transpose_z(series, series[:z].surf, true)' w, h = size(z) xmin, xmax = ignorenan_extrema(series[:x]); ymin, ymax = ignorenan_extrema(series[:y]) - if eltype(z) <: Colors.AbstractGray - grey = round.(UInt8, clamp.(float(z) * 255, 0, 255)) - rgba = map(c -> UInt32( 0xff000000 + UInt(c)<<16 + UInt(c)<<8 + UInt(c) ), grey) - else - rgba = map(c -> UInt32( round(UInt, clamp(alpha(c) * 255, 0, 255)) << 24 + - round(UInt, clamp(blue(c) * 255, 0, 255)) << 16 + - round(UInt, clamp(green(c) * 255, 0, 255)) << 8 + - round(UInt, clamp(red(c) * 255, 0, 255)) ), z) - end + rgba = gr_color.(z) GR.drawimage(xmin, xmax, ymax, ymin, w, h, rgba) end diff --git a/src/utils.jl b/src/utils.jl index 324aa2cb..381f8e75 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -375,6 +375,11 @@ function heatmap_edges(x::AVec, xscale::Symbol, y::AVec, yscale::Symbol, z_size: return x, y end +function is_uniformly_spaced(v; tol=1e-6) + dv = diff(v) + maximum(dv) - minimum(dv) < tol * mean(abs.(dv)) +end + function convert_to_polar(theta, r, r_extrema = ignorenan_extrema(r)) rmin, rmax = r_extrema r = (r .- rmin) ./ (rmax .- rmin) From 374809d3cf2e087d2a5c86334bb7df270744edb7 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Tue, 3 Dec 2019 17:50:40 +0100 Subject: [PATCH 314/357] gr: optimize 'heatmap' logic --- src/backends/gr.jl | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index f64eab57..6b6a8dd4 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -827,6 +827,11 @@ function _update_min_padding!(sp::Subplot{GRBackend}) sp.minpad = Tuple(dpi * [leftpad, toppad, rightpad, bottompad]) end +function is_equally_spaced(v) + d = collect(v[2:end] .- v[1:end-1]) + all(d .≈ d[1]) +end + function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) _update_min_padding!(sp) @@ -1320,7 +1325,11 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) z_normalized = map(x -> GR.jlgr.normalize_color(x, zmin, zmax), z) z_normalized = map(x -> isnan(x) ? 256/255 : x, z_normalized) # results in color index = 1256 -> transparent colors = Int32[round(Int32, 1000 + _i * 255) for _i in z_normalized] - GR.nonuniformcellarray(x, y, w, h, colors) + if is_equally_spaced(x) && is_equally_spaced(y) + GR.cellarray(x[1], x[end], y[1], y[end], w, h, colors) + else + GR.nonuniformcellarray(x, y, w, h, colors) + end else phimin, phimax = 0.0, 360.0 # nonuniform polar array is not yet supported in GR.jl nx, ny = length(series[:x]), length(series[:y]) From 3bc8ffda581057d0986a8f213e45cb9be9cb92a7 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 4 Dec 2019 15:41:37 +0100 Subject: [PATCH 315/357] Ignore clims of series without z colors --- src/utils.jl | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/utils.jl b/src/utils.jl index 324aa2cb..51334ff5 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -344,8 +344,8 @@ const _scale_base = Dict{Symbol, Real}( function _heatmap_edges(v::AVec, isedges::Bool = false) length(v) == 1 && return v[1] .+ [-0.5, 0.5] - if isedges return v end - # `isedges = true` means that v is a vector which already describes edges + if isedges return v end + # `isedges = true` means that v is a vector which already describes edges # and does not need to be extended. vmin, vmax = ignorenan_extrema(v) extra_min = (v[2] - v[1]) / 2 @@ -361,16 +361,16 @@ end function heatmap_edges(x::AVec, xscale::Symbol, y::AVec, yscale::Symbol, z_size::Tuple{Int, Int}) nx, ny = length(x), length(y) - # ismidpoints = z_size == (ny, nx) # This fails some tests, but would actually be + # ismidpoints = z_size == (ny, nx) # This fails some tests, but would actually be # the correct check, since (4, 3) != (3, 4) and a missleading plot is produced. - ismidpoints = prod(z_size) == (ny * nx) + ismidpoints = prod(z_size) == (ny * nx) isedges = z_size == (ny - 1, nx - 1) if !ismidpoints && !isedges - error("""Length of x & y does not match the size of z. + error("""Length of x & y does not match the size of z. Must be either `size(z) == (length(y), length(x))` (x & y define midpoints) or `size(z) == (length(y)+1, length(x)+1))` (x & y define edges).""") end - x, y = heatmap_edges(x, xscale, isedges), + x, y = heatmap_edges(x, xscale, isedges), heatmap_edges(y, yscale, isedges) return x, y end @@ -552,7 +552,7 @@ function get_clims(sp::Subplot) isfinite(clims[1]) && (zmin = clims[1]) isfinite(clims[2]) && (zmax = clims[2]) end - return zmin < zmax ? (zmin, zmax) : (-0.1, 0.1) + return zmin < zmax ? (zmin, zmax) : (NaN, NaN) end function get_clims(sp::Subplot, series::Series) @@ -566,7 +566,7 @@ function get_clims(sp::Subplot, series::Series) isfinite(clims[1]) && (zmin = clims[1]) isfinite(clims[2]) && (zmax = clims[2]) end - return zmin < zmax ? (zmin, zmax) : (-0.1, 0.1) + return zmin < zmax ? (zmin, zmax) : (NaN, NaN) end function get_clims(series::Series) @@ -579,10 +579,10 @@ function get_clims(series::Series) zmin, zmax = _update_clims(zmin, zmax, ignorenan_extrema(vals)...) end end - return zmin < zmax ? (zmin, zmax) : (-0.1, 0.1) + return zmin < zmax ? (zmin, zmax) : (NaN, NaN) end -_update_clims(zmin, zmax, emin, emax) = min(zmin, emin), max(zmax, emax) +_update_clims(zmin, zmax, emin, emax) = NaNMath.min(zmin, emin), NaNMath.max(zmax, emax) @enum ColorbarStyle cbar_gradient cbar_fill cbar_lines From 044daf08d46b496b831248781552a8b18eb6f783 Mon Sep 17 00:00:00 2001 From: Michael Kraus Date: Thu, 5 Dec 2019 10:09:07 +0100 Subject: [PATCH 316/357] generalized array fixes replacing length() and size() with eachindex() and axes(), etc. --- src/args.jl | 9 +++++---- src/axes.jl | 16 ++++++++-------- src/backends/gr.jl | 10 +++++----- src/backends/plotly.jl | 4 ++-- src/backends/pyplot.jl | 8 ++++---- src/components.jl | 6 +++--- src/examples.jl | 2 +- src/pipeline.jl | 2 +- src/recipes.jl | 14 +++++++------- src/series.jl | 38 +++++++++++++++++++------------------- src/utils.jl | 6 +++--- 11 files changed, 58 insertions(+), 57 deletions(-) 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/plotly.jl b/src/backends/plotly.jl index aad9aac1..9297194d 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 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 b448707f..94414a14 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]) @@ -197,7 +197,7 @@ 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)] end From f0b006d3c9587eabba45f92acc6dd50102b14b06 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Thu, 5 Dec 2019 12:52:44 +0100 Subject: [PATCH 317/357] fix clims calculation for line_z etc. --- src/utils.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/utils.jl b/src/utils.jl index b448707f..b54c094f 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -557,7 +557,7 @@ function get_clims(sp::Subplot) isfinite(clims[1]) && (zmin = clims[1]) isfinite(clims[2]) && (zmax = clims[2]) end - return zmin < zmax ? (zmin, zmax) : (NaN, NaN) + return zmin <= zmax ? (zmin, zmax) : (NaN, NaN) end function get_clims(sp::Subplot, series::Series) @@ -571,7 +571,7 @@ function get_clims(sp::Subplot, series::Series) isfinite(clims[1]) && (zmin = clims[1]) isfinite(clims[2]) && (zmax = clims[2]) end - return zmin < zmax ? (zmin, zmax) : (NaN, NaN) + return zmin <= zmax ? (zmin, zmax) : (NaN, NaN) end function get_clims(series::Series) @@ -584,7 +584,7 @@ function get_clims(series::Series) zmin, zmax = _update_clims(zmin, zmax, ignorenan_extrema(vals)...) end end - return zmin < zmax ? (zmin, zmax) : (NaN, NaN) + return zmin <= zmax ? (zmin, zmax) : (NaN, NaN) end _update_clims(zmin, zmax, emin, emax) = NaNMath.min(zmin, emin), NaNMath.max(zmax, emax) From 0fdf46fd2eb2c55665af1b78567fbba6d4abd099 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Thu, 5 Dec 2019 14:06:44 +0100 Subject: [PATCH 318/357] Allow saving to pdf, svg and eps for plotly() via ORCA --- src/backends/orca.jl | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/backends/orca.jl b/src/backends/orca.jl index cfd33fe7..9bc4471c 100644 --- a/src/backends/orca.jl +++ b/src/backends/orca.jl @@ -12,4 +12,13 @@ function plotlybase_syncplot(plt::Plot) return plt.o end -_show(io::IO, ::MIME{Symbol("image/png")}, plt::Plot{PlotlyBackend}) = ORCA.PlotlyBase.savefig(io, plotlybase_syncplot(plt), format = "png") +const _orca_mimeformats = Dict( + "application/pdf" => "pdf", + "image/png" => "png", + "image/svg+xml" => "svg", + "image/eps" => "eps", +) + +for (mime, fmt) in _orca_mimeformats + @eval _show(io::IO, ::MIME{Symbol($mime)}, plt::Plot{PlotlyBackend}) = ORCA.PlotlyBase.savefig(io, plotlybase_syncplot(plt), format = $fmt) +end From cde041e9779b3b40f5fc094bf7434594dd784f6d Mon Sep 17 00:00:00 2001 From: Michael Kraus Date: Thu, 5 Dec 2019 14:09:05 +0100 Subject: [PATCH 319/357] update SegmentsIterator to allow for generalized arrays --- src/backends/plotly.jl | 1 + src/utils.jl | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index 9297194d..03984fb2 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -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/utils.jl b/src/utils.jl index 94414a14..7a70202d 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -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) @@ -199,7 +201,7 @@ function iter_segments(series::Series) if series[:seriestype] in (:scatter, :scatter3d) 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 From 750f96cca7417894d628d109bb134f53d3667801 Mon Sep 17 00:00:00 2001 From: Michael Kraus Date: Fri, 6 Dec 2019 09:34:40 +0100 Subject: [PATCH 320/357] allow for generalized arrays in pgfplots backend --- src/backends/pgfplots.jl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 = [] From ecc891279e274d0d63ec1255fa501d427b5099ab Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 6 Dec 2019 14:36:24 +0100 Subject: [PATCH 321/357] fix background + fill between --- src/backends/pgfplotsx.jl | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 69c0b4b4..867da187 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -8,25 +8,21 @@ Base.@kwdef mutable struct PGFPlotsXPlot # tikz libraries PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usetikzlibrary{arrows.meta}") PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usetikzlibrary{backgrounds}") - PGFPlotsX.push_preamble!(pgfx_plot.the_plot, - """ - \\pgfkeys{/tikz/.cd, - background color/.initial=white, - background color/.get=\\backcol, - background color/.store in=\\backcol, - } - \\tikzset{background rectangle/.style={ - fill=\\backcol, - }, - use background/.style={ - show background rectangle - } - } - """ - ) # pgfplots libraries PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usepgfplotslibrary{patchplots}") PGFPlotsX.push_preamble!(pgfx_plot.the_plot, "\\usepgfplotslibrary{fillbetween}") + # compatibility fixes + # add background layer to standard layers + PGFPlotsX.push_preamble!(pgfx_plot.the_plot, + raw""" + \pgfplotsset{ + /pgfplots/layers/axis on top/.define layer set={ + background, axis background,pre main,main,axis grid,axis ticks,axis lines,axis tick labels, + axis descriptions,axis foreground + }{/pgfplots/layers/standard}, + } + """ + ) pgfx_plot end end @@ -73,9 +69,11 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) cstr = plot_color(bgc) a = alpha(cstr) push!(the_plot.options, - "draw opacity" => a, - "background color" => cstr, - "use background" => nothing, + "/tikz/background rectangle/.style" => PGFPlotsX.Options( + "fill" => cstr, + "draw opacity" => a, + ), + "show background rectangle" => nothing, ) end @@ -121,7 +119,8 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) ), "axis background/.style" => PGFPlotsX.Options( "fill" => sp[:background_color_inside] - ) + ), + "axis on top" => nothing, ) # legend position if sp[:legend] isa Tuple From cfe1ede25a65288534d5d1c5723b5b9bf2488ee4 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 6 Dec 2019 14:40:34 +0100 Subject: [PATCH 322/357] fix ribbon --- src/backends/pgfplotsx.jl | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 867da187..dd410bb3 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -233,7 +233,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end if st == :shape || isfilledcontour(series) || - series[:ribbon] !== nothing + series[:ribbon] === nothing segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) end # add fillrange @@ -606,10 +606,11 @@ function pgfx_add_ribbons!( axis, series, segment_plot, series_func, series_inde ribbon_y = series[:ribbon] opt = series.plotattributes if ribbon_y isa AVec - ribbon_n = length(opt[:y]) ÷ length(ribbon) - ribbon_y = repeat(ribbon, outer = ribbon_n) + ribbon_n = length(opt[:y]) ÷ length(ribbon_y) + ribbon_y = repeat(ribbon_y, outer = ribbon_n) end # upper ribbon + # TODO: use UUIDs ribbon_name_plus = "plots_rib_p$series_index" ribbon_opt_plus = merge(segment_plot.options, PGFPlotsX.Options( "name path" => ribbon_name_plus, From 84347415994f53b5299820da6650dcba8230dba7 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 6 Dec 2019 14:42:35 +0100 Subject: [PATCH 323/357] add test --- test/test_pgfplotsx.jl | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index ca033a52..0629470a 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -133,4 +133,11 @@ end annotate!([(5, y[5], Plots.text("this is \\#5", 16, :red, :center)), (10, y[10], Plots.text("this is \\#10", :right, 20, "courier"))]) scatter!(range(2, stop=8, length=6), rand(6), marker=(50, 0.2, :orange), series_annotations=["series", "annotations", "map", "to", "series", Plots.text("data", :green)]) end # testset -end # testset + @testset "Ribbon" begin + aa = rand(10) + bb = rand(10) + cc = rand(10) + conf = [aa-cc bb-cc] + p = plot(collect(1:10),fill(1,10), ribbon=conf) + end # testset + end # testset From d0be1e7d1d7828abcc6a7b9f2fdd44f0d175d4c6 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 6 Dec 2019 14:45:56 +0100 Subject: [PATCH 324/357] use UUIDs --- src/backends/pgfplotsx.jl | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index dd410bb3..48ea317a 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -1,4 +1,5 @@ using Contour: Contour +using UUIDs Base.@kwdef mutable struct PGFPlotsXPlot is_created::Bool = false was_shown::Bool = false @@ -610,8 +611,8 @@ function pgfx_add_ribbons!( axis, series, segment_plot, series_func, series_inde ribbon_y = repeat(ribbon_y, outer = ribbon_n) end # upper ribbon - # TODO: use UUIDs - ribbon_name_plus = "plots_rib_p$series_index" + rib_uuid = uuid4() + ribbon_name_plus = "plots_rib_p$rib_uuid" ribbon_opt_plus = merge(segment_plot.options, PGFPlotsX.Options( "name path" => ribbon_name_plus, "color" => opt[:fillcolor], @@ -624,7 +625,7 @@ function pgfx_add_ribbons!( axis, series, segment_plot, series_func, series_inde ) push!(axis, ribbon_plot_plus) # lower ribbon - ribbon_name_minus = "plots_rib_m$series_index" + ribbon_name_minus = "plots_rib_m$rib_uuid" ribbon_opt_minus = merge(segment_plot.options, PGFPlotsX.Options( "name path" => ribbon_name_minus, "color" => opt[:fillcolor], From 7b31e5f9b83e9f5e4a2fe0032fc355c2f5bce2f0 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 6 Dec 2019 15:04:22 +0100 Subject: [PATCH 325/357] fix ribbon legend --- src/backends/pgfplotsx.jl | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 48ea317a..a1f5d506 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -240,17 +240,12 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) # add fillrange if series[:fillrange] !== nothing && !isfilledcontour(series) && series[:ribbon] === nothing pgfx_fillrange_series!( axis, series, series_func, i, _cycle(series[:fillrange], rng), rng) - # add to legend? if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) - io = IOBuffer() - PGFPlotsX.print_tex(io, pgfx_fillstyle(opt, i)) - style = strip(String(take!(io)),['[',']', ' ']) - push!( segment_opt, "legend image code/.code" => """{ - \\draw[$style] (0cm,-0.1cm) rectangle (0.6cm,0.1cm); - }""" ) + 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), @@ -264,7 +259,11 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end # add to legend? if i == 1 && opt[:label] != "" && sp[:legend] != :none && should_add_to_legend(series) - legend = PGFPlotsX.LegendEntry(PGFPlotsX.Options(), opt[:label], true) + 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 @@ -499,6 +498,15 @@ function pgfx_arrow( arr::Arrow ) return "every arrow/.append style={$(components)}" end +function pgfx_filllegend!( series_opt, opt ) + io = IOBuffer() + PGFPlotsX.print_tex(io, pgfx_fillstyle(opt)) + style = strip(String(take!(io)),['[',']', ' ']) + push!( series_opt, "legend image code/.code" => """{ + \\draw[$style] (0cm,-0.1cm) rectangle (0.6cm,0.1cm); + }""" ) +end + function pgfx_colormap(grad::ColorGradient) join(map(grad.colors) do c @sprintf("rgb=(%.8f,%.8f,%.8f)", red(c), green(c), blue(c)) From 2a720a74910c6b4ce39120739bf6a6411a9bc5ab Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 6 Dec 2019 16:04:10 +0100 Subject: [PATCH 326/357] better ribbon tests --- test/test_pgfplotsx.jl | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 0629470a..dfbed5f0 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -139,5 +139,13 @@ end cc = rand(10) conf = [aa-cc bb-cc] p = plot(collect(1:10),fill(1,10), ribbon=conf) + Plots._update_plot_object(p) + axis = Plots.pgfx_axes(p.o)[1] + plots = filter(x->x isa PGFPlotsX.Plot, axis.contents) + @test length(plots) == 4 + @test !haskey(plots[1].options.dict, "fill") + @test !haskey(plots[2].options.dict, "fill") + @test !haskey(plots[3].options.dict, "fill") + @test haskey(plots[4].options.dict, "fill") end # testset end # testset From 9534bae4efeb533cff3c94de559b5c1071d9803d Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 6 Dec 2019 18:22:02 +0100 Subject: [PATCH 327/357] support asymmetric ribbons --- src/backends/pgfplotsx.jl | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index a1f5d506..c714d493 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -613,10 +613,17 @@ 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) - ribbon_y = repeat(ribbon_y, outer = ribbon_n) + ribbon_yp = ribbon_ym = repeat(ribbon_y, outer = ribbon_n) + elseif ribbon_y isa Tuple + ribbon_ym, ribbon_yp = ribbon_y + ribbon_nm = length(opt[:y]) ÷ length(ribbon_ym) + ribbon_ym = repeat(ribbon_ym, outer = ribbon_nm) + ribbon_np = length(opt[:y]) ÷ length(ribbon_yp) + ribbon_yp = repeat(ribbon_yp, outer = ribbon_np) end # upper ribbon rib_uuid = uuid4() @@ -626,7 +633,7 @@ function pgfx_add_ribbons!( axis, series, segment_plot, series_func, series_inde "color" => opt[:fillcolor], "draw opacity" => opt[:fillalpha] )) - coordinates_plus = PGFPlotsX.Coordinates(opt[:x], opt[:y] .+ ribbon_y) + coordinates_plus = PGFPlotsX.Coordinates(opt[:x], opt[:y] .+ ribbon_yp) ribbon_plot_plus = series_func( ribbon_opt_plus, coordinates_plus @@ -639,7 +646,7 @@ function pgfx_add_ribbons!( axis, series, segment_plot, series_func, series_inde "color" => opt[:fillcolor], "draw opacity" => opt[:fillalpha] )) - coordinates_plus = PGFPlotsX.Coordinates(opt[:x], opt[:y] .- ribbon_y) + coordinates_plus = PGFPlotsX.Coordinates(opt[:x], opt[:y] .- ribbon_ym) ribbon_plot_plus = series_func( ribbon_opt_minus, coordinates_plus From d2c0840c43ec4d8bd9bd13b6bae7e1fb1c0fffb4 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Fri, 6 Dec 2019 19:37:35 +0100 Subject: [PATCH 328/357] fix dimensions --- src/backends/pgfplotsx.jl | 11 ++++++----- test/test_pgfplotsx.jl | 21 ++++++++++++++++----- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index c714d493..92e515e3 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -88,22 +88,22 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) "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" : "{}", + "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) + sp_width = width(bb) + sp_height = height(bb) cstr = plot_color(sp[:background_color_legend]) a = alpha(cstr) fg_alpha = alpha(plot_color(sp[:foreground_color_legend])) title_cstr = plot_color(sp[:titlefontcolor]) title_a = alpha(title_cstr) axis_opt = PGFPlotsX.Options( - "height" => string(height(bb)), - "width" => string(width(bb)), "title" => sp[:title], "title style" => PGFPlotsX.Options( "font" => pgfx_font(sp[:titlefontsize], pgfx_thickness_scaling(sp)), @@ -123,6 +123,8 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) ), "axis on top" => nothing, ) + sp_width > 0*mm ? push!(axis_opt, "width" => string(sp_width)) : nothing + sp_height > 0*mm ? push!(axis_opt, "height" => string(sp_height)) : nothing # legend position if sp[:legend] isa Tuple x, y = sp[:legend] @@ -613,7 +615,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) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index dfbed5f0..90167f90 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -124,28 +124,39 @@ end u = ones(length(x)) v = cos.(x) - plot( x, y, quiver = (u, v), arrow = true ) + arrow_plot = plot( x, y, quiver = (u, v), arrow = true ) # TODO: could adjust limits to fit arrows if too long, but how? + mktempdir() do path + @test_nowarn savefig(arrow_plot, path*"arrow.pdf") + end end # testset @testset "Annotations" begin y = rand(10) plot(y, annotations=(3, y[3], Plots.text("this is \\#3", :left)), leg=false) annotate!([(5, y[5], Plots.text("this is \\#5", 16, :red, :center)), (10, y[10], Plots.text("this is \\#10", :right, 20, "courier"))]) - scatter!(range(2, stop=8, length=6), rand(6), marker=(50, 0.2, :orange), series_annotations=["series", "annotations", "map", "to", "series", Plots.text("data", :green)]) + annotation_plot = scatter!(range(2, stop=8, length=6), rand(6), marker=(50, 0.2, :orange), series_annotations=["series", "annotations", "map", "to", "series", Plots.text("data", :green)]) + mktempdir() do path + @test_nowarn savefig(annotation_plot, path*"annotation.pdf") + end end # testset @testset "Ribbon" begin aa = rand(10) bb = rand(10) cc = rand(10) conf = [aa-cc bb-cc] - p = plot(collect(1:10),fill(1,10), ribbon=conf) - Plots._update_plot_object(p) - axis = Plots.pgfx_axes(p.o)[1] + ribbon_plot = plot(collect(1:10),fill(1,10), ribbon=(conf[:,1],conf[:,2])) + Plots._update_plot_object(ribbon_plot) + axis = Plots.pgfx_axes(ribbon_plot.o)[1] plots = filter(x->x isa PGFPlotsX.Plot, axis.contents) @test length(plots) == 4 @test !haskey(plots[1].options.dict, "fill") @test !haskey(plots[2].options.dict, "fill") @test !haskey(plots[3].options.dict, "fill") @test haskey(plots[4].options.dict, "fill") + @test ribbon_plot.o !== nothing + @test ribbon_plot.o.the_plot !== nothing + mktempdir() do path + @test_nowarn savefig(ribbon_plot, path*"ribbon.svg") + end end # testset end # testset From 74ec895aca2a87039e756922c48ab1181debea3f Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Sat, 7 Dec 2019 15:18:47 +0100 Subject: [PATCH 329/357] fix unintended filling of simple lines --- src/backends/pgfplotsx.jl | 3 +-- test/test_pgfplotsx.jl | 3 +++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 92e515e3..6578ff0f 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -235,8 +235,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) segment_opt = merge( segment_opt, pgfx_marker(opt, i) ) end if st == :shape || - isfilledcontour(series) || - series[:ribbon] === nothing + isfilledcontour(series) segment_opt = merge( segment_opt, pgfx_fillstyle(opt, i) ) end # add fillrange diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 90167f90..a9cebf44 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -16,6 +16,9 @@ end Plots._update_plot_object(pgfx_plot) @test pgfx_plot.o.the_plot isa PGFPlotsX.TikzDocument @test pgfx_plot.series_list[1].plotattributes[:quiver] === nothing + axis = Plots.pgfx_axes(pgfx_plot.o)[1] + @test count( x-> x isa PGFPlotsX.Plot, axis.contents ) == 1 + @test !haskey(axis.contents[1].options.dict, "fill") @testset "3D docs example" begin n = 100 From 203e351cefb6b9956308cb5265fe76e36ab7c7c5 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 9 Dec 2019 11:17:37 +0100 Subject: [PATCH 330/357] fix scalar ribbon --- src/backends/pgfplotsx.jl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 6578ff0f..7ff357f1 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -624,6 +624,8 @@ function pgfx_add_ribbons!( axis, series, segment_plot, series_func, series_inde ribbon_ym = repeat(ribbon_ym, outer = ribbon_nm) ribbon_np = length(opt[:y]) ÷ length(ribbon_yp) ribbon_yp = repeat(ribbon_yp, outer = ribbon_np) + else + ribbon_yp = ribbon_ym = ribbon_y end # upper ribbon rib_uuid = uuid4() From 0e694a976752b937b8aaa2645b8f7a53e15199b2 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Mon, 9 Dec 2019 11:21:33 +0100 Subject: [PATCH 331/357] forget extra ribbon plot legend entries --- src/backends/pgfplotsx.jl | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index 7ff357f1..367f181a 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -633,7 +633,8 @@ function pgfx_add_ribbons!( axis, series, segment_plot, series_func, series_inde ribbon_opt_plus = merge(segment_plot.options, PGFPlotsX.Options( "name path" => ribbon_name_plus, "color" => opt[:fillcolor], - "draw opacity" => opt[:fillalpha] + "draw opacity" => opt[:fillalpha], + "forget plot" => nothing )) coordinates_plus = PGFPlotsX.Coordinates(opt[:x], opt[:y] .+ ribbon_yp) ribbon_plot_plus = series_func( @@ -646,7 +647,8 @@ function pgfx_add_ribbons!( axis, series, segment_plot, series_func, series_inde ribbon_opt_minus = merge(segment_plot.options, PGFPlotsX.Options( "name path" => ribbon_name_minus, "color" => opt[:fillcolor], - "draw opacity" => opt[:fillalpha] + "draw opacity" => opt[:fillalpha], + "forget plot" => nothing )) coordinates_plus = PGFPlotsX.Coordinates(opt[:x], opt[:y] .- ribbon_ym) ribbon_plot_plus = series_func( @@ -656,7 +658,7 @@ function pgfx_add_ribbons!( axis, series, segment_plot, series_func, series_inde push!(axis, ribbon_plot_plus) # fill push!(axis, series_func( - pgfx_fillstyle(opt, series_index), + merge(pgfx_fillstyle(opt, series_index), PGFPlotsX.Options("forget plot" => nothing)), "fill between [of=$(ribbon_name_plus) and $(ribbon_name_minus)]" )) return axis From fbbbd40353478eba7b43ad8eb55cbe3ece96982f Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Tue, 10 Dec 2019 13:12:35 +0100 Subject: [PATCH 332/357] fix extra blank space in GR with log axis and engineering notation --- src/backends/gr.jl | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index fe97c31b..b6432a58 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -1116,9 +1116,10 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) # @show cv dv ymin xi yi flip mirror (flip $ mirror) if xaxis[:ticks] in (:auto, :native) # ensure correct dispatch in gr_text for automatic log ticks - if xaxis[:scale] in _logScales - dv = string(dv, "\\ ") - elseif xaxis[:formatter] in (:scientific, :auto) + if xaxis[:formatter] in (:scientific, :auto) + if xaxis[:scale] in _logScales + dv = string(dv, "\\ ") + end dv = convert_sci_unicode(dv) end end @@ -1135,9 +1136,10 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) # @show cv dv xmin xi yi if yaxis[:ticks] in (:auto, :native) # ensure correct dispatch in gr_text for automatic log ticks - if yaxis[:scale] in _logScales - dv = string(dv, "\\ ") - elseif yaxis[:formatter] in (:scientific, :auto) + if yaxis[:formatter] in (:scientific, :auto) + if yaxis[:scale] in _logScales + dv = string(dv, "\\ ") + end dv = convert_sci_unicode(dv) end end From e615718f1baf88e01a05e76247848d7491f9e5c5 Mon Sep 17 00:00:00 2001 From: Michael Krabbe Borregaard Date: Tue, 10 Dec 2019 22:15:57 +0100 Subject: [PATCH 333/357] up version --- NEWS.md | 12 ++++++------ Project.toml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/NEWS.md b/NEWS.md index f280a5de..33ae2e4c 100644 --- a/NEWS.md +++ b/NEWS.md @@ -3,14 +3,14 @@ #### notes on release changes, ongoing development, and future planned work -- Minor version 0.17 is the last one to support Julia 0.6!! -- Minor version 0.11 is the last one to support Julia 0.5!! - - Critical bugfixes only - - `backports` branch is for Julia 0.5 - ---- ## (current master) +## 0.28.3 +- support generalized array interface +- save to pdf, svg and eps in plotlyjs +- fix for clims in line_z +- optimize heatmap logic in gr + ## 0.26.3 - fix `vline` with dates - fix PyPlot logscale bug diff --git a/Project.toml b/Project.toml index 32baca94..2333f22d 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.2" +version = "0.28.3" [deps] Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" From 9b3cf3a818e747da03674ff06e5996fa9497d3ec Mon Sep 17 00:00:00 2001 From: Niklas Korsbo Date: Wed, 11 Dec 2019 10:58:39 +0000 Subject: [PATCH 334/357] Support colons in layout kwarg. --- src/layouts.jl | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/layouts.jl b/src/layouts.jl index f05fcde5..d7945699 100644 --- a/src/layouts.jl +++ b/src/layouts.jl @@ -469,7 +469,7 @@ function layout_args(plotattributes::KW) end function layout_args(plotattributes::KW, n_override::Integer) - layout, n = layout_args(get(plotattributes, :layout, n_override)) + layout, n = layout_args(n_override, get(plotattributes, :layout, n_override)) if n != n_override error("When doing layout, n ($n) != n_override ($(n_override)). You're probably trying to force existing plots into a layout that doesn't fit them.") end @@ -481,12 +481,26 @@ function layout_args(n::Integer) GridLayout(nr, nc), n end -function layout_args(sztup::NTuple{2,I}) where I<:Integer +function layout_args(sztup::NTuple{2, Integer}) nr, nc = sztup GridLayout(nr, nc), nr*nc end -function layout_args(sztup::NTuple{3,I}) where I<:Integer +layout_args(n_override::Integer, n::Integer) = layout_args(n) + +function layout_args(n, sztup::Tuple{Colon, Integer}) + nc = sztup[2] + nr = ceil(Int, n / nc) + GridLayout(nr, nc), n +end + +function layout_args(n, sztup::Tuple{Integer, Colon}) + nr = sztup[1] + nc = ceil(Int, n / nr) + GridLayout(nr, nc), n +end + +function layout_args(sztup::NTuple{3, Integer}) n, nr, nc = sztup nr, nc = compute_gridsize(n, nr, nc) GridLayout(nr, nc), n From e54eb53665949fc504e5488d855c1103d90cb0df Mon Sep 17 00:00:00 2001 From: Niklas Korsbo Date: Wed, 11 Dec 2019 11:11:14 +0000 Subject: [PATCH 335/357] Fix layout specification bug. --- src/layouts.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/layouts.jl b/src/layouts.jl index d7945699..f7cbc0ef 100644 --- a/src/layouts.jl +++ b/src/layouts.jl @@ -487,6 +487,7 @@ function layout_args(sztup::NTuple{2, Integer}) end layout_args(n_override::Integer, n::Integer) = layout_args(n) +layout_args(n, sztup::NTuple{2, Integer}) = layout_args(sztup) function layout_args(n, sztup::Tuple{Colon, Integer}) nc = sztup[2] From 3dec7fe3944bb0027a04d7e6c9daec2846d1e849 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Wed, 11 Dec 2019 13:09:48 +0100 Subject: [PATCH 336/357] comment save tests --- test/test_pgfplotsx.jl | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index a9cebf44..894e393a 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -129,18 +129,19 @@ end v = cos.(x) arrow_plot = plot( x, y, quiver = (u, v), arrow = true ) # TODO: could adjust limits to fit arrows if too long, but how? - mktempdir() do path - @test_nowarn savefig(arrow_plot, path*"arrow.pdf") - end + # TODO: get latex available on CI + # mktempdir() do path + # @test_nowarn savefig(arrow_plot, path*"arrow.pdf") + # end end # testset @testset "Annotations" begin y = rand(10) plot(y, annotations=(3, y[3], Plots.text("this is \\#3", :left)), leg=false) annotate!([(5, y[5], Plots.text("this is \\#5", 16, :red, :center)), (10, y[10], Plots.text("this is \\#10", :right, 20, "courier"))]) annotation_plot = scatter!(range(2, stop=8, length=6), rand(6), marker=(50, 0.2, :orange), series_annotations=["series", "annotations", "map", "to", "series", Plots.text("data", :green)]) - mktempdir() do path - @test_nowarn savefig(annotation_plot, path*"annotation.pdf") - end + # mktempdir() do path + # @test_nowarn savefig(annotation_plot, path*"annotation.pdf") + # end end # testset @testset "Ribbon" begin aa = rand(10) @@ -158,8 +159,8 @@ end @test haskey(plots[4].options.dict, "fill") @test ribbon_plot.o !== nothing @test ribbon_plot.o.the_plot !== nothing - mktempdir() do path - @test_nowarn savefig(ribbon_plot, path*"ribbon.svg") - end - end # testset + # mktempdir() do path + # @test_nowarn savefig(ribbon_plot, path*"ribbon.svg") + # end + # end # testset end # testset From 28d5e0bb7d0967e1fd825f8895fec8012aed3817 Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Wed, 11 Dec 2019 13:23:50 +0100 Subject: [PATCH 337/357] commented too much --- test/test_pgfplotsx.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_pgfplotsx.jl b/test/test_pgfplotsx.jl index 894e393a..91456fe3 100644 --- a/test/test_pgfplotsx.jl +++ b/test/test_pgfplotsx.jl @@ -162,5 +162,5 @@ end # mktempdir() do path # @test_nowarn savefig(ribbon_plot, path*"ribbon.svg") # end - # end # testset + end # testset end # testset From 140a429e09c5ccad7c51d48e53d664da67e33e62 Mon Sep 17 00:00:00 2001 From: Niklas Korsbo Date: Wed, 11 Dec 2019 12:27:44 +0000 Subject: [PATCH 338/357] Fix regression of layout_args. --- src/layouts.jl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/layouts.jl b/src/layouts.jl index f7cbc0ef..1bc5367b 100644 --- a/src/layouts.jl +++ b/src/layouts.jl @@ -514,6 +514,8 @@ function layout_args(layout::GridLayout) layout, n end +layout_args(n_override::Integer, layout::GridLayout) = layout_args(layout) + layout_args(huh) = error("unhandled layout type $(typeof(huh)): $huh") From f105d41e542b4426b54e740f1c3e6ec9f498c660 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 12 Dec 2019 03:02:30 +0000 Subject: [PATCH 339/357] CompatHelper: bump compat for "Requires" to "1.0" --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 2333f22d..f9576daf 100644 --- a/Project.toml +++ b/Project.toml @@ -43,7 +43,7 @@ PlotThemes = "1" PlotUtils = "0.6.1" RecipesBase = "0.6, 0.7" Reexport = "0.2" -Requires = "0.5" +Requires = "0.5, 1.0" Showoff = "0.3.1" StatsBase = "0.32" julia = "1" From 05ef841d63eb0ee96301ce6331f73a4081d19b3e Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 20 Nov 2019 09:23:05 +0100 Subject: [PATCH 340/357] simplify axes_drawing_info --- src/axes.jl | 94 +++++++++++++++++++++++------------------------------ 1 file changed, 40 insertions(+), 54 deletions(-) diff --git a/src/axes.jl b/src/axes.jl index 1215ea24..ab1bd6be 100644 --- a/src/axes.jl +++ b/src/axes.jl @@ -637,13 +637,13 @@ function axis_drawing_info(sp::Subplot) if sp[:framestyle] != :none # xaxis + y1, y2 = if sp[:framestyle] in (:origin, :zerolines) + 0.0, 0.0 + else + xor(xaxis[:mirror], yaxis[:flip]) ? (ymax, ymin) : (ymin, ymax) + end if xaxis[:showaxis] if sp[:framestyle] != :grid - y1, y2 = if sp[:framestyle] in (:origin, :zerolines) - 0.0, 0.0 - else - xor(xaxis[:mirror], yaxis[:flip]) ? (ymax, ymin) : (ymin, ymax) - end push!(xaxis_segs, (xmin, y1), (xmax, y1)) # don't show the 0 tick label for the origin framestyle if sp[:framestyle] == :origin && !(xticks in (:none, nothing, false)) && length(xticks) > 1 @@ -657,54 +657,47 @@ function axis_drawing_info(sp::Subplot) f = scalefunc(yaxis[:scale]) invf = invscalefunc(yaxis[:scale]) ticks_in = xaxis[:tick_direction] == :out ? -1 : 1 - t1 = invf(f(ymin) + 0.015 * (f(ymax) - f(ymin)) * ticks_in) - t2 = invf(f(ymax) - 0.015 * (f(ymax) - f(ymin)) * ticks_in) - t3 = invf(f(0) + 0.015 * (f(ymax) - f(ymin)) * ticks_in) + t1 = invf(f(y1) + 0.01 * (f(y2) - f(y1)) * ticks_in) + t2 = invf(f(0) + 0.01 * (f(ymax) - f(ymin))) for xtick in xticks[1] if xaxis[:showaxis] tick_start, tick_stop = if sp[:framestyle] == :origin - (0, t3) + (-t2, t2) else - xor(xaxis[:mirror], yaxis[:flip]) ? (ymax, t2) : (ymin, t1) + (y1, t1) end push!(xtick_segs, (xtick, tick_start), (xtick, tick_stop)) # bottom tick end # sp[:draw_axes_border] && push!(xaxis_segs, (xtick, ymax), (xtick, t2)) # top tick xaxis[:grid] && push!(xgrid_segs, (xtick, ymin), (xtick, ymax)) # vertical grid end - end - if !(xaxis[:minorticks] in (:none, nothing, false)) || xaxis[:minorgrid] - f = scalefunc(yaxis[:scale]) - invf = invscalefunc(yaxis[:scale]) - ticks_in = xaxis[:tick_direction] == :out ? -1 : 1 - t1 = invf(f(ymin) + 0.01 * (f(ymax) - f(ymin)) * ticks_in) - t2 = invf(f(ymax) - 0.01 * (f(ymax) - f(ymin)) * ticks_in) - t3 = invf(f(0) + 0.01 * (f(ymax) - f(ymin)) * ticks_in) - for xminortick in xminorticks - if xaxis[:showaxis] - tick_start, tick_stop = if sp[:framestyle] == :origin - (0, t3) - else - xor(xaxis[:mirror], yaxis[:flip]) ? (ymax, t2) : (ymin, t1) + if !(xaxis[:minorticks] in (:none, nothing, false)) || xaxis[:minorgrid] + for xminortick in xminorticks + if xaxis[:showaxis] + tick_start, tick_stop = if sp[:framestyle] == :origin + (-t2, t2) + else + (y1, t1) + end + push!(xtick_segs, (xminortick, tick_start), (xminortick, tick_stop)) # bottom tick end - push!(xtick_segs, (xminortick, tick_start), (xminortick, tick_stop)) # bottom tick + # sp[:draw_axes_border] && push!(xaxis_segs, (xtick, ymax), (xtick, t2)) # top tick + xaxis[:minorgrid] && push!(xminorgrid_segs, (xminortick, ymin), (xminortick, ymax)) # vertical grid end - # sp[:draw_axes_border] && push!(xaxis_segs, (xtick, ymax), (xtick, t2)) # top tick - xaxis[:minorgrid] && push!(xminorgrid_segs, (xminortick, ymin), (xminortick, ymax)) # vertical grid end end # yaxis + x1, x2 = if sp[:framestyle] in (:origin, :zerolines) + 0.0, 0.0 + else + xor(yaxis[:mirror], xaxis[:flip]) ? (xmax, xmin) : (xmin, xmax) + end if yaxis[:showaxis] if sp[:framestyle] != :grid - x1, x2 = if sp[:framestyle] in (:origin, :zerolines) - 0.0, 0.0 - else - xor(yaxis[:mirror], xaxis[:flip]) ? (xmax, xmin) : (xmin, xmax) - end push!(yaxis_segs, (x1, ymin), (x1, ymax)) # don't show the 0 tick label for the origin framestyle if sp[:framestyle] == :origin && !(yticks in (:none, nothing,false)) && length(yticks) > 1 @@ -718,42 +711,35 @@ function axis_drawing_info(sp::Subplot) f = scalefunc(xaxis[:scale]) invf = invscalefunc(xaxis[:scale]) ticks_in = yaxis[:tick_direction] == :out ? -1 : 1 - t1 = invf(f(xmin) + 0.015 * (f(xmax) - f(xmin)) * ticks_in) - t2 = invf(f(xmax) - 0.015 * (f(xmax) - f(xmin)) * ticks_in) - t3 = invf(f(0) + 0.015 * (f(xmax) - f(xmin)) * ticks_in) + t1 = invf(f(x1) + 0.01 * (f(x2) - f(x1)) * ticks_in) + t2 = invf(f(0) + 0.01 * (f(xmax) - f(xmin))) for ytick in yticks[1] if yaxis[:showaxis] tick_start, tick_stop = if sp[:framestyle] == :origin - (0, t3) + (-t2, t2) else - xor(yaxis[:mirror], xaxis[:flip]) ? (xmax, t2) : (xmin, t1) + (x1, t1) end push!(ytick_segs, (tick_start, ytick), (tick_stop, ytick)) # left tick end # sp[:draw_axes_border] && push!(yaxis_segs, (xmax, ytick), (t2, ytick)) # right tick yaxis[:grid] && push!(ygrid_segs, (xmin, ytick), (xmax, ytick)) # horizontal grid end - end - if !(yaxis[:minorticks] in (:none, nothing, false)) || yaxis[:minorgrid] - f = scalefunc(xaxis[:scale]) - invf = invscalefunc(xaxis[:scale]) - ticks_in = yaxis[:tick_direction] == :out ? -1 : 1 - t1 = invf(f(xmin) + 0.01 * (f(xmax) - f(xmin)) * ticks_in) - t2 = invf(f(xmax) - 0.01 * (f(xmax) - f(xmin)) * ticks_in) - t3 = invf(f(0) + 0.01 * (f(xmax) - f(xmin)) * ticks_in) - for ytick in yminorticks - if yaxis[:showaxis] - tick_start, tick_stop = if sp[:framestyle] == :origin - (0, t3) - else - xor(yaxis[:mirror], xaxis[:flip]) ? (xmax, t2) : (xmin, t1) + if !(yaxis[:minorticks] in (:none, nothing, false)) || yaxis[:minorgrid] + for ytick in yminorticks + if yaxis[:showaxis] + tick_start, tick_stop = if sp[:framestyle] == :origin + (-t2, t2) + else + (x1, t1) + end + push!(ytick_segs, (tick_start, ytick), (tick_stop, ytick)) # left tick end - push!(ytick_segs, (tick_start, ytick), (tick_stop, ytick)) # left tick + # sp[:draw_axes_border] && push!(yaxis_segs, (xmax, ytick), (t2, ytick)) # right tick + yaxis[:minorgrid] && push!(yminorgrid_segs, (xmin, ytick), (xmax, ytick)) # horizontal grid end - # sp[:draw_axes_border] && push!(yaxis_segs, (xmax, ytick), (t2, ytick)) # right tick - yaxis[:minorgrid] && push!(yminorgrid_segs, (xmin, ytick), (xmax, ytick)) # horizontal grid end end end From f5c6b06eb6aaa298c9ff7b70aab05f05eb9f2117 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 20 Nov 2019 09:23:50 +0100 Subject: [PATCH 341/357] fix 3d Segments constructor --- src/utils.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.jl b/src/utils.jl index d6fbdee8..d3301ebe 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -145,7 +145,7 @@ end Segments() = Segments(Float64) Segments(::Type{T}) where {T} = Segments(T[]) -Segments(p::Int) = Segments(NTuple{2,Float64}[]) +Segments(p::Int) = Segments(NTuple{p, Float64}[]) # Segments() = Segments(zeros(0)) From 4263ced69bd03c1792a193e213d220634c747268 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 20 Nov 2019 19:04:08 +0100 Subject: [PATCH 342/357] implement axes_drawing_info_3d --- src/axes.jl | 327 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 294 insertions(+), 33 deletions(-) diff --git a/src/axes.jl b/src/axes.jl index ab1bd6be..be760136 100644 --- a/src/axes.jl +++ b/src/axes.jl @@ -656,35 +656,35 @@ function axis_drawing_info(sp::Subplot) if !(xaxis[:ticks] in (:none, nothing, false)) f = scalefunc(yaxis[:scale]) invf = invscalefunc(yaxis[:scale]) - ticks_in = xaxis[:tick_direction] == :out ? -1 : 1 - t1 = invf(f(y1) + 0.01 * (f(y2) - f(y1)) * ticks_in) - t2 = invf(f(0) + 0.01 * (f(ymax) - f(ymin))) + tick_start, tick_stop = if sp[:framestyle] == :origin + t = invf(f(0) + 0.012 * (f(ymax) - f(ymin))) + (-t, t) + else + ticks_in = xaxis[:tick_direction] == :out ? -1 : 1 + t = invf(f(y1) + 0.012 * (f(y2) - f(y1)) * ticks_in) + (y1, t) + end for xtick in xticks[1] if xaxis[:showaxis] - tick_start, tick_stop = if sp[:framestyle] == :origin - (-t2, t2) - else - (y1, t1) - end push!(xtick_segs, (xtick, tick_start), (xtick, tick_stop)) # bottom tick end - # sp[:draw_axes_border] && push!(xaxis_segs, (xtick, ymax), (xtick, t2)) # top tick xaxis[:grid] && push!(xgrid_segs, (xtick, ymin), (xtick, ymax)) # vertical grid end if !(xaxis[:minorticks] in (:none, nothing, false)) || xaxis[:minorgrid] - for xminortick in xminorticks + tick_start, tick_stop = if sp[:framestyle] == :origin + t = invf(f(0) + 0.006 * (f(ymax) - f(ymin))) + (-t, t) + else + t = invf(f(y1) + 0.006 * (f(y2) - f(y1)) * ticks_in) + (y1, t) + end + for xtick in xminorticks if xaxis[:showaxis] - tick_start, tick_stop = if sp[:framestyle] == :origin - (-t2, t2) - else - (y1, t1) - end - push!(xtick_segs, (xminortick, tick_start), (xminortick, tick_stop)) # bottom tick + push!(xtick_segs, (xtick, tick_start), (xtick, tick_stop)) # bottom tick end - # sp[:draw_axes_border] && push!(xaxis_segs, (xtick, ymax), (xtick, t2)) # top tick - xaxis[:minorgrid] && push!(xminorgrid_segs, (xminortick, ymin), (xminortick, ymax)) # vertical grid + xaxis[:minorgrid] && push!(xminorgrid_segs, (xtick, ymin), (xtick, ymax)) # vertical grid end end end @@ -710,34 +710,34 @@ function axis_drawing_info(sp::Subplot) if !(yaxis[:ticks] in (:none, nothing, false)) f = scalefunc(xaxis[:scale]) invf = invscalefunc(xaxis[:scale]) - ticks_in = yaxis[:tick_direction] == :out ? -1 : 1 - t1 = invf(f(x1) + 0.01 * (f(x2) - f(x1)) * ticks_in) - t2 = invf(f(0) + 0.01 * (f(xmax) - f(xmin))) + tick_start, tick_stop = if sp[:framestyle] == :origin + t = invf(f(0) + 0.012 * (f(xmax) - f(xmin))) + (-t, t) + else + ticks_in = yaxis[:tick_direction] == :out ? -1 : 1 + t = invf(f(x1) + 0.012 * (f(x2) - f(x1)) * ticks_in) + (x1, t) + end for ytick in yticks[1] if yaxis[:showaxis] - tick_start, tick_stop = if sp[:framestyle] == :origin - (-t2, t2) - else - (x1, t1) - end push!(ytick_segs, (tick_start, ytick), (tick_stop, ytick)) # left tick end - # sp[:draw_axes_border] && push!(yaxis_segs, (xmax, ytick), (t2, ytick)) # right tick yaxis[:grid] && push!(ygrid_segs, (xmin, ytick), (xmax, ytick)) # horizontal grid end if !(yaxis[:minorticks] in (:none, nothing, false)) || yaxis[:minorgrid] + tick_start, tick_stop = if sp[:framestyle] == :origin + t = invf(f(0) + 0.006 * (f(xmax) - f(xmin))) + (-t, t) + else + t = invf(f(x1) + 0.006 * (f(x2) - f(x1)) * ticks_in) + (x1, t) + end for ytick in yminorticks if yaxis[:showaxis] - tick_start, tick_stop = if sp[:framestyle] == :origin - (-t2, t2) - else - (x1, t1) - end push!(ytick_segs, (tick_start, ytick), (tick_stop, ytick)) # left tick end - # sp[:draw_axes_border] && push!(yaxis_segs, (xmax, ytick), (t2, ytick)) # right tick yaxis[:minorgrid] && push!(yminorgrid_segs, (xmin, ytick), (xmax, ytick)) # horizontal grid end end @@ -746,3 +746,264 @@ function axis_drawing_info(sp::Subplot) xticks, yticks, xaxis_segs, yaxis_segs, xtick_segs, ytick_segs, xgrid_segs, ygrid_segs, xminorgrid_segs, yminorgrid_segs, xborder_segs, yborder_segs end + + +function axis_drawing_info_3d(sp::Subplot) + xaxis, yaxis, zaxis = sp[:xaxis], sp[:yaxis], sp[:zaxis] + xmin, xmax = axis_limits(sp, :x) + ymin, ymax = axis_limits(sp, :y) + zmin, zmax = axis_limits(sp, :z) + xticks = get_ticks(sp, xaxis) + yticks = get_ticks(sp, yaxis) + zticks = get_ticks(sp, zaxis) + xminorticks = get_minor_ticks(sp, xaxis, xticks) + yminorticks = get_minor_ticks(sp, yaxis, yticks) + zminorticks = get_minor_ticks(sp, zaxis, zticks) + xaxis_segs = Segments(3) + yaxis_segs = Segments(3) + zaxis_segs = Segments(3) + xtick_segs = Segments(3) + ytick_segs = Segments(3) + ztick_segs = Segments(3) + xgrid_segs = Segments(3) + ygrid_segs = Segments(3) + zgrid_segs = Segments(3) + xminorgrid_segs = Segments(3) + yminorgrid_segs = Segments(3) + zminorgrid_segs = Segments(3) + xborder_segs = Segments(3) + yborder_segs = Segments(3) + zborder_segs = Segments(3) + + if sp[:framestyle] != :none + + # xaxis + y1, y2 = if sp[:framestyle] in (:origin, :zerolines) + 0.0, 0.0 + else + xor(xaxis[:mirror], yaxis[:flip]) ? (ymax, ymin) : (ymin, ymax) + end + z1, z2 = if sp[:framestyle] in (:origin, :zerolines) + 0.0, 0.0 + else + xor(xaxis[:mirror], zaxis[:flip]) ? (zmax, zmin) : (zmin, zmax) + end + if xaxis[:showaxis] + if sp[:framestyle] != :grid + push!(xaxis_segs, (xmin, y1, z1), (xmax, y1, z1)) + # don't show the 0 tick label for the origin framestyle + if sp[:framestyle] == :origin && !(xticks in (:none, nothing, false)) && length(xticks) > 1 + showticks = xticks[1] .!= 0 + xticks = (xticks[1][showticks], xticks[2][showticks]) + end + end + sp[:framestyle] in (:semi, :box) && push!(xborder_segs, (xmin, y2, z2), (xmax, y2, z2)) # top spine + end + if !(xaxis[:ticks] in (:none, nothing, false)) + f = scalefunc(yaxis[:scale]) + invf = invscalefunc(yaxis[:scale]) + tick_start, tick_stop = if sp[:framestyle] == :origin + t = invf(f(0) + 0.012 * (f(ymax) - f(ymin))) + (-t, t) + else + t = invf(f(y1) + 0.012 * (f(y2) - f(y1)) * ticks_in) + (y1, t) + end + + for xtick in xticks[1] + if xaxis[:showaxis] + push!(xtick_segs, (xtick, tick_start, z1), (xtick, tick_stop, z1)) # bottom tick + end + if xaxis[:grid] + if sp[:framestyle] in (:origin, :zerolines) + push!(xgrid_segs, (xtick, ymin, 0.0), (xtick, ymax, 0.0)) + push!(xgrid_segs, (xtick, 0.0, zmin), (xtick, 0.0, zmax)) + else + push!(xgrid_segs, (xtick, y1, z1), (xtick, y2, z1)) + push!(xgrid_segs, (xtick, y2, z1), (xtick, y2, z2)) + end + end + end + + if !(xaxis[:minorticks] in (:none, nothing, false)) || xaxis[:minorgrid] + tick_start, tick_stop = if sp[:framestyle] == :origin + t = invf(f(0) + 0.006 * (f(ymax) - f(ymin))) + (-t, t) + else + ticks_in = xaxis[:tick_direction] == :out ? -1 : 1 + t = invf(f(y1) + 0.006 * (f(y2) - f(y1)) * ticks_in) + (y1, t) + end + for xtick in xminorticks + if xaxis[:showaxis] + push!(xtick_segs, (xtick, tick_start), (xtick, tick_stop)) # bottom tick + end + if xaxis[:minorgrid] + if sp[:framestyle] in (:origin, :zerolines) + push!(xminorgrid_segs, (xtick, ymin, 0.0), (xtick, ymax, 0.0)) + push!(xminorgrid_segs, (xtick, 0.0, zmin), (xtick, 0.0, zmax)) + else + push!(xminorgrid_segs, (xtick, y1, z1), (xtick, y2, z1)) + push!(xminorgrid_segs, (xtick, y2, z1), (xtick, y2, z2)) + end + end + end + end + end + + + # yaxis + x1, x2 = if sp[:framestyle] in (:origin, :zerolines) + 0.0, 0.0 + else + # TODO: probably flip here + xor(yaxis[:mirror], xaxis[:flip]) ? (xmax, xmin) : (xmin, xmax) + end + z1, z2 = if sp[:framestyle] in (:origin, :zerolines) + 0.0, 0.0 + else + xor(yaxis[:mirror], zaxis[:flip]) ? (zmax, zmin) : (zmin, zmax) + end + if yaxis[:showaxis] + if sp[:framestyle] != :grid + push!(yaxis_segs, (x1, ymin, z1), (x1, ymax, z1)) + # don't show the 0 tick label for the origin framestyle + if sp[:framestyle] == :origin && !(yticks in (:none, nothing,false)) && length(yticks) > 1 + showticks = yticks[1] .!= 0 + yticks = (yticks[1][showticks], yticks[2][showticks]) + end + end + sp[:framestyle] in (:semi, :box) && push!(yborder_segs, (x2, ymin, z2), (x2, ymax, z2)) # right spine + end + if !(yaxis[:ticks] in (:none, nothing, false)) + f = scalefunc(xaxis[:scale]) + invf = invscalefunc(xaxis[:scale]) + tick_start, tick_stop = if sp[:framestyle] == :origin + t = invf(f(0) + 0.012 * (f(xmax) - f(xmin))) + (-t, t) + else + ticks_in = yaxis[:tick_direction] == :out ? -1 : 1 + t = invf(f(x1) + 0.012 * (f(x2) - f(x1)) * ticks_in) + (x1, t) + end + + for ytick in yticks[1] + if yaxis[:showaxis] + push!(ytick_segs, (tick_start, ytick, z1), (tick_stop, ytick, z1)) # left tick + end + if yaxis[:grid] + if sp[:framestyle] in (:origin, :zerolines) + push!(ygrid_segs, (xmin, ytick, 0.0), (xmax, ytick, 0.0)) + push!(ygrid_segs, (0.0, ytick, zmin), (0.0, ytick, zmax)) + else + push!(ygrid_segs, (x1, ytick, z1), (x2, ytick, z1)) + push!(ygrid_segs, (x2, ytick, z1), (x2, ytick, z2)) + end + end + end + + if !(yaxis[:minorticks] in (:none, nothing, false)) || yaxis[:minorgrid] + tick_start, tick_stop = if sp[:framestyle] == :origin + t = invf(f(0) + 0.006 * (f(xmax) - f(xmin))) + (-t, t) + else + t = invf(f(x1) + 0.006 * (f(x2) - f(x1)) * ticks_in) + (x1, t) + end + for ytick in yminorticks + if yaxis[:showaxis] + push!(ytick_segs, (tick_start, ytick, z1), (tick_stop, ytick, z1)) # left tick + end + if yaxis[:minorgrid] + if sp[:framestyle] in (:origin, :zerolines) + push!(yminorgrid_segs, (xmin, ytick, 0.0), (xmax, ytick, 0.0)) + push!(yminorgrid_segs, (0.0, ytick, zmin), (0.0, ytick, zmax)) + else + push!(yminorgrid_segs, (x1, ytick, z1), (x2, ytick, z1)) + push!(yminorgrid_segs, (x2, ytick, z1), (x2, ytick, z2)) + end + end + end + end + end + + + # zaxis + x1, x2 = if sp[:framestyle] in (:origin, :zerolines) + 0.0, 0.0 + else + # TODO: probably flip here + xor(zaxis[:mirror], xaxis[:flip]) ? (xmax, xmin) : (xmin, xmax) + end + y1, y2 = if sp[:framestyle] in (:origin, :zerolines) + 0.0, 0.0 + else + # TODO: probably flip here + xor(zaxis[:mirror], yaxis[:flip]) ? (ymax, ymin) : (ymin, ymax) + end + if zaxis[:showaxis] + if sp[:framestyle] != :grid + push!(zaxis_segs, (x1, y1, zmin), (x1, y1, zmax)) + # don't show the 0 tick label for the origin framestyle + if sp[:framestyle] == :origin && !(zticks in (:none, nothing,false)) && length(zticks) > 1 + showticks = zticks[1] .!= 0 + zticks = (zticks[1][showticks], zticks[2][showticks]) + end + end + sp[:framestyle] in (:semi, :box) && push!(zborder_segs, (x2, y2, zmin), (x2, y2, zmax)) + end + if !(zaxis[:ticks] in (:none, nothing, false)) + f = scalefunc(xaxis[:scale]) + invf = invscalefunc(xaxis[:scale]) + tick_start, tick_stop = if sp[:framestyle] == :origin + t = invf(f(0) + 0.012 * (f(xmax) - f(xmin))) + (-t, t) + else + ticks_in = zaxis[:tick_direction] == :out ? -1 : 1 + t = invf(f(x1) + 0.012 * (f(x2) - f(x1)) * ticks_in) + (x1, t) + end + + for ztick in zticks[1] + if zaxis[:showaxis] + push!(ztick_segs, (tick_start, y1, ztick), (tick_stop, y1, ztick)) # left tick + end + if zaxis[:grid] + if sp[:framestyle] in (:origin, :zerolines) + push!(zgrid_segs, (xmin, 0.0, ztick), (xmax, 0.0, ztick)) + push!(ygrid_segs, (0.0, ymin, ztick), (0.0, ymax, ztick)) + else + push!(ygrid_segs, (x1, y1, ztick), (x2, y1, ztick)) + push!(ygrid_segs, (x2, y1, ztick), (x2, y2, ztick)) + end + end + end + + if !(zaxis[:minorticks] in (:none, nothing, false)) || zaxis[:minorgrid] + tick_start, tick_stop = if sp[:framestyle] == :origin + t = invf(f(0) + 0.006 * (f(xmax) - f(xmin))) + (-t, t) + else + t = invf(f(x1) + 0.006 * (f(x2) - f(x1)) * ticks_in) + (x1, t) + end + for ztick in zminorticks + if zaxis[:showaxis] + push!(ztick_segs, (tick_start, y1, ztick), (tick_stop, y1, ztick)) # left tick + end + if zaxis[:minorgrid] + if sp[:framestyle] in (:origin, :zerolines) + push!(zminorgrid_segs, (xmin, 0.0, ztick), (xmax, 0.0, ztick)) + push!(zminorgrid_segs, (0.0, ymin, ztick), (0.0, ymax, ztick)) + else + push!(zminorgrid_segs, (x1, y1, ztick), (x2, y1, ztick)) + push!(zminorgrid_segs, (x2, y1, ztick), (x2, y2, ztick)) + end + end + end + end + end + end + + xticks, yticks, zticks, xaxis_segs, yaxis_segs, zaxis_segs, xtick_segs, ytick_segs, ztick_segs, xgrid_segs, ygrid_segs, zgrid_segs, xminorgrid_segs, yminorgrid_segs, zminorgrid_segs, xborder_segs, yborder_segs, zborder_segs +end From cb6f0772b7701c4c28194c5c5e72148b79a4e954 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 20 Nov 2019 19:09:37 +0100 Subject: [PATCH 343/357] avoid multiple calls to axis_drawing_info --- src/backends/gr.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index b6432a58..e8f8182a 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -749,7 +749,7 @@ end function gr_xaxis_height(sp) xaxis = sp[:xaxis] - xticks, yticks = axis_drawing_info(sp)[1:2] + xticks, yticks = get_ticks(sp, xaxis), get_ticks(sp, sp[:yaxis]) gr_set_font(tickfont(xaxis)) h = (xticks in (nothing, false, :none) ? 0 : last(gr_get_ticks_size(xticks, xaxis[:rotation]))) if xaxis[:guide] != "" @@ -761,7 +761,7 @@ end function gr_yaxis_width(sp) yaxis = sp[:yaxis] - xticks, yticks = axis_drawing_info(sp)[1:2] + xticks, yticks = get_ticks(sp, sp[:xaxis]), get_ticks(sp, yaxis) gr_set_font(tickfont(yaxis)) w = (xticks in (nothing, false, :none) ? 0 : first(gr_get_ticks_size(yticks, yaxis[:rotation]))) if yaxis[:guide] != "" @@ -791,7 +791,7 @@ function _update_min_padding!(sp::Subplot{GRBackend}) toppad += h end # Add margin for x and y ticks - xticks, yticks = axis_drawing_info(sp)[1:2] + xticks, yticks = get_ticks(sp, sp[:xaxis]), get_ticks(sp, sp[:yaxis]) if !(xticks in (nothing, false, :none)) flip, mirror = gr_set_xticks_font(sp) l = 0.01 + last(gr_get_ticks_size(xticks, sp[:xaxis][:rotation])) @@ -1182,7 +1182,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) gr_set_font(guidefont(xaxis)) GR.titles3d(xaxis[:guide], yaxis[:guide], zaxis[:guide]) else - xticks, yticks = axis_drawing_info(sp)[1:2] + xticks, yticks = get_ticks(sp, sp[:xaxis]), get_ticks(sp, sp[:yaxis]) if xaxis[:guide] != "" h = 0.01 + gr_xaxis_height(sp) gr_set_font(guidefont(xaxis)) From 84b108f6d081ecead514f0abf1b39779e35b32d7 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Thu, 21 Nov 2019 16:51:41 +0100 Subject: [PATCH 344/357] 3d axes grid and ticks in gr --- src/axes.jl | 13 ++- src/backends/gr.jl | 197 ++++++++++++++++++++++++++++++++++++++++++--- src/utils.jl | 2 + 3 files changed, 193 insertions(+), 19 deletions(-) diff --git a/src/axes.jl b/src/axes.jl index be760136..82bf5bdf 100644 --- a/src/axes.jl +++ b/src/axes.jl @@ -806,6 +806,7 @@ function axis_drawing_info_3d(sp::Subplot) t = invf(f(0) + 0.012 * (f(ymax) - f(ymin))) (-t, t) else + ticks_in = xaxis[:tick_direction] == :out ? -1 : 1 t = invf(f(y1) + 0.012 * (f(y2) - f(y1)) * ticks_in) (y1, t) end @@ -830,13 +831,12 @@ function axis_drawing_info_3d(sp::Subplot) t = invf(f(0) + 0.006 * (f(ymax) - f(ymin))) (-t, t) else - ticks_in = xaxis[:tick_direction] == :out ? -1 : 1 t = invf(f(y1) + 0.006 * (f(y2) - f(y1)) * ticks_in) (y1, t) end for xtick in xminorticks if xaxis[:showaxis] - push!(xtick_segs, (xtick, tick_start), (xtick, tick_stop)) # bottom tick + push!(xtick_segs, (xtick, tick_start, z1), (xtick, tick_stop, z1)) # bottom tick end if xaxis[:minorgrid] if sp[:framestyle] in (:origin, :zerolines) @@ -856,8 +856,7 @@ function axis_drawing_info_3d(sp::Subplot) x1, x2 = if sp[:framestyle] in (:origin, :zerolines) 0.0, 0.0 else - # TODO: probably flip here - xor(yaxis[:mirror], xaxis[:flip]) ? (xmax, xmin) : (xmin, xmax) + xor(yaxis[:mirror], xaxis[:flip]) ? (xmin, xmax) : (xmax, xmin) end z1, z2 = if sp[:framestyle] in (:origin, :zerolines) 0.0, 0.0 @@ -932,14 +931,12 @@ function axis_drawing_info_3d(sp::Subplot) x1, x2 = if sp[:framestyle] in (:origin, :zerolines) 0.0, 0.0 else - # TODO: probably flip here - xor(zaxis[:mirror], xaxis[:flip]) ? (xmax, xmin) : (xmin, xmax) + xor(zaxis[:mirror], xaxis[:flip]) ? (xmin, xmax) : (xmax, xmin) end y1, y2 = if sp[:framestyle] in (:origin, :zerolines) 0.0, 0.0 else - # TODO: probably flip here - xor(zaxis[:mirror], yaxis[:flip]) ? (ymax, ymin) : (ymin, ymax) + xor(zaxis[:mirror], yaxis[:flip]) ? (ymin, ymax) : (ymax, ymin) end if zaxis[:showaxis] if sp[:framestyle] != :grid diff --git a/src/backends/gr.jl b/src/backends/gr.jl index e8f8182a..4cdb6088 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -155,6 +155,48 @@ function gr_polyline(x, y, func = GR.polyline; arrowside = :none, arrowstyle = : end end +function gr_polyline3d(x, y, z, func = GR.polyline3d; arrowside = :none, arrowstyle = :simple) + iend = 0 + n = length(x) + while iend < n-1 + # set istart to the first index that is finite + istart = -1 + for j = iend+1:n + if isfinite(x[j]) && isfinite(y[j]) && isfinite(z[j]) + istart = j + break + end + end + + if istart > 0 + # iend is the last finite index + iend = -1 + for j = istart+1:n + if isfinite(x[j]) && isfinite(y[j]) && isfinite(z[j]) + iend = j + else + break + end + end + end + + # if we found a start and end, draw the line segment, otherwise we're done + if istart > 0 && iend > 0 + func(x[istart:iend], y[istart:iend], z[istart:iend]) + if arrowside in (:head,:both) + gr_set_arrowstyle(arrowstyle) + GR.drawarrow(x[iend-1], y[iend-1], z[iend-1], x[iend], y[iend], z[iend]) + end + if arrowside in (:tail,:both) + gr_set_arrowstyle(arrowstyle) + GR.drawarrow(x[istart+1], y[istart+1], z[istart+1], x[istart], y[istart], z[istart]) + end + else + break + end + end +end + gr_inqtext(x, y, s::Symbol) = gr_inqtext(x, y, string(s)) function gr_inqtext(x, y, s) @@ -1004,30 +1046,163 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) isfinite(clims3d[2]) && (zmax = clims3d[2]) end GR.setspace(zmin, zmax, round.(Int, sp[:camera])...) - xtick = GR.tick(xmin, xmax) / 2 - ytick = GR.tick(ymin, ymax) / 2 - ztick = GR.tick(zmin, zmax) / 2 - ticksize = 0.01 * (viewport_plotarea[2] - viewport_plotarea[1]) + xticks, yticks, zticks, xaxis_segs, yaxis_segs, zaxis_segs, xtick_segs, ytick_segs, ztick_segs, xgrid_segs, ygrid_segs, zgrid_segs, xminorgrid_segs, yminorgrid_segs, zminorgrid_segs, xborder_segs, yborder_segs, zborder_segs = axis_drawing_info_3d(sp) + + # draw the grid lines if xaxis[:grid] gr_set_line(xaxis[:gridlinewidth], xaxis[:gridstyle], xaxis[:foreground_color_grid]) gr_set_transparency(xaxis[:foreground_color_grid], xaxis[:gridalpha]) - GR.grid3d(xtick, 0, 0, xmin, ymax, zmin, 2, 0, 0) + gr_polyline3d(coords(xgrid_segs)...) end if yaxis[:grid] gr_set_line(yaxis[:gridlinewidth], yaxis[:gridstyle], yaxis[:foreground_color_grid]) gr_set_transparency(yaxis[:foreground_color_grid], yaxis[:gridalpha]) - GR.grid3d(0, ytick, 0, xmin, ymax, zmin, 0, 2, 0) + gr_polyline3d(coords(ygrid_segs)...) end if zaxis[:grid] gr_set_line(zaxis[:gridlinewidth], zaxis[:gridstyle], zaxis[:foreground_color_grid]) gr_set_transparency(zaxis[:foreground_color_grid], zaxis[:gridalpha]) - GR.grid3d(0, 0, ztick, xmin, ymax, zmin, 0, 0, 2) + gr_polyline3d(coords(zgrid_segs)...) end - gr_set_line(1, :solid, xaxis[:foreground_color_axis]) - gr_set_transparency(xaxis[:foreground_color_axis]) - GR.axes3d(xtick, 0, ztick, xmin, ymin, zmin, 2, 0, 2, -ticksize) - GR.axes3d(0, ytick, 0, xmax, ymin, zmin, 0, 2, 0, ticksize) + + if xaxis[:minorgrid] + gr_set_line(xaxis[:minorgridlinewidth], xaxis[:minorgridstyle], xaxis[:foreground_color_minor_grid]) + gr_set_transparency(xaxis[:foreground_color_minor_grid], xaxis[:minorgridalpha]) + gr_polyline3d(coords(xminorgrid_segs)...) + end + if yaxis[:minorgrid] + gr_set_line(yaxis[:minorgridlinewidth], yaxis[:minorgridstyle], yaxis[:foreground_color_minor_grid]) + gr_set_transparency(yaxis[:foreground_color_minor_grid], yaxis[:minorgridalpha]) + gr_polyline3d(coords(yminorgrid_segs)...) + end + if zaxis[:minorgrid] + gr_set_line(zaxis[:minorgridlinewidth], zaxis[:minorgridstyle], zaxis[:foreground_color_minor_grid]) + gr_set_transparency(zaxis[:foreground_color_minor_grid], zaxis[:minorgridalpha]) + gr_polyline3d(coords(zminorgrid_segs)...) + end + gr_set_transparency(1.0) + + # axis lines + if xaxis[:showaxis] + gr_set_line(1, :solid, xaxis[:foreground_color_border]) + GR.setclip(0) + gr_polyline3d(coords(xaxis_segs)...) + end + if yaxis[:showaxis] + gr_set_line(1, :solid, yaxis[:foreground_color_border]) + GR.setclip(0) + gr_polyline3d(coords(yaxis_segs)...) + end + if zaxis[:showaxis] + gr_set_line(1, :solid, zaxis[:foreground_color_border]) + GR.setclip(0) + gr_polyline3d(coords(zaxis_segs)...) + end + GR.setclip(1) + + # axis ticks + if xaxis[:showaxis] + if sp[:framestyle] in (:zerolines, :grid) + gr_set_line(1, :solid, xaxis[:foreground_color_grid]) + gr_set_transparency(xaxis[:foreground_color_grid], xaxis[:tick_direction] == :out ? xaxis[:gridalpha] : 0) + else + gr_set_line(1, :solid, xaxis[:foreground_color_axis]) + end + GR.setclip(0) + gr_polyline3d(coords(xtick_segs)...) + end + if yaxis[:showaxis] + if sp[:framestyle] in (:zerolines, :grid) + gr_set_line(1, :solid, yaxis[:foreground_color_grid]) + gr_set_transparency(yaxis[:foreground_color_grid], yaxis[:tick_direction] == :out ? yaxis[:gridalpha] : 0) + else + gr_set_line(1, :solid, yaxis[:foreground_color_axis]) + end + GR.setclip(0) + gr_polyline3d(coords(ytick_segs)...) + end + if zaxis[:showaxis] + if sp[:framestyle] in (:zerolines, :grid) + gr_set_line(1, :solid, zaxis[:foreground_color_grid]) + gr_set_transparency(zaxis[:foreground_color_grid], zaxis[:tick_direction] == :out ? zaxis[:gridalpha] : 0) + else + gr_set_line(1, :solid, zaxis[:foreground_color_axis]) + end + GR.setclip(0) + gr_polyline3d(coords(ztick_segs)...) + end + GR.setclip(1) + + # TODO: tick labels + + # # tick marks + # if !(xticks in (:none, nothing, false)) && xaxis[:showaxis] + # # x labels + # flip, mirror = gr_set_xticks_font(sp) + # for (cv, dv) in zip(xticks...) + # # use xor ($) to get the right y coords + # xi, yi = GR.wctondc(cv, sp[:framestyle] == :origin ? 0 : xor(flip, mirror) ? ymax : ymin) + # if xaxis[:ticks] in (:auto, :native) + # # ensure correct dispatch in gr_text for automatic log ticks + # if xaxis[:scale] in _logScales + # dv = string(dv, "\\ ") + # elseif xaxis[:formatter] in (:scientific, :auto) + # dv = convert_sci_unicode(dv) + # end + # end + # gr_text(xi, yi + (mirror ? 1 : -1) * 5e-3 * (xaxis[:tick_direction] == :out ? 1.5 : 1.0), string(dv)) + # end + # end + # + # if !(yticks in (:none, nothing, false)) && yaxis[:showaxis] + # # y labels + # flip, mirror = gr_set_yticks_font(sp) + # for (cv, dv) in zip(yticks...) + # # use xor ($) to get the right y coords + # xi, yi = GR.wctondc(sp[:framestyle] == :origin ? 0 : xor(flip, mirror) ? xmax : xmin, cv) + # # @show cv dv xmin xi yi + # if yaxis[:ticks] in (:auto, :native) + # # ensure correct dispatch in gr_text for automatic log ticks + # if yaxis[:scale] in _logScales + # dv = string(dv, "\\ ") + # elseif yaxis[:formatter] in (:scientific, :auto) + # dv = convert_sci_unicode(dv) + # end + # end + # gr_text(xi + (mirror ? 1 : -1) * 1e-2 * (yaxis[:tick_direction] == :out ? 1.5 : 1.0), yi, string(dv)) + # end + # end + # + # if !(zticks in (:none, nothing, false)) && zaxis[:showaxis] + # # y labels + # flip, mirror = gr_set_yticks_font(sp) # TODO for z + # for (cv, dv) in zip(zticks...) + # # use xor ($) to get the right y coords + # xi, yi = GR.wctondc(sp[:framestyle] == :origin ? 0 : xor(flip, mirror) ? xmax : xmin, cv) + # # @show cv dv xmin xi yi + # if yaxis[:ticks] in (:auto, :native) + # # ensure correct dispatch in gr_text for automatic log ticks + # if yaxis[:scale] in _logScales + # dv = string(dv, "\\ ") + # elseif yaxis[:formatter] in (:scientific, :auto) + # dv = convert_sci_unicode(dv) + # end + # end + # gr_text(xi + (mirror ? 1 : -1) * 1e-2 * (yaxis[:tick_direction] == :out ? 1.5 : 1.0), yi, string(dv)) + # end + # end + # + # # border + # intensity = sp[:framestyle] == :semi ? 0.5 : 1.0 + # if sp[:framestyle] in (:box, :semi) + # gr_set_line(intensity, :solid, xaxis[:foreground_color_border]) + # gr_set_transparency(xaxis[:foreground_color_border], intensity) + # gr_polyline3d(coords(xborder_segs)...) + # gr_set_line(intensity, :solid, yaxis[:foreground_color_border]) + # gr_set_transparency(yaxis[:foreground_color_border], intensity) + # gr_polyline3d(coords(yborder_segs)...) + # end elseif ispolar(sp) r = gr_set_viewport_polar() diff --git a/src/utils.jl b/src/utils.jl index d3301ebe..04ec2cae 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -152,9 +152,11 @@ Segments(p::Int) = Segments(NTuple{p, Float64}[]) to_nan(::Type{Float64}) = NaN to_nan(::Type{NTuple{2,Float64}}) = (NaN, NaN) +to_nan(::Type{NTuple{3,Float64}}) = (NaN, NaN, NaN) coords(segs::Segments{Float64}) = segs.pts coords(segs::Segments{NTuple{2,Float64}}) = Float64[p[1] for p in segs.pts], Float64[p[2] for p in segs.pts] +coords(segs::Segments{NTuple{3,Float64}}) = Float64[p[1] for p in segs.pts], Float64[p[2] for p in segs.pts], Float64[p[3] for p in segs.pts] function Base.push!(segments::Segments{T}, vs...) where T if !isempty(segments.pts) From c7cc76b2b67ea338c57af1cf11c4b6eab901a36b Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Thu, 21 Nov 2019 16:52:55 +0100 Subject: [PATCH 345/357] increase plotarea for 3d plots in gr --- src/backends/gr.jl | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 4cdb6088..f94fa777 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -430,16 +430,8 @@ function gr_viewport_from_bbox(sp::Subplot{GRBackend}, bb::BoundingBox, w, h, vi viewport[2] = viewport_canvas[2] * (right(bb) / w) viewport[3] = viewport_canvas[4] * (1.0 - bottom(bb) / h) viewport[4] = viewport_canvas[4] * (1.0 - top(bb) / h) - if is3d(sp) - vp = viewport[:] - extent = min(vp[2] - vp[1], vp[4] - vp[3]) - viewport[1] = 0.5 * (vp[1] + vp[2] - extent) - viewport[2] = 0.5 * (vp[1] + vp[2] + extent) - viewport[3] = 0.5 * (vp[3] + vp[4] - extent) - viewport[4] = 0.5 * (vp[3] + vp[4] + extent) - end if hascolorbar(sp) - viewport[2] -= gr_colorbar_ratio + viewport[2] -= gr_colorbar_ratio * (1 + is3d(sp) / 2) end viewport end From 06afcedf565e18de13420eacf7ae41d4ac52addf Mon Sep 17 00:00:00 2001 From: daschw Date: Mon, 25 Nov 2019 08:37:46 +0100 Subject: [PATCH 346/357] implement 3d tick labels --- src/backends/gr.jl | 192 +++++++++++++++++++++++++++------------------ 1 file changed, 116 insertions(+), 76 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index f94fa777..a2d89688 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -291,18 +291,6 @@ gr_y_axislims(sp::Subplot) = axis_limits(sp, :y) gr_z_axislims(sp::Subplot) = axis_limits(sp, :z) gr_xy_axislims(sp::Subplot) = gr_x_axislims(sp)..., gr_y_axislims(sp)... -function gr_lims(sp::Subplot, axis::Axis, adjust::Bool, expand = nothing) - if expand !== nothing - expand_extrema!(axis, expand) - end - lims = axis_limits(sp, axis[:letter]) - if adjust - GR.adjustrange(lims...) - else - lims - end -end - function gr_fill_viewport(vp::AVec{Float64}, c) GR.savestate() @@ -1029,14 +1017,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) GR.setlinewidth(sp.plt[:thickness_scaling]) if is3d(sp) - # TODO do we really need a different clims computation here from the one - # computed above using get_clims(sp)? - zmin, zmax = gr_lims(sp, zaxis, true) - clims3d = sp[:clims] - if is_2tuple(clims3d) - isfinite(clims3d[1]) && (zmin = clims3d[1]) - isfinite(clims3d[2]) && (zmax = clims3d[2]) - end + zmin, zmax = axis_limits(sp, :z) GR.setspace(zmin, zmax, round.(Int, sp[:camera])...) xticks, yticks, zticks, xaxis_segs, yaxis_segs, zaxis_segs, xtick_segs, ytick_segs, ztick_segs, xgrid_segs, ygrid_segs, zgrid_segs, xminorgrid_segs, yminorgrid_segs, zminorgrid_segs, xborder_segs, yborder_segs, zborder_segs = axis_drawing_info_3d(sp) @@ -1128,62 +1109,121 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) # TODO: tick labels - # # tick marks - # if !(xticks in (:none, nothing, false)) && xaxis[:showaxis] - # # x labels - # flip, mirror = gr_set_xticks_font(sp) - # for (cv, dv) in zip(xticks...) - # # use xor ($) to get the right y coords - # xi, yi = GR.wctondc(cv, sp[:framestyle] == :origin ? 0 : xor(flip, mirror) ? ymax : ymin) - # if xaxis[:ticks] in (:auto, :native) - # # ensure correct dispatch in gr_text for automatic log ticks - # if xaxis[:scale] in _logScales - # dv = string(dv, "\\ ") - # elseif xaxis[:formatter] in (:scientific, :auto) - # dv = convert_sci_unicode(dv) - # end - # end - # gr_text(xi, yi + (mirror ? 1 : -1) * 5e-3 * (xaxis[:tick_direction] == :out ? 1.5 : 1.0), string(dv)) - # end - # end - # - # if !(yticks in (:none, nothing, false)) && yaxis[:showaxis] - # # y labels - # flip, mirror = gr_set_yticks_font(sp) - # for (cv, dv) in zip(yticks...) - # # use xor ($) to get the right y coords - # xi, yi = GR.wctondc(sp[:framestyle] == :origin ? 0 : xor(flip, mirror) ? xmax : xmin, cv) - # # @show cv dv xmin xi yi - # if yaxis[:ticks] in (:auto, :native) - # # ensure correct dispatch in gr_text for automatic log ticks - # if yaxis[:scale] in _logScales - # dv = string(dv, "\\ ") - # elseif yaxis[:formatter] in (:scientific, :auto) - # dv = convert_sci_unicode(dv) - # end - # end - # gr_text(xi + (mirror ? 1 : -1) * 1e-2 * (yaxis[:tick_direction] == :out ? 1.5 : 1.0), yi, string(dv)) - # end - # end - # - # if !(zticks in (:none, nothing, false)) && zaxis[:showaxis] - # # y labels - # flip, mirror = gr_set_yticks_font(sp) # TODO for z - # for (cv, dv) in zip(zticks...) - # # use xor ($) to get the right y coords - # xi, yi = GR.wctondc(sp[:framestyle] == :origin ? 0 : xor(flip, mirror) ? xmax : xmin, cv) - # # @show cv dv xmin xi yi - # if yaxis[:ticks] in (:auto, :native) - # # ensure correct dispatch in gr_text for automatic log ticks - # if yaxis[:scale] in _logScales - # dv = string(dv, "\\ ") - # elseif yaxis[:formatter] in (:scientific, :auto) - # dv = convert_sci_unicode(dv) - # end - # end - # gr_text(xi + (mirror ? 1 : -1) * 1e-2 * (yaxis[:tick_direction] == :out ? 1.5 : 1.0), yi, string(dv)) - # end - # end + # tick marks + if !(xticks in (:none, nothing, false)) && xaxis[:showaxis] + # x labels + gr_set_font( + tickfont(xaxis), + halign = (:left, :hcenter, :right)[sign(xaxis[:rotation]) + 2], + valign = (xaxis[:mirror] ? :bottom : :top), + rotation = xaxis[:rotation] + ) + yt = if sp[:framestyle] == :origin + 0 + elseif xor(xaxis[:mirror], yaxis[:flip]) + ymax + else + ymin + end + zt = if sp[:framestyle] == :origin + 0 + elseif xor(xaxis[:mirror], zaxis[:flip]) + zmax + else + zmin + end + for (cv, dv) in zip(xticks...) + xi, yi, zi = GR.wc3towc(cv, yt, zt) + xi, yi = GR.wctondc(xi, yi) + @show xi, yi + if xaxis[:ticks] in (:auto, :native) + # ensure correct dispatch in gr_text for automatic log ticks + if xaxis[:scale] in _logScales + dv = string(dv, "\\ ") + elseif xaxis[:formatter] in (:scientific, :auto) + dv = convert_sci_unicode(dv) + end + end + xi += (yaxis[:mirror] ? 1 : -1) * 1e-2 * (xaxis[:tick_direction] == :out ? 1.5 : 1.0) + yi += (xaxis[:mirror] ? 1 : -1) * 5e-3 * (xaxis[:tick_direction] == :out ? 1.5 : 1.0) + @show xi, yi + gr_text(xi, yi, string(dv)) + end + end + + if !(yticks in (:none, nothing, false)) && yaxis[:showaxis] + # y labels + gr_set_font( + tickfont(yaxis), + halign = (:left, :hcenter, :right)[sign(yaxis[:rotation]) + 2], + valign = (yaxis[:mirror] ? :bottom : :top), + rotation = yaxis[:rotation] + ) + xt = if sp[:framestyle] == :origin + 0 + elseif xor(yaxis[:mirror], xaxis[:flip]) + xmin + else + xmax + end + zt = if sp[:framestyle] == :origin + 0 + elseif xor(yaxis[:mirror], zaxis[:flip]) + zmax + else + zmin + end + for (cv, dv) in zip(yticks...) + xi, yi, zi = GR.wc3towc(xt, cv, zt) + xi, yi = GR.wctondc(xi, yi) + if yaxis[:ticks] in (:auto, :native) + # ensure correct dispatch in gr_text for automatic log ticks + if yaxis[:scale] in _logScales + dv = string(dv, "\\ ") + elseif xaxis[:formatter] in (:scientific, :auto) + dv = convert_sci_unicode(dv) + end + end + gr_text(xi + (yaxis[:mirror] ? -1 : 1) * 1e-2 * (yaxis[:tick_direction] == :out ? 1.5 : 1.0), yi + (yaxis[:mirror] ? 1 : -1) * 5e-3 * (yaxis[:tick_direction] == :out ? 1.5 : 1.0), string(dv)) + end + end + + if !(zticks in (:none, nothing, false)) && zaxis[:showaxis] + # z labels + gr_set_font( + tickfont(zaxis), + halign = (zaxis[:mirror] ? :right : :left), + valign = (:top, :vcenter, :bottom)[sign(zaxis[:rotation]) + 2], + rotation = zaxis[:rotation] + ) + xt = if sp[:framestyle] == :origin + 0 + elseif xor(zaxis[:mirror], xaxis[:flip]) + xmin + else + xmax + end + yt = if sp[:framestyle] == :origin + 0 + elseif xor(zaxis[:mirror], yaxis[:flip]) + ymin + else + ymax + end + for (cv, dv) in zip(zticks...) + xi, yi, zi = GR.wc3towc(xt, yt, cv) + xi, yi = GR.wctondc(xi, yi) + if zaxis[:ticks] in (:auto, :native) + # ensure correct dispatch in gr_text for automatic log ticks + if zaxis[:scale] in _logScales + dv = string(dv, "\\ ") + elseif zaxis[:formatter] in (:scientific, :auto) + dv = convert_sci_unicode(dv) + end + end + gr_text(xi + (zaxis[:mirror] ? -1 : 1) * 1e-2 * (zaxis[:tick_direction] == :out ? 1.5 : 1.0), yi, string(dv)) + end + end # # # border # intensity = sp[:framestyle] == :semi ? 0.5 : 1.0 From 0d09975fba237bf3e79136023d8b8b652dbc33ff Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Mon, 25 Nov 2019 23:10:18 +0100 Subject: [PATCH 347/357] avoid precompilation temporarily --- src/Plots.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Plots.jl b/src/Plots.jl index 6b64f9c0..91c6f9b2 100644 --- a/src/Plots.jl +++ b/src/Plots.jl @@ -222,7 +222,7 @@ end const CURRENT_BACKEND = CurrentBackend(:none) -include("precompile.jl") -_precompile_() +# include("precompile.jl") +# _precompile_() end # module From 58bf14fc85b9717c6a6b82c2e281911fc5a910a4 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 11 Dec 2019 17:31:05 +0100 Subject: [PATCH 348/357] minor preparations for guides --- src/backends/gr.jl | 74 ++++++++++++++++++++++------------------------ 1 file changed, 35 insertions(+), 39 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index a2d89688..c3472e00 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -589,13 +589,13 @@ function gr_legend_pos(sp::Subplot, w, h) if occursin("right", str) if occursin("outer", str) # As per https://github.com/jheinen/GR.jl/blob/master/src/jlgr.jl#L525 - xpos = viewport_plotarea[2] + 0.11 + ymirror * gr_yaxis_width(sp) + xpos = viewport_plotarea[2] + 0.11 + ymirror * gr_axis_width(sp, sp[:yaxis]) else xpos = viewport_plotarea[2] - 0.05 - w end elseif occursin("left", str) if occursin("outer", str) - xpos = viewport_plotarea[1] - 0.05 - w - !ymirror * gr_yaxis_width(sp) + xpos = viewport_plotarea[1] - 0.05 - w - !ymirror * gr_axis_width(sp, sp[:yaxis]) else xpos = viewport_plotarea[1] + 0.11 end @@ -604,13 +604,13 @@ function gr_legend_pos(sp::Subplot, w, h) end if occursin("top", str) if s == :outertop - ypos = viewport_plotarea[4] + 0.02 + h + xmirror * gr_xaxis_height(sp) + ypos = viewport_plotarea[4] + 0.02 + h + xmirror * gr_axis_height(sp, sp[:xaxis]) else ypos = viewport_plotarea[4] - 0.06 end elseif occursin("bottom", str) if s == :outerbottom - ypos = viewport_plotarea[3] - 0.05 - !xmirror * gr_xaxis_height(sp) + ypos = viewport_plotarea[3] - 0.05 - !xmirror * gr_axis_height(sp, sp[:xaxis]) else ypos = viewport_plotarea[3] + h + 0.06 end @@ -769,26 +769,24 @@ function gr_get_ticks_size(ticks, rot) return w, h end -function gr_xaxis_height(sp) - xaxis = sp[:xaxis] - xticks, yticks = get_ticks(sp, xaxis), get_ticks(sp, sp[:yaxis]) - gr_set_font(tickfont(xaxis)) - h = (xticks in (nothing, false, :none) ? 0 : last(gr_get_ticks_size(xticks, xaxis[:rotation]))) - if xaxis[:guide] != "" - gr_set_font(guidefont(xaxis)) - h += last(gr_text_size(xaxis[:guide])) +function gr_axis_height(sp, axis) + ticks = get_ticks(sp, axis) + gr_set_font(tickfont(axis)) + h = (ticks in (nothing, false, :none) ? 0 : last(gr_get_ticks_size(ticks, axis[:rotation]))) + if axis[:guide] != "" + gr_set_font(guidefont(axis)) + h += last(gr_text_size(axis[:guide])) end return h end -function gr_yaxis_width(sp) - yaxis = sp[:yaxis] - xticks, yticks = get_ticks(sp, sp[:xaxis]), get_ticks(sp, yaxis) - gr_set_font(tickfont(yaxis)) - w = (xticks in (nothing, false, :none) ? 0 : first(gr_get_ticks_size(yticks, yaxis[:rotation]))) - if yaxis[:guide] != "" - gr_set_font(guidefont(yaxis)) - w += last(gr_text_size(yaxis[:guide])) +function gr_axis_width(sp, axis) + ticks = get_ticks(sp, axis) + gr_set_font(tickfont(axis)) + w = (ticks in (nothing, false, :none) ? 0 : first(gr_get_ticks_size(ticks, axis[:rotation]))) + if axis[:guide] != "" + gr_set_font(guidefont(axis)) + w += last(gr_text_size(axis[:guide])) end return w end @@ -1107,8 +1105,6 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) end GR.setclip(1) - # TODO: tick labels - # tick marks if !(xticks in (:none, nothing, false)) && xaxis[:showaxis] # x labels @@ -1135,18 +1131,17 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) for (cv, dv) in zip(xticks...) xi, yi, zi = GR.wc3towc(cv, yt, zt) xi, yi = GR.wctondc(xi, yi) - @show xi, yi if xaxis[:ticks] in (:auto, :native) - # ensure correct dispatch in gr_text for automatic log ticks - if xaxis[:scale] in _logScales - dv = string(dv, "\\ ") - elseif xaxis[:formatter] in (:scientific, :auto) + if xaxis[:formatter] in (:scientific, :auto) + # ensure correct dispatch in gr_text for automatic log ticks + if xaxis[:scale] in _logScales + dv = string(dv, "\\ ") + end dv = convert_sci_unicode(dv) end end xi += (yaxis[:mirror] ? 1 : -1) * 1e-2 * (xaxis[:tick_direction] == :out ? 1.5 : 1.0) yi += (xaxis[:mirror] ? 1 : -1) * 5e-3 * (xaxis[:tick_direction] == :out ? 1.5 : 1.0) - @show xi, yi gr_text(xi, yi, string(dv)) end end @@ -1177,10 +1172,11 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) xi, yi, zi = GR.wc3towc(xt, cv, zt) xi, yi = GR.wctondc(xi, yi) if yaxis[:ticks] in (:auto, :native) - # ensure correct dispatch in gr_text for automatic log ticks - if yaxis[:scale] in _logScales - dv = string(dv, "\\ ") - elseif xaxis[:formatter] in (:scientific, :auto) + if xaxis[:formatter] in (:scientific, :auto) + # ensure correct dispatch in gr_text for automatic log ticks + if yaxis[:scale] in _logScales + dv = string(dv, "\\ ") + end dv = convert_sci_unicode(dv) end end @@ -1214,10 +1210,11 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) xi, yi, zi = GR.wc3towc(xt, yt, cv) xi, yi = GR.wctondc(xi, yi) if zaxis[:ticks] in (:auto, :native) - # ensure correct dispatch in gr_text for automatic log ticks - if zaxis[:scale] in _logScales - dv = string(dv, "\\ ") - elseif zaxis[:formatter] in (:scientific, :auto) + if zaxis[:formatter] in (:scientific, :auto) + # ensure correct dispatch in gr_text for automatic log ticks + if zaxis[:scale] in _logScales + dv = string(dv, "\\ ") + end dv = convert_sci_unicode(dv) end end @@ -1389,9 +1386,8 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) gr_set_font(guidefont(xaxis)) GR.titles3d(xaxis[:guide], yaxis[:guide], zaxis[:guide]) else - xticks, yticks = get_ticks(sp, sp[:xaxis]), get_ticks(sp, sp[:yaxis]) if xaxis[:guide] != "" - h = 0.01 + gr_xaxis_height(sp) + h = 0.01 + gr_axis_height(sp, xaxis) gr_set_font(guidefont(xaxis)) if xaxis[:guide_position] == :top || (xaxis[:guide_position] == :auto && xaxis[:mirror] == true) GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_TOP) @@ -1403,7 +1399,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) end if yaxis[:guide] != "" - w = 0.02 + gr_yaxis_width(sp) + w = 0.02 + gr_axis_width(sp, yaxis) gr_set_font(guidefont(yaxis)) GR.setcharup(-1, 0) if yaxis[:guide_position] == :right || (yaxis[:guide_position] == :auto && yaxis[:mirror] == true) From 85e5f2e9718213135d76cb353db1ee6772519518 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Wed, 11 Dec 2019 23:24:32 +0100 Subject: [PATCH 349/357] increase right margin for outer legend --- src/backends/gr.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index c3472e00..10974f4a 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -928,7 +928,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) leg_str = string(sp[:legend]) if occursin("outer", leg_str) if occursin("right", leg_str) - viewport_plotarea[2] -= legendw + 0.11 + viewport_plotarea[2] -= legendw + 0.12 elseif occursin("left", leg_str) viewport_plotarea[1] += legendw + 0.11 elseif occursin("top", leg_str) From c5fe90d135a7685387d0fb88b8e2913338b5a06d Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Fri, 13 Dec 2019 11:10:45 +0100 Subject: [PATCH 350/357] move zaxis to the left --- src/axes.jl | 28 ++++++++++++++-------------- src/backends/gr.jl | 12 ++++++------ 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/axes.jl b/src/axes.jl index 82bf5bdf..baebcaac 100644 --- a/src/axes.jl +++ b/src/axes.jl @@ -931,12 +931,12 @@ function axis_drawing_info_3d(sp::Subplot) x1, x2 = if sp[:framestyle] in (:origin, :zerolines) 0.0, 0.0 else - xor(zaxis[:mirror], xaxis[:flip]) ? (xmin, xmax) : (xmax, xmin) + xor(zaxis[:mirror], xaxis[:flip]) ? (xmax, xmin) : (xmin, xmax) end y1, y2 = if sp[:framestyle] in (:origin, :zerolines) 0.0, 0.0 else - xor(zaxis[:mirror], yaxis[:flip]) ? (ymin, ymax) : (ymax, ymin) + xor(zaxis[:mirror], yaxis[:flip]) ? (ymax, ymin) : (ymin, ymax) end if zaxis[:showaxis] if sp[:framestyle] != :grid @@ -953,48 +953,48 @@ function axis_drawing_info_3d(sp::Subplot) f = scalefunc(xaxis[:scale]) invf = invscalefunc(xaxis[:scale]) tick_start, tick_stop = if sp[:framestyle] == :origin - t = invf(f(0) + 0.012 * (f(xmax) - f(xmin))) + t = invf(f(0) + 0.012 * (f(ymax) - f(ymin))) (-t, t) else ticks_in = zaxis[:tick_direction] == :out ? -1 : 1 - t = invf(f(x1) + 0.012 * (f(x2) - f(x1)) * ticks_in) - (x1, t) + t = invf(f(y1) + 0.012 * (f(y2) - f(y1)) * ticks_in) + (y1, t) end for ztick in zticks[1] if zaxis[:showaxis] - push!(ztick_segs, (tick_start, y1, ztick), (tick_stop, y1, ztick)) # left tick + push!(ztick_segs, (x1, tick_start, ztick), (x1, tick_stop, ztick)) # left tick end if zaxis[:grid] if sp[:framestyle] in (:origin, :zerolines) push!(zgrid_segs, (xmin, 0.0, ztick), (xmax, 0.0, ztick)) push!(ygrid_segs, (0.0, ymin, ztick), (0.0, ymax, ztick)) else - push!(ygrid_segs, (x1, y1, ztick), (x2, y1, ztick)) - push!(ygrid_segs, (x2, y1, ztick), (x2, y2, ztick)) + push!(ygrid_segs, (x1, y1, ztick), (x1, y2, ztick)) + push!(ygrid_segs, (x1, y2, ztick), (x2, y2, ztick)) end end end if !(zaxis[:minorticks] in (:none, nothing, false)) || zaxis[:minorgrid] tick_start, tick_stop = if sp[:framestyle] == :origin - t = invf(f(0) + 0.006 * (f(xmax) - f(xmin))) + t = invf(f(0) + 0.006 * (f(ymax) - f(ymin))) (-t, t) else - t = invf(f(x1) + 0.006 * (f(x2) - f(x1)) * ticks_in) - (x1, t) + t = invf(f(y1) + 0.006 * (f(y2) - f(y1)) * ticks_in) + (y1, t) end for ztick in zminorticks if zaxis[:showaxis] - push!(ztick_segs, (tick_start, y1, ztick), (tick_stop, y1, ztick)) # left tick + push!(ztick_segs, (x1, tick_start, ztick), (x1, tick_stop, ztick)) # left tick end if zaxis[:minorgrid] if sp[:framestyle] in (:origin, :zerolines) push!(zminorgrid_segs, (xmin, 0.0, ztick), (xmax, 0.0, ztick)) push!(zminorgrid_segs, (0.0, ymin, ztick), (0.0, ymax, ztick)) else - push!(zminorgrid_segs, (x1, y1, ztick), (x2, y1, ztick)) - push!(zminorgrid_segs, (x2, y1, ztick), (x2, y2, ztick)) + push!(zminorgrid_segs, (x1, y1, ztick), (x1, y2, ztick)) + push!(zminorgrid_segs, (x1, y2, ztick), (x2, y2, ztick)) end end end diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 10974f4a..956e2260 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -1188,23 +1188,23 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) # z labels gr_set_font( tickfont(zaxis), - halign = (zaxis[:mirror] ? :right : :left), + halign = (zaxis[:mirror] ? :left : :right), valign = (:top, :vcenter, :bottom)[sign(zaxis[:rotation]) + 2], rotation = zaxis[:rotation] ) xt = if sp[:framestyle] == :origin 0 elseif xor(zaxis[:mirror], xaxis[:flip]) - xmin - else xmax + else + xmin end yt = if sp[:framestyle] == :origin 0 elseif xor(zaxis[:mirror], yaxis[:flip]) - ymin - else ymax + else + ymin end for (cv, dv) in zip(zticks...) xi, yi, zi = GR.wc3towc(xt, yt, cv) @@ -1218,7 +1218,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) dv = convert_sci_unicode(dv) end end - gr_text(xi + (zaxis[:mirror] ? -1 : 1) * 1e-2 * (zaxis[:tick_direction] == :out ? 1.5 : 1.0), yi, string(dv)) + gr_text(xi + (zaxis[:mirror] ? 1 : -1) * 1e-2 * (zaxis[:tick_direction] == :out ? 1.5 : 1.0), yi, string(dv)) end end # From aef75cb07375d9d13f595c8517fd4fcb0dbab0d6 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Fri, 13 Dec 2019 14:13:05 +0100 Subject: [PATCH 351/357] add guides and fix 3d bg_inside --- src/backends/gr.jl | 236 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 187 insertions(+), 49 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 956e2260..7db386aa 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -400,6 +400,12 @@ function gr_nans_to_infs!(z) end end +function gr_w3tondc(x, y, z) + xw, yw, zw = GR.wc3towc(x, y, z) + x, y = GR.wctondc(xw, yw) + return x, y +end + # -------------------------------------------------------------------------------------- # viewport plot area @@ -810,48 +816,132 @@ function _update_min_padding!(sp::Subplot{GRBackend}) h = 1mm + gr_plot_size[2] * l * px toppad += h end - # Add margin for x and y ticks - xticks, yticks = get_ticks(sp, sp[:xaxis]), get_ticks(sp, sp[:yaxis]) - if !(xticks in (nothing, false, :none)) - flip, mirror = gr_set_xticks_font(sp) - l = 0.01 + last(gr_get_ticks_size(xticks, sp[:xaxis][:rotation])) - h = 1mm + gr_plot_size[2] * l * px - if mirror - toppad += h - else - bottompad += h + + if is3d(sp) + xaxis, yaxis, zaxis = sp[:xaxis], sp[:yaxis], sp[:zaxis] + xticks, yticks, zticks = get_ticks(sp, xaxis), get_ticks(sp, yaxis), get_ticks(sp, zaxis) + # Add margin for x and y ticks + h = 0mm + if !(xticks in (nothing, false, :none)) + gr_set_font( + tickfont(xaxis), + halign = (:left, :hcenter, :right)[sign(xaxis[:rotation]) + 2], + valign = (xaxis[:mirror] ? :bottom : :top), + rotation = xaxis[:rotation] + ) + l = 0.01 + last(gr_get_ticks_size(xticks, xaxis[:rotation])) + h = max(h, 1mm + gr_plot_size[2] * l * px) end - end - if !(yticks in (nothing, false, :none)) - flip, mirror = gr_set_yticks_font(sp) - l = 0.01 + first(gr_get_ticks_size(yticks, sp[:yaxis][:rotation])) - w = 1mm + gr_plot_size[1] * l * px - if mirror - rightpad += w - else - leftpad += w + if !(yticks in (nothing, false, :none)) + gr_set_font( + tickfont(yaxis), + halign = (:left, :hcenter, :right)[sign(yaxis[:rotation]) + 2], + valign = (yaxis[:mirror] ? :bottom : :top), + rotation = yaxis[:rotation] + ) + l = 0.01 + last(gr_get_ticks_size(yticks, yaxis[:rotation])) + h = max(h, 1mm + gr_plot_size[2] * l * px) end - end - # Add margin for x label - if sp[:xaxis][:guide] != "" - gr_set_font(guidefont(sp[:xaxis])) - l = last(gr_text_size(sp[:xaxis][:guide])) - h = 1mm + gr_plot_size[2] * l * px - if sp[:xaxis][:guide_position] == :top || (sp[:xaxis][:guide_position] == :auto && sp[:xaxis][:mirror] == true) - toppad += h - else - bottompad += h + if h > 0mm + if xaxis[:mirror] || yaxis[:mirror] + toppad += h + end + if !xaxis[:mirror] || !yaxis[:mirror] + bottompad += h + end end - end - # Add margin for y label - if sp[:yaxis][:guide] != "" - gr_set_font(guidefont(sp[:yaxis])) - l = last(gr_text_size(sp[:yaxis][:guide])) - w = 1mm + gr_plot_size[2] * l * px - if sp[:yaxis][:guide_position] == :right || (sp[:yaxis][:guide_position] == :auto && sp[:yaxis][:mirror] == true) - rightpad += w - else - leftpad += w + + if !(zticks in (nothing, false, :none)) + gr_set_font( + tickfont(zaxis), + halign = (zaxis[:mirror] ? :left : :right), + valign = (:top, :vcenter, :bottom)[sign(zaxis[:rotation]) + 2], + rotation = zaxis[:rotation] + ) + l = 0.01 + first(gr_get_ticks_size(zticks, zaxis[:rotation])) + w = 1mm + gr_plot_size[1] * l * px + if zaxis[:mirror] + rightpad += w + else + leftpad += w + end + end + + # Add margin for x or y label + h = 0mm + if xaxis[:guide] != "" + gr_set_font(guidefont(sp[:xaxis])) + l = last(gr_text_size(sp[:xaxis][:guide])) + h = max(h, 1mm + gr_plot_size[2] * l * px) + end + if yaxis[:guide] != "" + gr_set_font(guidefont(sp[:yaxis])) + l = last(gr_text_size(sp[:yaxis][:guide])) + h = max(h, 1mm + gr_plot_size[2] * l * px) + end + if h > 0mm + if xaxis[:guide_position] == :top || (xaxis[:guide_position] == :auto && xaxis[:mirror] == true) + toppad += h + else + bottompad += h + end + end + # Add margin for z label + if zaxis[:guide] != "" + gr_set_font(guidefont(sp[:zaxis])) + l = last(gr_text_size(sp[:zaxis][:guide])) + w = 1mm + gr_plot_size[2] * l * px + if zaxis[:guide_position] == :right || (zaxis[:guide_position] == :auto && zaxis[:mirror] == true) + rightpad += w + else + leftpad += w + end + end + else + # Add margin for x and y ticks + xticks, yticks = get_ticks(sp, sp[:xaxis]), get_ticks(sp, sp[:yaxis]) + if !(xticks in (nothing, false, :none)) + flip, mirror = gr_set_xticks_font(sp) + l = 0.01 + last(gr_get_ticks_size(xticks, sp[:xaxis][:rotation])) + h = 1mm + gr_plot_size[2] * l * px + if mirror + toppad += h + else + bottompad += h + end + end + if !(yticks in (nothing, false, :none)) + flip, mirror = gr_set_yticks_font(sp) + l = 0.01 + first(gr_get_ticks_size(yticks, sp[:yaxis][:rotation])) + w = 1mm + gr_plot_size[1] * l * px + if mirror + rightpad += w + else + leftpad += w + end + end + + # Add margin for x label + if sp[:xaxis][:guide] != "" + gr_set_font(guidefont(sp[:xaxis])) + l = last(gr_text_size(sp[:xaxis][:guide])) + h = 1mm + gr_plot_size[2] * l * px + if sp[:xaxis][:guide_position] == :top || (sp[:xaxis][:guide_position] == :auto && sp[:xaxis][:mirror] == true) + toppad += h + else + bottompad += h + end + end + # Add margin for y label + if sp[:yaxis][:guide] != "" + gr_set_font(guidefont(sp[:yaxis])) + l = last(gr_text_size(sp[:yaxis][:guide])) + w = 1mm + gr_plot_size[2] * l * px + if sp[:yaxis][:guide_position] == :right || (sp[:yaxis][:guide_position] == :auto && sp[:yaxis][:mirror] == true) + rightpad += w + else + leftpad += w + end end end if sp[:colorbar_title] != "" @@ -940,7 +1030,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) # fill in the plot area background bg = plot_color(sp[:background_color_inside]) - gr_fill_viewport(viewport_plotarea, bg) + is3d(sp) || gr_fill_viewport(viewport_plotarea, bg) # reduced from before... set some flags based on the series in this subplot # TODO: can these be generic flags? @@ -1020,6 +1110,14 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) xticks, yticks, zticks, xaxis_segs, yaxis_segs, zaxis_segs, xtick_segs, ytick_segs, ztick_segs, xgrid_segs, ygrid_segs, zgrid_segs, xminorgrid_segs, yminorgrid_segs, zminorgrid_segs, xborder_segs, yborder_segs, zborder_segs = axis_drawing_info_3d(sp) + # fill the plot area + gr_set_fill(sp[:background_color_inside]) + plot_area_x = [xmin, xmin, xmin, xmax, xmax, xmax, xmin] + plot_area_y = [ymin, ymin, ymax, ymax, ymax, ymin, ymin] + plot_area_z = [zmin, zmax, zmax, zmax, zmin, zmin, zmin] + x_bg, y_bg = unzip(GR.wc3towc.(plot_area_x, plot_area_y, plot_area_z)) + GR.fillarea(x_bg, y_bg) + # draw the grid lines if xaxis[:grid] gr_set_line(xaxis[:gridlinewidth], xaxis[:gridstyle], xaxis[:foreground_color_grid]) @@ -1129,8 +1227,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) zmin end for (cv, dv) in zip(xticks...) - xi, yi, zi = GR.wc3towc(cv, yt, zt) - xi, yi = GR.wctondc(xi, yi) + xi, yi = gr_w3tondc(cv, yt, zt) if xaxis[:ticks] in (:auto, :native) if xaxis[:formatter] in (:scientific, :auto) # ensure correct dispatch in gr_text for automatic log ticks @@ -1169,8 +1266,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) zmin end for (cv, dv) in zip(yticks...) - xi, yi, zi = GR.wc3towc(xt, cv, zt) - xi, yi = GR.wctondc(xi, yi) + xi, yi = gr_w3tondc(xt, cv, zt) if yaxis[:ticks] in (:auto, :native) if xaxis[:formatter] in (:scientific, :auto) # ensure correct dispatch in gr_text for automatic log ticks @@ -1207,8 +1303,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) ymin end for (cv, dv) in zip(zticks...) - xi, yi, zi = GR.wc3towc(xt, yt, cv) - xi, yi = GR.wctondc(xi, yi) + xi, yi = gr_w3tondc(xt, yt, cv) if zaxis[:ticks] in (:auto, :native) if zaxis[:formatter] in (:scientific, :auto) # ensure correct dispatch in gr_text for automatic log ticks @@ -1383,8 +1478,51 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) gr_text(xpos, viewport_subplot[4], sp[:title]) end if is3d(sp) - gr_set_font(guidefont(xaxis)) - GR.titles3d(xaxis[:guide], yaxis[:guide], zaxis[:guide]) + if xaxis[:guide] != "" + gr_set_font( + guidefont(xaxis), + halign = (:left, :hcenter, :right)[sign(xaxis[:rotation]) + 2], + valign = (xaxis[:mirror] ? :bottom : :top), + rotation = xaxis[:rotation] + ) + yg = xor(xaxis[:mirror], yaxis[:flip]) ? ymax : ymin + zg = xor(xaxis[:mirror], zaxis[:flip]) ? zmax : zmin + xg = (xmin + xmax) / 2 + xndc, yndc = gr_w3tondc(xg, yg, zg) + h = gr_axis_height(sp, xaxis) + gr_text(xndc - h, yndc - h, xaxis[:guide]) + end + + if yaxis[:guide] != "" + gr_set_font( + guidefont(yaxis), + halign = (:left, :hcenter, :right)[sign(yaxis[:rotation]) + 2], + valign = (yaxis[:mirror] ? :bottom : :top), + rotation = yaxis[:rotation] + ) + xg = xor(yaxis[:mirror], xaxis[:flip]) ? xmin : xmax + yg = (ymin + ymax) / 2 + zg = xor(yaxis[:mirror], zaxis[:flip]) ? zmax : zmin + xndc, yndc = gr_w3tondc(xg, yg, zg) + h = gr_axis_height(sp, yaxis) + gr_text(xndc + h, yndc - h, yaxis[:guide]) + end + + if zaxis[:guide] != "" + gr_set_font( + guidefont(zaxis), + halign = (:left, :hcenter, :right)[sign(zaxis[:rotation]) + 2], + valign = (zaxis[:mirror] ? :bottom : :top), + rotation = zaxis[:rotation] + ) + xg = xor(zaxis[:mirror], xaxis[:flip]) ? xmax : xmin + yg = xor(zaxis[:mirror], yaxis[:flip]) ? ymax : ymin + zg = (zmin + zmax) / 2 + xndc, yndc = gr_w3tondc(xg, yg, zg) + w = gr_axis_width(sp, zaxis) + GR.setcharup(-1, 0) + gr_text(xndc - w, yndc, zaxis[:guide]) + end else if xaxis[:guide] != "" h = 0.01 + gr_axis_height(sp, xaxis) @@ -1778,7 +1916,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) for ann in sp[:annotations] x, y, val = locate_annotation(sp, ann...) x, y = if is3d(sp) - # GR.wc3towc(x, y, z) + gr_w3tondc(x, y, z) else GR.wctondc(x, y) end From 68a0baf2997d49074d71d7e212a49ad6ec7a0b3b Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Fri, 13 Dec 2019 14:55:16 +0100 Subject: [PATCH 352/357] update and reactivate precompile --- src/Plots.jl | 4 +- src/precompile.jl | 1724 ++++++++++++++++++++++----------------------- 2 files changed, 864 insertions(+), 864 deletions(-) diff --git a/src/Plots.jl b/src/Plots.jl index 91c6f9b2..6b64f9c0 100644 --- a/src/Plots.jl +++ b/src/Plots.jl @@ -222,7 +222,7 @@ end const CURRENT_BACKEND = CurrentBackend(:none) -# include("precompile.jl") -# _precompile_() +include("precompile.jl") +_precompile_() end # module diff --git a/src/precompile.jl b/src/precompile.jl index c8e29950..a171ac36 100644 --- a/src/precompile.jl +++ b/src/precompile.jl @@ -1,873 +1,873 @@ function _precompile_() ccall(:jl_generating_output, Cint, ()) == 1 || return nothing - precompile(Tuple{typeof(Plots.gr_draw_marker), Float64, Float64, Int64, Plots.Shape}) - precompile(Tuple{typeof(Plots.gr_display), Plots.Subplot{Plots.GRBackend}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.legendtitlefont), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.shape_data), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots.preprocessArgs!), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.replaceAlias!), Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Symbol}}) - precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Int64, Plots.Shape}) - precompile(Tuple{typeof(Plots.preprocessArgs!), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.warnOnUnsupported), Plots.GRBackend, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._update_min_padding!), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.legendtitlefont), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.layout_args), Base.Dict{Symbol, Any}, Int64}) - precompile(Tuple{typeof(Plots.contour_levels), Plots.Series, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}}) - precompile(Tuple{typeof(Plots.color_or_nothing!), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.warnOnUnsupported_args), Plots.GRBackend, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.gr_display), Plots.Subplot{Plots.GRBackend}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Float64, 1}, Array{Any, 1}}}) - precompile(Tuple{typeof(Plots.gr_text), Float64, Float64, String}) - precompile(Tuple{typeof(Plots._update_subplot_colors), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}}) - precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64, Array{Plots.Plot{T} where T<:RecipesBase.AbstractBackend, 1}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Symbol, Symbol}) - precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Float64, Plots.Shape}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.axis_drawing_info), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}}) - precompile(Tuple{typeof(Plots.get_markercolor), Plots.Series, Float64, Float64, Int64}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{}}) - precompile(Tuple{typeof(Plots.gr_xaxis_height), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.layout_args), Base.Dict{Symbol, Any}, Int64}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Array{T, 1} where T, 1}}}) - precompile(Tuple{typeof(Plots.iscontour), Plots.Series}) - precompile(Tuple{typeof(Plots.__init__)}) - precompile(Tuple{typeof(Plots.gr_set_gradient), PlotUtils.ColorGradient}) - precompile(Tuple{typeof(Plots.get_clims), Plots.Series}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}}) - precompile(Tuple{typeof(Plots.gr_draw_colorbar), Plots.GRColorbar, Plots.Subplot{Plots.GRBackend}, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64, Array{Plots.Plot{T} where T<:RecipesBase.AbstractBackend, 1}}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) - precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Float64, 1}, Array{String, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.Spy}}) - precompile(Tuple{typeof(Plots.default_should_widen), Plots.Axis}) - precompile(Tuple{typeof(Plots.add_layout_pct!), Base.Dict{Symbol, Any}, Expr, Int64, Int64}) - precompile(Tuple{typeof(Plots.gr_set_linecolor), PlotUtils.ColorGradient}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) - precompile(Tuple{typeof(Plots.getxy), Plots.Plot{Plots.GRBackend}, Int64}) - precompile(Tuple{typeof(Plots.recompute_lengths), Array{Measures.Measure, 1}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}}) - precompile(Tuple{typeof(Plots.has_attribute_segments), Plots.Series}) - precompile(Tuple{typeof(Plots.gr_set_viewport_cmap), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.gr_polaraxes), Int64, Float64, Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Float64}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{}}) - precompile(Tuple{typeof(Plots.is_attr_supported), Symbol}) - precompile(Tuple{typeof(Plots._backend_instance), Symbol}) - precompile(Tuple{typeof(Plots.axis_drawing_info), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Symbol, Symbol}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._backend_instance), Symbol}) - precompile(Tuple{typeof(Plots._plots_defaults)}) - precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Int64, 1}}}) - precompile(Tuple{typeof(Plots.pie_labels), Plots.Subplot{Plots.GRBackend}, Plots.Series}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._preprocess_barlike), Base.Dict{Symbol, Any}, Array{Int64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.link_axes!), Plots.Axis, Plots.Axis}) - precompile(Tuple{typeof(Plots.showaxis), Symbol, Symbol}) - precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, Base.StepRange{Int64, Int64}, Symbol}) - precompile(Tuple{typeof(Plots._heatmap_edges), Array{Float64, 1}, Bool}) - precompile(Tuple{typeof(Plots.convertToAnyVector), Int64, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.gr_get_color), Plots.Series}) - precompile(Tuple{typeof(Plots._cbar_unique), Array{Int64, 1}, String}) - precompile(Tuple{typeof(Plots.gr_viewport_from_bbox), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) - precompile(Tuple{typeof(Plots.ensure_gradient!), Base.Dict{Symbol, Any}, Symbol, Symbol}) - precompile(Tuple{typeof(Plots._cbar_unique), Array{Nothing, 1}, String}) - precompile(Tuple{typeof(Plots.isvertical), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.hasgrid), Symbol, Symbol}) - precompile(Tuple{typeof(Plots._cbar_unique), Array{Symbol, 1}, String}) - precompile(Tuple{typeof(Plots.titlefont), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.gr_set_yticks_font), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.GRBackend}, Symbol, Bool, Bool}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Plots.Surface{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy}}) - precompile(Tuple{typeof(Plots.series_annotations_shapes!), Plots.Series, Symbol}) - precompile(Tuple{typeof(Plots.aliasesAndAutopick), Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Symbol}, Array{Symbol, 1}, Int64}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) - precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Char}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, typeof(Base.log), Int64}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}}) - precompile(Tuple{typeof(Plots.default_should_widen), Plots.Axis}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy}}) - precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, String, Symbol}) - precompile(Tuple{typeof(Plots.warnOnUnsupported_scales), Plots.GRBackend, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._update_series_attributes!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._plot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Function, 1}, Int64}}) - precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, String}) - precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Float64, 1}, Array{String, 1}}}) - precompile(Tuple{typeof(Plots.iscontour), Plots.Series}) - precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, Tuple{Int64, Int64}, Symbol}) - precompile(Tuple{typeof(Plots.gr_display), Plots.Plot{Plots.GRBackend}, String}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{String, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.reset_extrema!), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.gr_inqtext), Int64, Int64, String}) - precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._cbar_unique), Array{PlotUtils.ColorGradient, 1}, String}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}}) - precompile(Tuple{typeof(Plots.convert_to_polar), Array{Float64, 1}, Array{Float64, 1}, Tuple{Int64, Float64}}) - precompile(Tuple{typeof(Plots._update_min_padding!), Plots.GridLayout}) - precompile(Tuple{typeof(Plots._process_seriesrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Function, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.ispolar), Plots.Series}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.gr_xaxis_height), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.UnitRange{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Int64}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.process_annotation), Plots.Subplot{Plots.GRBackend}, Int64, Float64, Plots.PlotText, Plots.Font}) - precompile(Tuple{typeof(Plots._add_defaults!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Int64}) - precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{Any, 1}}, Int64}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}}) - precompile(Tuple{typeof(Plots.colorbar_style), Plots.Series}) - precompile(Tuple{typeof(Plots._process_seriesrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._add_markershape), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Symbol, Symbol}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.make_steps), Array{Float64, 1}, Symbol}) - precompile(Tuple{typeof(Plots.wraptuple), Int64}) - precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Union{Base.Missing, Int64}, 1}}) - precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Array{T, 1} where T, 1}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._bin_centers), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.gr_yaxis_width), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._pick_default_backend)}) - precompile(Tuple{typeof(Plots.gr_legend_pos), Plots.Subplot{Plots.GRBackend}, Float64, Float64}) - precompile(Tuple{typeof(Plots.get_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis}) - precompile(Tuple{typeof(Plots.get_clims), Plots.Series}) - precompile(Tuple{typeof(Plots.gr_draw_marker), Float64, Float64, Int64, Symbol}) - precompile(Tuple{typeof(Plots._hist_edges), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Tuple{Int64, Int64}}) - precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Int64, Symbol}) - precompile(Tuple{typeof(Plots.straightline_data), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, Symbol, Symbol}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}}) - precompile(Tuple{typeof(Plots.is_marker_supported), Symbol}) - precompile(Tuple{typeof(Plots.straightline_data), Tuple{Int64, Int64}, Tuple{Float64, Float64}, Array{Float64, 1}, Array{Float64, 1}, Int64}) - precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.get_markerstrokecolor), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots._preprocess_userrecipe), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Int64}) - precompile(Tuple{typeof(Plots.is_seriestype_supported), Plots.GRBackend, Symbol}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}}) - precompile(Tuple{typeof(Plots._update_subplot_periphery), Plots.Subplot{Plots.GRBackend}, Array{Any, 1}}) - precompile(Tuple{typeof(Plots.gr_set_line), Float64, Symbol, ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots.make_steps), Array{Int64, 1}, Symbol}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Function, 1}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.filter_data), Base.UnitRange{Int64}, Array{Int64, 1}}) - precompile(Tuple{typeof(Plots.is3d), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Int64, Symbol}) - precompile(Tuple{typeof(Plots._update_series_attributes!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Float64, Int64, Bool}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Float64}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Plots.Spy}}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) - precompile(Tuple{typeof(Plots.recompute_lengths), Array{Measures.Measure, 1}}) - precompile(Tuple{typeof(Plots._preprocess_barlike), Base.Dict{Symbol, Any}, Array{Float64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Int64}) - precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Plots.OHLC{T} where T<:Real, 1}}}) - precompile(Tuple{typeof(Plots.create_grid_curly), Expr}) - precompile(Tuple{typeof(Plots._replace_linewidth), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._cbar_unique), Array{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, 1}, String}) - precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.ignorenan_extrema), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.frame), Plots.Animation}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) - precompile(Tuple{typeof(Plots.xlims), Int64}) - precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Base.StepRange{Int64, Int64}}) - precompile(Tuple{typeof(Plots._prepare_subplot), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Float64, Float64, Int64}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Any}, Int64, Bool}) - precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.GRBackend}, Symbol, Bool, Bool}) - precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Array{Any, 1}}) - precompile(Tuple{typeof(Plots.filter_data), Array{Float64, 1}, Array{Int64, 1}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.gr_lims), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Bool, Nothing}) - precompile(Tuple{typeof(Plots.make_steps), Base.UnitRange{Int64}, Symbol}) - precompile(Tuple{typeof(Plots.reset_extrema!), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) - precompile(Tuple{typeof(Plots.gr_set_markercolor), ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Array{Any, 1}, Int64, Bool}) - precompile(Tuple{typeof(Plots._update_plot_args), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Float64, Float64, Int64}) - precompile(Tuple{typeof(Plots.gr_inqtext), Int64, Int64, String}) - precompile(Tuple{typeof(Plots._add_errorbar_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Bool}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Plots.PortfolioComposition}}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Nothing, Int64, Bool}) - precompile(Tuple{typeof(Plots.get_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis}) - precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Base.UnitRange{Int64}}) - precompile(Tuple{typeof(Plots._update_min_padding!), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.gr_set_line), Int64, Symbol, ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots.gr_get_color), Plots.Series}) - precompile(Tuple{typeof(Plots.fg_color), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Array{Float64, 1}, 1}}) - precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Int64, Int64, Plots.Shape}) - precompile(Tuple{typeof(Plots.shape_data), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.UnitRange{Int64}}) - precompile(Tuple{typeof(Plots._prepare_annotations), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.should_add_to_legend), Plots.Series}) - precompile(Tuple{typeof(Plots._update_min_padding!), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.is_scale_supported), Plots.GRBackend, Symbol}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout, Array{Measures.Length{:mm, Float64}, 1}}) - precompile(Tuple{typeof(Plots._series_index), Base.Dict{Symbol, Any}, Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._process_plotrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}, Array{Base.Dict{Symbol, Any}, 1}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Base.Complex{Float64}, 1}}}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Tuple{Int64, Int64}, Int64, Bool}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.Spy}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.warnOnUnsupported_args), Plots.GRBackend, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Union{Base.Missing, Int64}, 1}}}) - precompile(Tuple{typeof(Plots.backend), Symbol}) - precompile(Tuple{typeof(Plots.ignorenan_extrema), Base.StepRange{Int64, Int64}}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) - precompile(Tuple{typeof(Plots.is_marker_supported), Plots.GRBackend, Symbol}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.convert_sci_unicode), String}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Measures.Length{:mm, Float64}, Int64, Bool}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Int64, Int64, Bool}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.UnitRange{Int64}}}) - precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Symbol, Symbol}) - precompile(Tuple{typeof(Plots.build_layout), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) - precompile(Tuple{typeof(Plots._cycle), Array{String, 1}, Int64}) - precompile(Tuple{typeof(Plots.ensure_gradient!), Base.Dict{Symbol, Any}, Symbol, Symbol}) - precompile(Tuple{typeof(Plots.make_fillrange_side), Array{Float64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.setxy!), Plots.Plot{Plots.GRBackend}, Tuple{Array{Float64, 1}, Array{Float64, 1}}, Int64}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Bool, Int64, Bool}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.link_subplots), Array{RecipesBase.AbstractLayout, 1}, Symbol}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Symbol, Int64, Bool}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, String, Int64, Bool}) - precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol, Bool}) - precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Function, 1}}) - precompile(Tuple{typeof(Plots._update_subplot_periphery), Plots.Subplot{Plots.GRBackend}, Array{Any, 1}}) - precompile(Tuple{typeof(Plots.ignorenan_extrema), Array{Float64, 2}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Int64}) - precompile(Tuple{typeof(Plots.process_fillrange), Int64, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.make_fillrange_side), Array{Float64, 1}, Int64}) - precompile(Tuple{typeof(Plots.iter_segments), Plots.Series}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}}) - precompile(Tuple{typeof(Plots._update_min_padding!), Plots.GridLayout}) - precompile(Tuple{typeof(Plots.like_histogram), Symbol}) - precompile(Tuple{typeof(Plots.get_series_color), ColorTypes.RGBA{Float64}, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) - precompile(Tuple{typeof(Plots._replace_linewidth), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.get_markercolor), Plots.Series, Float64, Float64, Int64}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.update_inset_bboxes!), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) - precompile(Tuple{typeof(Plots.gr_text_size), String}) - precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Function, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) - precompile(Tuple{typeof(Plots._process_seriesrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}}) - precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout, Array{Measures.Length{:mm, Float64}, 1}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.slice_arg), ColorTypes.RGBA{Float64}, Int64}) - precompile(Tuple{typeof(Plots._update_subplot_args), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Int64, Bool}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}}) - precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Float64, Float64, Int64}) - precompile(Tuple{typeof(Plots._cycle), Base.StepRange{Int64, Int64}, Int64}) - precompile(Tuple{typeof(Plots.ignorenan_maximum), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.warnOnUnsupported), Plots.GRBackend, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Float64, Int64, Bool}) - precompile(Tuple{typeof(Plots.isvertical), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.warnOnUnsupported_scales), Plots.GRBackend, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Base.Missing}) - precompile(Tuple{typeof(Plots.gr_fill_viewport), Array{Float64, 1}, ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots._process_plotrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}, Array{Base.Dict{Symbol, Any}, 1}}) - precompile(Tuple{typeof(Plots.create_grid_curly), Expr}) - precompile(Tuple{typeof(Plots._add_markershape), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._add_defaults!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Int64}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Bool}) - precompile(Tuple{typeof(Plots._add_smooth_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.title!), String}) - precompile(Tuple{typeof(Plots.prepare_output), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Float64}) - precompile(Tuple{typeof(Plots.has_attribute_segments), Plots.Series}) - precompile(Tuple{typeof(Plots.supported_markers)}) - isdefined(Plots, Symbol("#kw##histogram2d")) && precompile(Tuple{getfield(Plots, Symbol("#kw##histogram2d")), NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio), Tuple{Tuple{Int64, Int64}, Bool, Bool, Int64}}, typeof(Plots.histogram2d), Array{Base.Complex{Float64}, 1}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}}) - precompile(Tuple{typeof(Plots.tickfont), Plots.Axis}) - precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{String, 1}}, Int64}) - precompile(Tuple{typeof(Plots._update_clims), Float64, Float64, Int64, Int64}) - precompile(Tuple{typeof(Plots.wand_edges), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Plots.Surface{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._update_subplot_args), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Int64, Bool}) - precompile(Tuple{typeof(Plots._preprocess_userrecipe), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}}) - precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Symbol}) - precompile(Tuple{typeof(Plots.is_marker_supported), Symbol}) - precompile(Tuple{typeof(Plots._update_axis), Plots.Axis, Base.Dict{Symbol, Any}, Symbol, Int64}) - precompile(Tuple{typeof(Plots._subplot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Plots.Stroke}) - precompile(Tuple{typeof(Plots.calc_num_subplots), Plots.GridLayout}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.extendSeriesData), Array{Float64, 1}, Float64}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Int64, Int64, Bool}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Plots.Shape}) - precompile(Tuple{typeof(Plots.is_style_supported), Plots.GRBackend, Symbol}) - precompile(Tuple{typeof(Plots.compute_gridsize), Int64, Int64, Int64}) - precompile(Tuple{typeof(Plots.gr_set_fill), ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) - precompile(Tuple{typeof(Plots._subplot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) - precompile(Tuple{typeof(Plots.compute_xyz), Array{String, 1}, Array{Float64, 1}, Nothing}) - precompile(Tuple{typeof(Plots.is3d), Symbol}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Symbol, Int64, Bool}) - precompile(Tuple{typeof(Plots._update_axis_links), Plots.Plot{Plots.GRBackend}, Plots.Axis, Symbol}) - precompile(Tuple{typeof(Plots._update_series_attributes!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.xlims), Int64}) - precompile(Tuple{typeof(Plots._preprocess_binlike), Base.Dict{Symbol, Any}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Array{String, 1}, Int64}) - precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Symbol}) - precompile(Tuple{typeof(Plots.supported_styles)}) - precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Function, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._cycle), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int64}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Array{Int64, 1}, Int64}) - precompile(Tuple{typeof(Plots._add_errorbar_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Nothing}) - precompile(Tuple{typeof(Plots.arrow), Int64}) - precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{String, 1}}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) - precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Int64}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.filter_data!), Base.Dict{Symbol, Any}, Array{Int64, 1}}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.add_layout_pct!), Base.Dict{Symbol, Any}, Expr, Int64, Int64}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Array{Any, 1}, Int64, Bool}) - precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{String, 1}}, Int64}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Any}, Int64, Bool}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, String, Int64, Bool}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Int64, 1}}) - precompile(Tuple{typeof(Plots.iter_segments), Array{Float64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.gr_set_yticks_font), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.gr_viewport_from_bbox), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.like_surface), Symbol}) - precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64}) - precompile(Tuple{typeof(Plots._prepare_subplot), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.convertLegendValue), Bool}) - precompile(Tuple{typeof(Plots.get_series_color), Symbol, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Measures.Length{:mm, Float64}, Int64, Bool}) - precompile(Tuple{typeof(Plots.get_series_color), PlotUtils.ColorGradient, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Bool, Int64, Bool}) - precompile(Tuple{typeof(Plots.link_axes!), Plots.GridLayout, Symbol}) - precompile(Tuple{typeof(Plots.process_ribbon), Int64, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Tuple{Int64, Int64}, Int64, Bool}) - precompile(Tuple{typeof(Plots._update_axis_colors), Plots.Axis}) - precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Nothing, Int64, Bool}) - precompile(Tuple{typeof(Plots.gr_text), Float64, Float64, String}) - precompile(Tuple{typeof(Plots.update_inset_bboxes!), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.backend)}) - precompile(Tuple{typeof(Plots.get_series_color), ColorTypes.RGBA{Float64}, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) - precompile(Tuple{typeof(Plots._add_the_series), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._pick_default_backend)}) - precompile(Tuple{typeof(Plots.trueOrAllTrue), typeof(identity), Array{Symbol, 2}}) - precompile(Tuple{typeof(Plots.nanappend!), Array{Float64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}}) - precompile(Tuple{typeof(Plots.get_linealpha), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots.get_xy), Plots.OHLC{Float64}, Int64, Float64}) - precompile(Tuple{typeof(Plots.tickfont), Plots.Axis}) - precompile(Tuple{typeof(Plots.legendfont), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.all3D), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.get_series_color), Symbol, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) - precompile(Tuple{typeof(Plots.fakedata), Int64, Int64}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._update_subplot_args), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Int64, Bool}) - precompile(Tuple{typeof(Plots.get_series_color), ColorTypes.RGBA{Float64}, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) - precompile(Tuple{typeof(Plots.get_series_color), PlotUtils.ColorGradient, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) - precompile(Tuple{typeof(Plots.convertLegendValue), Symbol}) - precompile(Tuple{typeof(Plots.gr_yaxis_width), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Bool}) - precompile(Tuple{typeof(Plots.link_axes!), Plots.Axis, Plots.Axis}) - precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}, Float64}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Bool, Symbol}) - precompile(Tuple{typeof(Plots.should_add_to_legend), Plots.Series}) - precompile(Tuple{typeof(Plots.gr_set_xticks_font), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.guidefont), Plots.Axis}) - precompile(Tuple{typeof(Plots.gr_set_textcolor), ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Float64, Symbol}) - isdefined(Plots, Symbol("#kw##scatter!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter!")), NamedTuple{(:zcolor, :m, :ms, :lab), Tuple{Array{Float64, 1}, Tuple{Symbol, Float64, Plots.Stroke}, Array{Float64, 1}, String}}, typeof(Plots.scatter!), Array{Float64, 1}}) - isdefined(Plots, Symbol("#kw##gr_set_font")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_set_font")), NamedTuple{(:halign, :valign, :rotation), Tuple{Symbol, Symbol, Int64}}, typeof(Plots.gr_set_font), Plots.Font}) - precompile(Tuple{typeof(Plots.backend), Symbol}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) - isdefined(Plots, Symbol("#kw##contour")) && precompile(Tuple{getfield(Plots, Symbol("#kw##contour")), NamedTuple{(:fill,), Tuple{Bool}}, typeof(Plots.contour), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) - precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Array{T, 1} where T, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.iter_segments), Base.UnitRange{Int64}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.allAlphas), Int64}) - precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Int64}) - precompile(Tuple{typeof(Plots.is_marker_supported), Plots.Shape}) - precompile(Tuple{typeof(Plots.series_annotations), Array{Any, 1}}) - precompile(Tuple{typeof(Plots.gr_set_fillcolor), ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots.colorbar_style), Plots.Series}) - precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol, Array{Float64, 1}, Symbol, Tuple{Int64, Int64}}) - isdefined(Plots, Symbol("#kw##hline!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##hline!")), NamedTuple{(:line,), Tuple{Tuple{Int64, Symbol, Float64, Array{Symbol, 2}}}}, typeof(Plots.hline!), Array{Float64, 2}}) - precompile(Tuple{typeof(Plots._display), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.font), String, Int}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.isijulia)}) - precompile(Tuple{typeof(Plots.gr_colorbar_colors), Plots.Series, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.iter_segments), Array{Float64, 1}, Array{Float64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.plotarea!), Plots.GridLayout, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Array{Symbol, 2}, Int64}) - precompile(Tuple{typeof(Plots._transform_ticks), Base.StepRange{Int64, Int64}}) - precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Float64}) - precompile(Tuple{typeof(Plots.compute_xyz), Nothing, Nothing, Nothing}) - precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64}) - precompile(Tuple{typeof(Plots.command_idx), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._plot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.yaxis!), String, Symbol}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.gr_set_xticks_font), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._hist_edges), Tuple{Array{Float64, 1}}, Symbol}) - precompile(Tuple{typeof(Plots.rowsize), Expr}) - isdefined(Plots, Symbol("#kw##pie")) && precompile(Tuple{getfield(Plots, Symbol("#kw##pie")), NamedTuple{(:title, :l), Tuple{String, Float64}}, typeof(Plots.pie), Array{String, 1}, Int}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.ohlc), Array{Plots.OHLC{T} where T<:Real, 1}}) - precompile(Tuple{typeof(Plots.get_fillalpha), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots._add_smooth_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._cycle), Int64, Base.StepRange{Int64, Int64}}) - precompile(Tuple{typeof(Plots.create_grid), Symbol}) - precompile(Tuple{typeof(Plots.gr_text_size), String, Int64}) - precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, typeof(identity)}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Array{Float64, 1}, 1}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.gr_text_size), String, Int64}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Array{Symbol, 2}, Symbol}) - precompile(Tuple{typeof(Plots.compute_xyz), Nothing, Array{Union{Base.Missing, Float64}, 1}, Nothing}) - precompile(Tuple{typeof(Plots.gr_contour_levels), Plots.Series, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.slice_arg), Tuple{Int64, Int64}, Int64}) - precompile(Tuple{typeof(Plots.straightline_data), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.UnitRange{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, typeof(identity), Nothing}) - precompile(Tuple{typeof(Plots.compute_xyz), Array{String, 1}, Array{String, 1}, Plots.Surface{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.layout_args), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Int64, 1}, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Nothing}) - precompile(Tuple{typeof(Plots.layout_args), Tuple{Int64, Int64}}) - precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Bool}) - precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, Array{Float64, 1}, Nothing}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.stroke), Int64, Int}) - precompile(Tuple{typeof(Plots.slice_arg), Array{Symbol, 2}, Int64}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Float64}) - isdefined(Plots, Symbol("#kw##heatmap")) && precompile(Tuple{getfield(Plots, Symbol("#kw##heatmap")), NamedTuple{(:aspect_ratio,), Tuple{Int64}}, typeof(Plots.heatmap), Array{String, 1}, Int}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, String, Int64}) - precompile(Tuple{typeof(Plots.is3d), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}}) - precompile(Tuple{typeof(Plots.wraptuple), Nothing}) - precompile(Tuple{typeof(Plots.gr_set_viewport_polar)}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.wrap_surfaces), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._update_axis_links), Plots.Plot{Plots.GRBackend}, Plots.Axis, Symbol}) - precompile(Tuple{typeof(Plots._show), Base.IOStream, Base.Multimedia.MIME{Symbol("image/png")}, Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.is_marker_supported), Plots.Stroke}) - precompile(Tuple{typeof(Plots.inline), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.UnitRange{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) - precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.get_xy), Array{Plots.OHLC{T} where T<:Real, 1}, Base.UnitRange{Int64}}) - precompile(Tuple{typeof(Plots._update_clims), Float64, Float64, Float64, Float64}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) - precompile(Tuple{typeof(Plots._update_subplot_colors), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots._override_seriestype_check), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Nothing}) - precompile(Tuple{typeof(Plots.process_ribbon), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.gr_update_colorbar!), Plots.GRColorbar, Plots.Series}) - precompile(Tuple{typeof(Plots.is_attr_supported), Plots.GRBackend, Symbol}) - precompile(Tuple{typeof(Plots.autopick), Array{ColorTypes.RGBA{Float64}, 1}, Int64}) - precompile(Tuple{typeof(Plots.ensure_gradient!), Base.Dict{Symbol, Any}, Symbol, Symbol}) - precompile(Tuple{typeof(Plots._expand_subplot_extrema), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.Spy}}) - precompile(Tuple{typeof(Plots._cycle), Array{Plots.Subplot{T} where T<:RecipesBase.AbstractBackend, 1}, Int64}) - isdefined(Plots, Symbol("#kw##scatter")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter")), NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks), Tuple{Array{Symbol, 2}, Array{String, 2}, Base.ReshapedArray{Int64, 2, Base.UnitRange{Int64}, Tuple{}}, Int64, String, Int64, Base.UnitRange{Int64}}}, typeof(Plots.scatter), Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}) - precompile(Tuple{typeof(Plots._update_axis), Plots.Axis, Base.Dict{Symbol, Any}, Symbol, Int64}) - precompile(Tuple{typeof(Plots.frame), Plots.Animation, Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.get_markeralpha), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots._binbarlike_baseline), Float64, Symbol}) - precompile(Tuple{typeof(Plots._cycle), Array{Any, 1}, Int64}) - precompile(Tuple{typeof(Plots._add_the_series), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}, Plots.Series}) - precompile(Tuple{typeof(Plots._transform_ticks), Base.UnitRange{Int64}}) - precompile(Tuple{typeof(Plots.create_grid_vcat), Expr}) - precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Bool}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Float64, Float64, Tuple{Float64, Float64}, Int64}) - precompile(Tuple{typeof(Plots.ylims), Int64}) - precompile(Tuple{typeof(Plots.fg_color), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.slice_arg), Base.StepRange{Int64, Int64}, Int64}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots._hist_edges), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Int64}) - precompile(Tuple{typeof(Plots.extractGroupArgs), Array{String, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.get_linestyle), Plots.Series}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) - isdefined(Plots, Symbol("#kw##gr_polyline")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_polyline")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Int64}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Plots.Plot{Plots.GRBackend}, Int64}) - precompile(Tuple{typeof(Plots.get_linealpha), Plots.Series}) - precompile(Tuple{typeof(Plots.slice_arg), Tuple{Int64, Float64}, Int64}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}}) - precompile(Tuple{typeof(Plots.gr_set_gradient), Plots.Series}) - precompile(Tuple{typeof(Plots.get_markerstrokealpha), Plots.Series, Int64}) - precompile(Tuple{typeof(Plots._hist_edge), Tuple{Array{Float64, 1}}, Int64, Symbol}) - precompile(Tuple{typeof(Plots._display), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.allStyles), Int64}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:lims,), Tuple{Tuple{Int64, Float64}}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.get_series_color), Int64, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}}) - precompile(Tuple{typeof(Plots.addExtension), String, String}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.color_or_nothing!), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.xlims), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}}) - precompile(Tuple{typeof(Plots.guidefont), Plots.Axis}) - precompile(Tuple{typeof(Plots.bottom), Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) - precompile(Tuple{typeof(Plots.is_2tuple), Int64}) - precompile(Tuple{typeof(Plots.unzip), Array{Tuple{Float64, Float64, Float64}, 1}}) - precompile(Tuple{typeof(Plots.prepare_output), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.png), Plots.Plot{Plots.GRBackend}, String}) - isdefined(Plots, Symbol("#kw##gr_set_font")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_set_font")), NamedTuple{(:halign, :valign, :rotation), Tuple{Symbol, Symbol, Int64}}, typeof(Plots.gr_set_font), Plots.Font}) - precompile(Tuple{typeof(Plots.compute_xyz), Nothing, Array{Float64, 1}, Nothing}) - precompile(Tuple{typeof(Plots.slice_arg), Array{Measures.Length{:mm, Float64}, 2}, Int64}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._update_axis_colors), Plots.Axis}) - precompile(Tuple{typeof(Plots.iter_segments), Array{Int64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.ispolar), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, ColorTypes.RGBA{Float64}, Symbol}) - precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Float64}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}}) - precompile(Tuple{typeof(Plots.wraptuple), Float64}) - precompile(Tuple{typeof(Plots.process_fillrange), Nothing, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._replace_markershape), Array{Symbol, 2}}) - precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, Array{Float64, 1}, Plots.Surface{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.replaceAliases!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Symbol}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}}) - precompile(Tuple{typeof(Plots.vline!), Array{Int64, 1}}) - precompile(Tuple{typeof(Plots.get_linewidth), Plots.Series}) - precompile(Tuple{typeof(Plots.series_annotations), Nothing}) - precompile(Tuple{typeof(Plots.ignorenan_maximum), Base.UnitRange{Int64}}) - precompile(Tuple{typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}, typeof(identity)}) - precompile(Tuple{typeof(Plots.is_seriestype_supported), Symbol}) - precompile(Tuple{typeof(Plots.ignorenan_minimum), Base.UnitRange{Int64}}) - precompile(Tuple{typeof(Plots.slice_arg), Array{ColorTypes.RGBA{Float64}, 2}, Int64}) - precompile(Tuple{typeof(Plots.gr_set_font), Plots.Font}) - precompile(Tuple{typeof(Plots.convert_sci_unicode), String}) - precompile(Tuple{typeof(Plots.get_linewidth), Plots.Series, Int64}) - isdefined(Plots, Symbol("#kw##scatter!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter!")), NamedTuple{(:markersize, :c), Tuple{Int64, Symbol}}, typeof(Plots.scatter!), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.process_ribbon), typeof(identity), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.is_2tuple), Tuple{Int64, Int64}}) - precompile(Tuple{typeof(Plots.slice_arg), Int64, Int64}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Plots.GridLayout, Int64}) - precompile(Tuple{typeof(Plots.is_2tuple), Tuple{Int64, Float64}}) - precompile(Tuple{typeof(Plots.slice_arg), Symbol, Int64}) - precompile(Tuple{typeof(Plots._cycle), Float64, Int64}) - precompile(Tuple{typeof(Plots.attr), Plots.EmptyLayout, Symbol}) - precompile(Tuple{typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots._prepare_subplot), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.process_ribbon), Nothing, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._update_plot_args), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.bbox!), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) - precompile(Tuple{typeof(Plots.create_grid), Expr}) - isdefined(Plots, Symbol("#kw##histogram2d")) && precompile(Tuple{getfield(Plots, Symbol("#kw##histogram2d")), NamedTuple{(:nbins,), Tuple{Int64}}, typeof(Plots.histogram2d), Array{Float64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.right), Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) - precompile(Tuple{typeof(Plots.slice_arg), String, Int64}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Symbol, Int64, Symbol, Float64}}) - precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.legendfont), Plots.Subplot{Plots.GRBackend}}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:grid, :ticks), Tuple{Bool, Nothing}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Plots.Spy}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.aliasesAndAutopick), Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Symbol}, Array{Symbol, 1}, Int64}) - precompile(Tuple{typeof(Plots.slice_arg), Bool, Int64}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.titlefont), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.link_axes!), Plots.GridLayout, Symbol}) - precompile(Tuple{typeof(Plots.slice_arg), Float64, Int64}) - precompile(Tuple{typeof(Plots._update_axis), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol, Int64}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:scale, :guide), Tuple{Symbol, String}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}}) - isdefined(Plots, Symbol("#kw##scatter!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter!")), NamedTuple{(:marker, :series_annotations), Tuple{Tuple{Int64, Float64, Symbol}, Array{Any, 1}}}, typeof(Plots.scatter!), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) - precompile(Tuple{typeof(Plots._preprocess_barlike), Base.Dict{Symbol, Any}, Base.UnitRange{Int64}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, Array{Float64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.gr_lims), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Bool, Nothing}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Array{Symbol, 2}, Int64, Float64, Plots.Stroke}}) - precompile(Tuple{typeof(Plots.process_annotation), Plots.Subplot{Plots.GRBackend}, Int64, Float64, Plots.PlotText}) - isdefined(Plots, Symbol("#kw##portfoliocomposition")) && precompile(Tuple{getfield(Plots, Symbol("#kw##portfoliocomposition")), NamedTuple{(:labels,), Tuple{Array{String, 2}}}, typeof(Plots.portfoliocomposition), Array{Float64, 2}, Int}) - precompile(Tuple{typeof(Plots.plotarea!), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) - precompile(Tuple{typeof(Plots.autopick_ignore_none_auto), Array{Symbol, 1}, Int64}) - isdefined(Plots, Symbol("#kw##scatter")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter")), NamedTuple{(:m, :lab, :bg, :xlim, :ylim), Tuple{Tuple{Int64, Symbol}, Array{String, 2}, Symbol, Tuple{Int64, Int64}, Tuple{Int64, Int64}}}, typeof(Plots.scatter), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) - precompile(Tuple{typeof(Plots.get_axis), Plots.Subplot{Plots.GRBackend}, Symbol}) - precompile(Tuple{typeof(Plots.ylims), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.labelfunc), Symbol, Plots.GRBackend}) - precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Plots.Shape, Symbol}) - precompile(Tuple{typeof(Plots.attr), Plots.EmptyLayout, Symbol, Symbol}) - precompile(Tuple{typeof(Plots.bbox!), Plots.GridLayout, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) - precompile(Tuple{typeof(Plots.series_annotations_shapes!), Plots.Series, Symbol}) - precompile(Tuple{typeof(Plots.widen), Float64, Float64, Symbol}) - precompile(Tuple{typeof(Plots.link_axes!), Array{RecipesBase.AbstractLayout, 1}, Symbol}) - precompile(Tuple{typeof(Plots.filter_data), Nothing, Array{Int64, 1}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.annotate!), Array{Tuple{Int64, Float64, Plots.PlotText}, 1}}) - precompile(Tuple{typeof(Plots._prepare_annotations), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Array{String, 1}}) - precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Int64, 1}, Tuple{Float64, Float64}, Int64}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Int64}}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:foreground_color_grid, :grid, :gridalpha, :gridstyle, :gridlinewidth), Tuple{ColorTypes.RGBA{Float64}, Bool, Float64, Symbol, Int64}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots._update_subplot_colors), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.nobigs), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.slice_arg), Base.UnitRange{Int64}, Int64}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, ColorTypes.RGB{Float64}, Int64}) - precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol, Bool}) - precompile(Tuple{typeof(Plots.locate_annotation), Plots.Subplot{Plots.GRBackend}, Int64, Float64, Plots.PlotText}) - precompile(Tuple{typeof(Plots.tovec), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Float64, Symbol}}) - precompile(Tuple{typeof(Plots._cycle), ColorTypes.RGBA{Float64}, Int64}) - precompile(Tuple{typeof(Plots.is_seriestype_supported), Symbol}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Symbol, Float64, Array{Symbol, 2}}}) - precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Tuple{Float64, Float64}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Float64, Array{Symbol, 2}, Int64}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Symbol, Symbol, Int64, Float64}}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:lims,), Tuple{Tuple{Int64, Int64}}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, typeof(identity), Nothing}) - precompile(Tuple{typeof(Plots._filter_input_data!), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Union{Base.Missing, Number}, 1}}) - precompile(Tuple{typeof(Plots.supported_markers), Plots.GRBackend}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.iter_segments), Plots.Series}) - precompile(Tuple{typeof(Plots.wraptuple), Bool}) - precompile(Tuple{typeof(Plots.text), String, Int64, Symbol, Symbol}) - precompile(Tuple{typeof(Plots.rightpad), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Int32, 1}}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:lims,), Tuple{Tuple{Int64, Int64}}}, typeof(Plots.attr!), Plots.Axis}) isdefined(Plots, Symbol("#@layout")) && precompile(Tuple{getfield(Plots, Symbol("#@layout")), LineNumberNode, Module, Expr}) - precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}, Nothing}) - precompile(Tuple{typeof(Plots.get_linestyle), Plots.Series, Int64}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:lims, :flip, :ticks, :guide), Tuple{Tuple{Int64, Int64}, Bool, Base.StepRange{Int64, Int64}, String}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.leftpad), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.xgrid!), Plots.Plot{Plots.GRBackend}, Symbol, Int}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:guide,), Tuple{String}}, typeof(Plots.attr!), Plots.Axis}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:formatter,), Tuple{Symbol}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Int64, 1}}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:rotation,), Tuple{Int64}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.text), String, Symbol, Int64, Int}) - precompile(Tuple{typeof(Plots.supported_styles), Plots.GRBackend}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:flip,), Tuple{Bool}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Int64, 1}}) - precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{String, Tuple{Int64, Int64}, Base.StepRange{Int64, Int64}, Symbol}}) - precompile(Tuple{typeof(Plots.is_2tuple), Tuple{Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots.bottompad), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.slice_arg), Base.ReshapedArray{Int64, 2, Base.UnitRange{Int64}, Tuple{}}, Int64}) - precompile(Tuple{typeof(Plots.contour), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) - precompile(Tuple{typeof(Plots.ignorenan_extrema), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) - precompile(Tuple{typeof(Plots.font), String, Int}) - precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) - precompile(Tuple{typeof(Plots.prepare_output), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Base.UnitRange{Int64}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{String, Symbol}}) - precompile(Tuple{typeof(Plots.calc_num_subplots), Plots.EmptyLayout}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Symbol}}) - precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Float64, Symbol}) - precompile(Tuple{typeof(Plots.gr_set_line), Int64, Symbol, PlotUtils.ColorGradient}) - precompile(Tuple{typeof(Plots._scale_adjusted_values), Type{Float64}, Array{Float64, 1}, Symbol}) - precompile(Tuple{typeof(Plots._process_userrecipe), Plots.Plot{Plots.GRBackend}, Array{Base.Dict{Symbol, Any}, 1}, RecipesBase.RecipeData}) - precompile(Tuple{typeof(Plots.layout_args), Int64}) - precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.GRBackend}, Symbol}) - precompile(Tuple{typeof(Plots.toppad), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots._expand_subplot_extrema), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol}) - precompile(Tuple{typeof(Plots.trueOrAllTrue), typeof(Plots.is3d), Symbol}) - precompile(Tuple{typeof(Plots.gui), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Float64, Symbol, Plots.Stroke}}) - precompile(Tuple{typeof(Plots.ylims), Int64}) - precompile(Tuple{typeof(Plots._cycle), Plots.Shape, Int64}) - precompile(Tuple{typeof(Plots.rowsize), Symbol}) - precompile(Tuple{typeof(Plots.create_grid_vcat), Expr}) - precompile(Tuple{typeof(Plots.gr_update_colorbar!), Plots.GRColorbar, Plots.Series}) - precompile(Tuple{typeof(Plots.font), Symbol, Int}) - precompile(Tuple{typeof(Plots._transform_ticks), Nothing}) - precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Array{Int64, 1}}) - precompile(Tuple{typeof(Plots.get_fillalpha), Plots.Series}) - precompile(Tuple{typeof(Plots.wraptuple), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.fakedata), Int64, Int64}) - precompile(Tuple{typeof(Plots.wraptuple), Plots.SeriesAnnotations}) - precompile(Tuple{typeof(Plots.ignorenan_extrema), Plots.Axis}) - precompile(Tuple{typeof(Plots.slice_arg), Nothing, Int64}) - precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}, Plots.Series}) - precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Bool}) - precompile(Tuple{typeof(Plots.gr_set_gradient), Plots.Series}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Base.LinRange{Float64}}) - precompile(Tuple{typeof(Plots.font), Int64, Int}) - precompile(Tuple{typeof(Plots.hascolorbar), Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.gr_display), Plots.Plot{Plots.GRBackend}, String}) - precompile(Tuple{typeof(Plots.gr_set_font), Plots.Font}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Float64, Plots.Stroke}}) - precompile(Tuple{typeof(Plots.slice_arg), Array{String, 2}, Int64}) - precompile(Tuple{typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.wraptuple), Array{Any, 1}}) - precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout}) - precompile(Tuple{typeof(Plots._cycle), Nothing, Int64}) - precompile(Tuple{typeof(Plots._replace_markershape), Plots.Shape}) - precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Array{Symbol, 2}, Symbol}) - precompile(Tuple{typeof(Plots.transpose_z), Plots.Series, Array{Float64, 2}, Bool}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Array{Symbol, 2}}}) - precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Array{Symbol, 2}, Symbol}) - precompile(Tuple{typeof(Plots._cycle), Int64, Int64}) - precompile(Tuple{typeof(Plots.create_grid), Expr}) - precompile(Tuple{typeof(Plots.get_series_color), Symbol, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) - precompile(Tuple{typeof(Plots.is_2tuple), Symbol}) - precompile(Tuple{typeof(Plots._create_backend_figure), Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{}}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:grid,), Tuple{Bool}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots._cycle), Symbol, Int64}) - precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.Subplot{Plots.GRBackend}, Array{Measures.Length{:mm, Float64}, 1}}) - precompile(Tuple{typeof(Plots.text), String, Symbol}) - precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Array{Union{Base.Missing, Float64}, 1}}) - precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Tuple{Float64, Float64}, Int64}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:grid, :lims), Tuple{Bool, Tuple{Int64, Int64}}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.link_axes!), Plots.Subplot{Plots.GRBackend}, Symbol}) - precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Bool}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Int64, Int64}) - precompile(Tuple{typeof(Plots.series_annotations), Plots.SeriesAnnotations}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Symbol, Symbol}}) - precompile(Tuple{typeof(Plots.get_subplot), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Plots.Shape, Int64, ColorTypes.RGBA{Float64}}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Float64, Symbol}}) - precompile(Tuple{typeof(Plots.make_steps), Nothing, Symbol}) - precompile(Tuple{typeof(Plots.annotations), Array{Any, 1}}) - precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Tuple{Int64, Int64}}) - precompile(Tuple{typeof(Plots.bar), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Array{Symbol, 2}, Int64}}) - precompile(Tuple{typeof(Plots._transform_ticks), Symbol}) - precompile(Tuple{typeof(Plots.wraptuple), Tuple{Array{Float64, 1}, Array{Float64, 1}}}) - precompile(Tuple{typeof(Plots._show), Base.IOStream, Base.Multimedia.MIME{Symbol("image/png")}, Plots.Plot{Plots.GRBackend}}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Union{Base.Missing, Number}, 1}}) - precompile(Tuple{typeof(Plots.link_axes!), Array{RecipesBase.AbstractLayout, 1}, Symbol}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:grid, :lims, :flip), Tuple{Bool, Tuple{Int64, Int64}, Bool}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Float64, Int64}) - precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout}) - precompile(Tuple{typeof(Plots.process_ribbon), Tuple{Base.LinRange{Float64}, Base.LinRange{Float64}}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots._update_axis), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol, Int64}) - precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Float64, 2}, Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Tuple{Float64, Float64}, Int64}) - precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Symbol}) - precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.UnitRange{Int64}}) - precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Symbol, Int64}) - precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Int64, Int64, Symbol}) - precompile(Tuple{typeof(Plots.default), Symbol}) - precompile(Tuple{typeof(Plots.layout_args), Plots.GridLayout}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:ticks,), Tuple{Base.UnitRange{Int64}}}, typeof(Plots.attr!), Plots.Axis}) - precompile(Tuple{typeof(Plots.make_fillrange_from_ribbon), Base.Dict{Symbol, Any}}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Union{Base.Missing, Int64}, 1}}) - precompile(Tuple{typeof(Plots.hascolorbar), Plots.Subplot{Plots.GRBackend}}) - isdefined(Plots, Symbol("#kw##_make_hist")) && precompile(Tuple{getfield(Plots, Symbol("#kw##_make_hist")), NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Int64}) - precompile(Tuple{typeof(Plots.ignorenan_minimum), Array{Int64, 1}}) - isdefined(Plots, Symbol("#kw##gr_polyline")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_polyline")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Base.UnitRange{Int64}, Array{Float64, 1}}) - isdefined(Plots, Symbol("#kw##histogram")) && precompile(Tuple{getfield(Plots, Symbol("#kw##histogram")), NamedTuple{(:bins, :weights), Tuple{Symbol, Array{Int64, 1}}}, typeof(Plots.histogram), Array{Float64, 1}}) isdefined(Plots, Symbol("#kw##_make_hist")) && precompile(Tuple{getfield(Plots, Symbol("#kw##_make_hist")), NamedTuple{(:normed, :weights), Tuple{Bool, Array{Int64, 1}}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}}, Symbol}) - precompile(Tuple{typeof(Plots.ignorenan_extrema), Plots.Axis}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:grid,), Tuple{Bool}}, typeof(Plots.attr!), Plots.Axis}) - isdefined(Plots, Symbol("#kw##gr_polyline")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_polyline")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Array{Int64, 1}, Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._cycle), Base.UnitRange{Int64}, Array{Int64, 1}}) - isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:ticks,), Tuple{Nothing}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##_make_hist")) && precompile(Tuple{getfield(Plots, Symbol("#kw##_make_hist")), NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Int64}) isdefined(Plots, Symbol("#kw##_make_hist")) && precompile(Tuple{getfield(Plots, Symbol("#kw##_make_hist")), NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Tuple{Int64, Int64}}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Float64, 2}}) - precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Float64, 1}}) - precompile(Tuple{typeof(Plots._process_userrecipe), Plots.Plot{Plots.GRBackend}, Array{Base.Dict{Symbol, Any}, 1}, RecipesBase.RecipeData}) - precompile(Tuple{typeof(Plots.build_layout), Base.Dict{Symbol, Any}}) - isdefined(Plots, Symbol("#kw##test_examples")) && precompile(Tuple{getfield(Plots, Symbol("#kw##test_examples")), NamedTuple{(:disp,), Tuple{Bool}}, typeof(Plots.test_examples), Symbol}) isdefined(Plots, Symbol("#kw##_make_hist")) && precompile(Tuple{getfield(Plots, Symbol("#kw##_make_hist")), NamedTuple{(:normed, :weights), Tuple{Bool, Nothing}}, typeof(Plots._make_hist), Tuple{Array{Float64, 1}}, Symbol}) - precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:flip,), Tuple{Bool}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:foreground_color_grid, :grid, :gridalpha, :gridstyle, :gridlinewidth), Tuple{ColorTypes.RGBA{Float64}, Bool, Float64, Symbol, Int64}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:formatter,), Tuple{Symbol}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:grid, :lims), Tuple{Bool, Tuple{Int64, Int64}}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:grid, :lims, :flip), Tuple{Bool, Tuple{Int64, Int64}, Bool}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:grid, :ticks), Tuple{Bool, Nothing}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:grid,), Tuple{Bool}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:grid,), Tuple{Bool}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:guide,), Tuple{String}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:lims, :flip, :ticks, :guide), Tuple{Tuple{Int64, Int64}, Bool, Base.StepRange{Int64, Int64}, String}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:lims,), Tuple{Tuple{Int64, Float64}}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:lims,), Tuple{Tuple{Int64, Int64}}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:lims,), Tuple{Tuple{Int64, Int64}}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:rotation,), Tuple{Int64}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:scale, :guide), Tuple{Symbol, String}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:ticks,), Tuple{Base.UnitRange{Int64}}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##attr!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##attr!")), NamedTuple{(:ticks,), Tuple{Nothing}}, typeof(Plots.attr!), Plots.Axis}) + isdefined(Plots, Symbol("#kw##contour")) && precompile(Tuple{getfield(Plots, Symbol("#kw##contour")), NamedTuple{(:fill,), Tuple{Bool}}, typeof(Plots.contour), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) + isdefined(Plots, Symbol("#kw##gr_polyline")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_polyline")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}}) + isdefined(Plots, Symbol("#kw##gr_polyline")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_polyline")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Array{Int64, 1}, Array{Float64, 1}}) + isdefined(Plots, Symbol("#kw##gr_polyline")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_polyline")), NamedTuple{(:arrowside, :arrowstyle), Tuple{Symbol, Symbol}}, typeof(Plots.gr_polyline), Base.UnitRange{Int64}, Array{Float64, 1}}) + isdefined(Plots, Symbol("#kw##gr_set_font")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_set_font")), NamedTuple{(:halign, :valign, :rotation), Tuple{Symbol, Symbol, Int64}}, typeof(Plots.gr_set_font), Plots.Font}) + isdefined(Plots, Symbol("#kw##gr_set_font")) && precompile(Tuple{getfield(Plots, Symbol("#kw##gr_set_font")), NamedTuple{(:halign, :valign, :rotation), Tuple{Symbol, Symbol, Int64}}, typeof(Plots.gr_set_font), Plots.Font}) + isdefined(Plots, Symbol("#kw##heatmap")) && precompile(Tuple{getfield(Plots, Symbol("#kw##heatmap")), NamedTuple{(:aspect_ratio,), Tuple{Int64}}, typeof(Plots.heatmap), Array{String, 1}, Int}) + isdefined(Plots, Symbol("#kw##histogram")) && precompile(Tuple{getfield(Plots, Symbol("#kw##histogram")), NamedTuple{(:bins, :weights), Tuple{Symbol, Array{Int64, 1}}}, typeof(Plots.histogram), Array{Float64, 1}}) + isdefined(Plots, Symbol("#kw##histogram2d")) && precompile(Tuple{getfield(Plots, Symbol("#kw##histogram2d")), NamedTuple{(:nbins, :show_empty_bins, :normed, :aspect_ratio), Tuple{Tuple{Int64, Int64}, Bool, Bool, Int64}}, typeof(Plots.histogram2d), Array{Base.Complex{Float64}, 1}}) + isdefined(Plots, Symbol("#kw##histogram2d")) && precompile(Tuple{getfield(Plots, Symbol("#kw##histogram2d")), NamedTuple{(:nbins,), Tuple{Int64}}, typeof(Plots.histogram2d), Array{Float64, 1}, Array{Float64, 1}}) + isdefined(Plots, Symbol("#kw##hline!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##hline!")), NamedTuple{(:line,), Tuple{Tuple{Int64, Symbol, Float64, Array{Symbol, 2}}}}, typeof(Plots.hline!), Array{Float64, 2}}) + isdefined(Plots, Symbol("#kw##pie")) && precompile(Tuple{getfield(Plots, Symbol("#kw##pie")), NamedTuple{(:title, :l), Tuple{String, Float64}}, typeof(Plots.pie), Array{String, 1}, Int}) + isdefined(Plots, Symbol("#kw##portfoliocomposition")) && precompile(Tuple{getfield(Plots, Symbol("#kw##portfoliocomposition")), NamedTuple{(:labels,), Tuple{Array{String, 2}}}, typeof(Plots.portfoliocomposition), Array{Float64, 2}, Int}) + isdefined(Plots, Symbol("#kw##scatter!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter!")), NamedTuple{(:marker, :series_annotations), Tuple{Tuple{Int64, Float64, Symbol}, Array{Any, 1}}}, typeof(Plots.scatter!), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) + isdefined(Plots, Symbol("#kw##scatter!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter!")), NamedTuple{(:markersize, :c), Tuple{Int64, Symbol}}, typeof(Plots.scatter!), Array{Float64, 1}}) + isdefined(Plots, Symbol("#kw##scatter!")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter!")), NamedTuple{(:zcolor, :m, :ms, :lab), Tuple{Array{Float64, 1}, Tuple{Symbol, Float64, Plots.Stroke}, Array{Float64, 1}, String}}, typeof(Plots.scatter!), Array{Float64, 1}}) + isdefined(Plots, Symbol("#kw##scatter")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter")), NamedTuple{(:framestyle, :title, :color, :layout, :label, :markerstrokewidth, :ticks), Tuple{Array{Symbol, 2}, Array{String, 2}, Base.ReshapedArray{Int64, 2, Base.UnitRange{Int64}, Tuple{}}, Int64, String, Int64, Base.UnitRange{Int64}}}, typeof(Plots.scatter), Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}) + isdefined(Plots, Symbol("#kw##scatter")) && precompile(Tuple{getfield(Plots, Symbol("#kw##scatter")), NamedTuple{(:m, :lab, :bg, :xlim, :ylim), Tuple{Tuple{Int64, Symbol}, Array{String, 2}, Symbol, Tuple{Int64, Int64}, Tuple{Int64, Int64}}}, typeof(Plots.scatter), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) + isdefined(Plots, Symbol("#kw##test_examples")) && precompile(Tuple{getfield(Plots, Symbol("#kw##test_examples")), NamedTuple{(:disp,), Tuple{Bool}}, typeof(Plots.test_examples), Symbol}) + precompile(Tuple{typeof(Plots.__init__)}) + precompile(Tuple{typeof(Plots._add_defaults!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Int64}) + precompile(Tuple{typeof(Plots._add_defaults!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Int64}) + precompile(Tuple{typeof(Plots._add_errorbar_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._add_errorbar_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._add_markershape), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._add_markershape), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._add_smooth_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._add_smooth_kw), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._add_the_series), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._add_the_series), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Array{Float64, 1}, 1}}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Array{T, 1} where T, 1}}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Function, 1}}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Function, 1}}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{String, 1}}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, Array{Union{Base.Missing, Int64}, 1}}) + precompile(Tuple{typeof(Plots._apply_type_recipe), Base.Dict{Symbol, Any}, typeof(identity)}) + precompile(Tuple{typeof(Plots._backend_instance), Symbol}) + precompile(Tuple{typeof(Plots._backend_instance), Symbol}) + precompile(Tuple{typeof(Plots._bin_centers), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._binbarlike_baseline), Float64, Symbol}) + precompile(Tuple{typeof(Plots._cbar_unique), Array{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, 1}, String}) + precompile(Tuple{typeof(Plots._cbar_unique), Array{Int64, 1}, String}) + precompile(Tuple{typeof(Plots._cbar_unique), Array{Nothing, 1}, String}) + precompile(Tuple{typeof(Plots._cbar_unique), Array{PlotUtils.ColorGradient, 1}, String}) + precompile(Tuple{typeof(Plots._cbar_unique), Array{Symbol, 1}, String}) + precompile(Tuple{typeof(Plots._create_backend_figure), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._cycle), Array{Any, 1}, Int64}) + precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Array{Int64, 1}}) precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Base.StepRange{Int64, Int64}}) - precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Tuple{Float64, Float64}, Int64}) - precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots._cycle), Array{Float64, 1}, Int64}) + precompile(Tuple{typeof(Plots._cycle), Array{Plots.Subplot{T} where T<:RecipesBase.AbstractBackend, 1}, Int64}) + precompile(Tuple{typeof(Plots._cycle), Array{String, 1}, Int64}) + precompile(Tuple{typeof(Plots._cycle), Base.OneTo{Int64}, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots._cycle), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int64}) + precompile(Tuple{typeof(Plots._cycle), Base.StepRange{Int64, Int64}, Int64}) + precompile(Tuple{typeof(Plots._cycle), ColorTypes.RGBA{Float64}, Int64}) + precompile(Tuple{typeof(Plots._cycle), Float64, Int64}) + precompile(Tuple{typeof(Plots._cycle), Int64, Base.StepRange{Int64, Int64}}) + precompile(Tuple{typeof(Plots._cycle), Int64, Int64}) + precompile(Tuple{typeof(Plots._cycle), Nothing, Int64}) + precompile(Tuple{typeof(Plots._cycle), Plots.Shape, Int64}) + precompile(Tuple{typeof(Plots._cycle), Symbol, Int64}) + precompile(Tuple{typeof(Plots._display), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._display), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Bool}) + precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Bool}) + precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots._do_plot_show), Plots.Plot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Array{T, 1} where T, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Base.Complex{Float64}, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Function, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Function, 1}, Int64}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Int64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Plots.OHLC{T} where T<:Real, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{String, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Array{Union{Base.Missing, Int64}, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Plots.PortfolioComposition}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, Plots.Spy}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy, typeof(Base.log), Int64}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.GroupBy}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{Plots.Spy}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots._expand_seriestype_array), Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots._expand_subplot_extrema), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots._expand_subplot_extrema), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots._filter_input_data!), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._heatmap_edges), Array{Float64, 1}, Bool}) + precompile(Tuple{typeof(Plots._hist_edge), Tuple{Array{Float64, 1}}, Int64, Symbol}) + precompile(Tuple{typeof(Plots._hist_edges), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Int64}) + precompile(Tuple{typeof(Plots._hist_edges), Tuple{Array{Float64, 1}, Array{Float64, 1}}, Tuple{Int64, Int64}}) + precompile(Tuple{typeof(Plots._hist_edges), Tuple{Array{Float64, 1}}, Symbol}) + precompile(Tuple{typeof(Plots._override_seriestype_check), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots._pick_default_backend)}) + precompile(Tuple{typeof(Plots._pick_default_backend)}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.Spy}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots._plot!), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots._plot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) + precompile(Tuple{typeof(Plots._plot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) + precompile(Tuple{typeof(Plots._plots_defaults)}) + precompile(Tuple{typeof(Plots._prepare_annotations), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._prepare_annotations), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._prepare_subplot), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._prepare_subplot), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._prepare_subplot), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{Plots.Spy}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_args), Base.Dict{Symbol, Any}, Tuple{}, Array{RecipesBase.RecipeData, 1}}) + precompile(Tuple{typeof(Plots._preprocess_barlike), Base.Dict{Symbol, Any}, Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._preprocess_barlike), Base.Dict{Symbol, Any}, Array{Int64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._preprocess_barlike), Base.Dict{Symbol, Any}, Base.OneTo{Int64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._preprocess_binlike), Base.Dict{Symbol, Any}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots._preprocess_userrecipe), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._preprocess_userrecipe), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._process_plotrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}, Array{Base.Dict{Symbol, Any}, 1}}) + precompile(Tuple{typeof(Plots._process_plotrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}, Array{Base.Dict{Symbol, Any}, 1}}) + precompile(Tuple{typeof(Plots._process_seriesrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._process_seriesrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._process_seriesrecipe), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._process_userrecipe), Plots.Plot{Plots.GRBackend}, Array{Base.Dict{Symbol, Any}, 1}, RecipesBase.RecipeData}) + precompile(Tuple{typeof(Plots._process_userrecipe), Plots.Plot{Plots.GRBackend}, Array{Base.Dict{Symbol, Any}, 1}, RecipesBase.RecipeData}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{Float64, 1}, 1}, Array{Array{Float64, 1}, 1}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Array{T, 1} where T, 1}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Base.Complex{Float64}, 1}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}, Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Function, 1}, Int64}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Int64, 1}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Plots.OHLC{T} where T<:Real, 1}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{String, 1}, Array{String, 1}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Array{Union{Base.Missing, Int64}, 1}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.StepRange{Int64, Int64}, Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Base.UnitRange{Int64}}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.PortfolioComposition}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{Plots.Spy}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{typeof(Base.log), Int64}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots._process_userrecipes), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Tuple{}}) + precompile(Tuple{typeof(Plots._replace_linewidth), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._replace_linewidth), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._replace_markershape), Array{Symbol, 2}}) + precompile(Tuple{typeof(Plots._replace_markershape), Plots.Shape}) + precompile(Tuple{typeof(Plots._scale_adjusted_values), Type{Float64}, Array{Float64, 1}, Symbol}) + precompile(Tuple{typeof(Plots._series_index), Base.Dict{Symbol, Any}, Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._show), Base.IOStream, Base.Multimedia.MIME{Symbol("image/png")}, Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._show), Base.IOStream, Base.Multimedia.MIME{Symbol("image/png")}, Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._subplot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) + precompile(Tuple{typeof(Plots._subplot_setup), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Array{Base.Dict{Symbol, Any}, 1}}) + precompile(Tuple{typeof(Plots._transform_ticks), Base.StepRange{Int64, Int64}}) + precompile(Tuple{typeof(Plots._transform_ticks), Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots._transform_ticks), Nothing}) + precompile(Tuple{typeof(Plots._transform_ticks), Symbol}) + precompile(Tuple{typeof(Plots._update_axis), Plots.Axis, Base.Dict{Symbol, Any}, Symbol, Int64}) + precompile(Tuple{typeof(Plots._update_axis), Plots.Axis, Base.Dict{Symbol, Any}, Symbol, Int64}) + precompile(Tuple{typeof(Plots._update_axis), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol, Int64}) + precompile(Tuple{typeof(Plots._update_axis), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Symbol, Int64}) + precompile(Tuple{typeof(Plots._update_axis_colors), Plots.Axis}) + precompile(Tuple{typeof(Plots._update_axis_colors), Plots.Axis}) + precompile(Tuple{typeof(Plots._update_axis_links), Plots.Plot{Plots.GRBackend}, Plots.Axis, Symbol}) + precompile(Tuple{typeof(Plots._update_axis_links), Plots.Plot{Plots.GRBackend}, Plots.Axis, Symbol}) + precompile(Tuple{typeof(Plots._update_clims), Float64, Float64, Float64, Float64}) + precompile(Tuple{typeof(Plots._update_clims), Float64, Float64, Int64, Int64}) + precompile(Tuple{typeof(Plots._update_min_padding!), Plots.GridLayout}) + precompile(Tuple{typeof(Plots._update_min_padding!), Plots.GridLayout}) + precompile(Tuple{typeof(Plots._update_min_padding!), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._update_min_padding!), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._update_plot_args), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._update_plot_args), Plots.Plot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots._update_series_attributes!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._update_series_attributes!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._update_series_attributes!), Base.Dict{Symbol, Any}, Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._update_subplot_args), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Int64, Bool}) + precompile(Tuple{typeof(Plots._update_subplot_args), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Int64, Bool}) + precompile(Tuple{typeof(Plots._update_subplot_args), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}, Int64, Bool}) + precompile(Tuple{typeof(Plots._update_subplot_colors), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._update_subplot_colors), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._update_subplot_colors), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots._update_subplot_periphery), Plots.Subplot{Plots.GRBackend}, Array{Any, 1}}) + precompile(Tuple{typeof(Plots._update_subplot_periphery), Plots.Subplot{Plots.GRBackend}, Array{Any, 1}}) + precompile(Tuple{typeof(Plots.addExtension), String, String}) + precompile(Tuple{typeof(Plots.add_layout_pct!), Base.Dict{Symbol, Any}, Expr, Int64, Int64}) + precompile(Tuple{typeof(Plots.add_layout_pct!), Base.Dict{Symbol, Any}, Expr, Int64, Int64}) + precompile(Tuple{typeof(Plots.aliasesAndAutopick), Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Symbol}, Array{Symbol, 1}, Int64}) + precompile(Tuple{typeof(Plots.aliasesAndAutopick), Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Symbol}, Array{Symbol, 1}, Int64}) + precompile(Tuple{typeof(Plots.all3D), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.allAlphas), Int64}) + precompile(Tuple{typeof(Plots.allStyles), Int64}) precompile(Tuple{typeof(Plots.allStyles), Symbol}) - precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol}) - precompile(Tuple{typeof(Plots.get_axis), Plots.Subplot{Plots.GRBackend}, Symbol}) - precompile(Tuple{typeof(Plots.backend)}) + precompile(Tuple{typeof(Plots.annotate!), Array{Tuple{Int64, Float64, Plots.PlotText}, 1}}) + precompile(Tuple{typeof(Plots.annotations), Array{Any, 1}}) + precompile(Tuple{typeof(Plots.arrow), Int64}) + precompile(Tuple{typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.attr!), Plots.Axis}) + precompile(Tuple{typeof(Plots.attr), Plots.EmptyLayout, Symbol, Symbol}) + precompile(Tuple{typeof(Plots.attr), Plots.EmptyLayout, Symbol}) + precompile(Tuple{typeof(Plots.autopick), Array{ColorTypes.RGBA{Float64}, 1}, Int64}) + precompile(Tuple{typeof(Plots.autopick_ignore_none_auto), Array{Symbol, 1}, Int64}) + precompile(Tuple{typeof(Plots.axis_drawing_info), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.axis_drawing_info), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.axis_drawing_info_3d), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.axis_drawing_info_3d), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.GRBackend}, Symbol, Bool, Bool}) + precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.GRBackend}, Symbol, Bool, Bool}) + precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots.axis_limits), Plots.Subplot{Plots.GRBackend}, Symbol}) precompile(Tuple{typeof(Plots.backend), Plots.GRBackend}) + precompile(Tuple{typeof(Plots.backend), Symbol}) + precompile(Tuple{typeof(Plots.backend), Symbol}) + precompile(Tuple{typeof(Plots.backend)}) + precompile(Tuple{typeof(Plots.backend)}) + precompile(Tuple{typeof(Plots.bar), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.bbox!), Plots.GridLayout, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + precompile(Tuple{typeof(Plots.bbox!), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + precompile(Tuple{typeof(Plots.bottom), Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + precompile(Tuple{typeof(Plots.bottompad), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.build_layout), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.build_layout), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64, Array{Plots.Plot{T} where T<:RecipesBase.AbstractBackend, 1}}) + precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64, Array{Plots.Plot{T} where T<:RecipesBase.AbstractBackend, 1}}) + precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64}) + precompile(Tuple{typeof(Plots.build_layout), Plots.GridLayout, Int64}) + precompile(Tuple{typeof(Plots.calc_num_subplots), Plots.EmptyLayout}) + precompile(Tuple{typeof(Plots.calc_num_subplots), Plots.GridLayout}) + precompile(Tuple{typeof(Plots.color_or_nothing!), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.color_or_nothing!), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.colorbar_style), Plots.Series}) + precompile(Tuple{typeof(Plots.colorbar_style), Plots.Series}) + precompile(Tuple{typeof(Plots.command_idx), Array{Base.Dict{Symbol, Any}, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.compute_gridsize), Int64, Int64, Int64}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, Array{Float64, 1}, Nothing}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, Array{Float64, 1}, Plots.Surface{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, typeof(identity), Nothing}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{Float64, 1}, typeof(identity), Nothing}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{String, 1}, Array{Float64, 1}, Nothing}) + precompile(Tuple{typeof(Plots.compute_xyz), Array{String, 1}, Array{String, 1}, Plots.Surface{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.compute_xyz), Nothing, Array{Float64, 1}, Nothing}) + precompile(Tuple{typeof(Plots.compute_xyz), Nothing, Array{Union{Base.Missing, Float64}, 1}, Nothing}) + precompile(Tuple{typeof(Plots.compute_xyz), Nothing, Nothing, Nothing}) + precompile(Tuple{typeof(Plots.contour), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Int}) + precompile(Tuple{typeof(Plots.contour_levels), Plots.Series, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.convertLegendValue), Bool}) + precompile(Tuple{typeof(Plots.convertLegendValue), Symbol}) + precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Array{Float64, 1}, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Array{T, 1} where T, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Float64, 2}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Function, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.convertToAnyVector), Array{Function, 1}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.convertToAnyVector), Int64, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.convert_sci_unicode), String}) + precompile(Tuple{typeof(Plots.convert_sci_unicode), String}) + precompile(Tuple{typeof(Plots.convert_to_polar), Array{Float64, 1}, Array{Float64, 1}, Tuple{Int64, Float64}}) + precompile(Tuple{typeof(Plots.create_grid), Expr}) + precompile(Tuple{typeof(Plots.create_grid), Expr}) + precompile(Tuple{typeof(Plots.create_grid), Symbol}) + precompile(Tuple{typeof(Plots.create_grid_curly), Expr}) + precompile(Tuple{typeof(Plots.create_grid_curly), Expr}) + precompile(Tuple{typeof(Plots.create_grid_vcat), Expr}) + precompile(Tuple{typeof(Plots.create_grid_vcat), Expr}) + precompile(Tuple{typeof(Plots.default), Symbol}) + precompile(Tuple{typeof(Plots.default_should_widen), Plots.Axis}) + precompile(Tuple{typeof(Plots.default_should_widen), Plots.Axis}) + precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Array{Any, 1}}) + precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Array{String, 1}}) + precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Array{Union{Base.Missing, Float64}, 1}}) + precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Base.Missing}) + precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, Char}) + precompile(Tuple{typeof(Plots.discrete_value!), Plots.Axis, String}) + precompile(Tuple{typeof(Plots.ensure_gradient!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots.ensure_gradient!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots.ensure_gradient!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.OneTo{Int64}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.OneTo{Int64}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Float64}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Float64}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Int64}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Int64}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Plots.Surface{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Plots.Surface{Array{Float64, 2}}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Axis, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.expand_extrema!), Plots.Subplot{Plots.GRBackend}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.extendSeriesData), Array{Float64, 1}, Float64}) + precompile(Tuple{typeof(Plots.extractGroupArgs), Array{String, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.fakedata), Int64, Int64}) + precompile(Tuple{typeof(Plots.fakedata), Int64, Int64}) + precompile(Tuple{typeof(Plots.fg_color), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.fg_color), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.filter_data!), Base.Dict{Symbol, Any}, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.filter_data), Array{Float64, 1}, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.filter_data), Base.OneTo{Int64}, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.filter_data), Nothing, Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.font), Int64, Int}) + precompile(Tuple{typeof(Plots.font), String, Int}) + precompile(Tuple{typeof(Plots.font), String, Int}) + precompile(Tuple{typeof(Plots.font), Symbol, Int}) + precompile(Tuple{typeof(Plots.frame), Plots.Animation, Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.frame), Plots.Animation}) + precompile(Tuple{typeof(Plots.get_axis), Plots.Subplot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots.get_axis), Plots.Subplot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots.get_clims), Plots.Series}) + precompile(Tuple{typeof(Plots.get_clims), Plots.Series}) + precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}, Plots.Series}) + precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}, Plots.Series}) + precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.get_clims), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.get_fillalpha), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.get_fillalpha), Plots.Series}) + precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Float64, Float64, Int64}) + precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.get_fillcolor), Plots.Series, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.get_linealpha), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.get_linealpha), Plots.Series}) + precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Float64, Float64, Int64}) + precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Float64, Float64, Int64}) + precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.get_linecolor), Plots.Series, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.get_linestyle), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.get_linestyle), Plots.Series}) + precompile(Tuple{typeof(Plots.get_linewidth), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.get_linewidth), Plots.Series}) + precompile(Tuple{typeof(Plots.get_markeralpha), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.get_markercolor), Plots.Series, Float64, Float64, Int64}) + precompile(Tuple{typeof(Plots.get_markercolor), Plots.Series, Float64, Float64, Int64}) + precompile(Tuple{typeof(Plots.get_markerstrokealpha), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.get_markerstrokecolor), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Float64, 1}, Array{Any, 1}}}) + precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Float64, 1}, Array{String, 1}}}) + precompile(Tuple{typeof(Plots.get_minor_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Tuple{Array{Float64, 1}, Array{String, 1}}}) + precompile(Tuple{typeof(Plots.get_series_color), ColorTypes.RGBA{Float64}, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.get_series_color), ColorTypes.RGBA{Float64}, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.get_series_color), ColorTypes.RGBA{Float64}, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.get_series_color), Int64, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.get_series_color), PlotUtils.ColorGradient, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.get_series_color), PlotUtils.ColorGradient, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.get_series_color), Symbol, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.get_series_color), Symbol, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.get_series_color), Symbol, Plots.Subplot{Plots.GRBackend}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.get_subplot), Plots.Plot{Plots.GRBackend}, Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.get_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis}) + precompile(Tuple{typeof(Plots.get_ticks), Plots.Subplot{Plots.GRBackend}, Plots.Axis}) + precompile(Tuple{typeof(Plots.get_xy), Array{Plots.OHLC{T} where T<:Real, 1}, Base.OneTo{Int64}}) + precompile(Tuple{typeof(Plots.get_xy), Plots.OHLC{Float64}, Int64, Float64}) + precompile(Tuple{typeof(Plots.getxy), Plots.Plot{Plots.GRBackend}, Int64}) + precompile(Tuple{typeof(Plots.gr_axis_height), Plots.Subplot{Plots.GRBackend}, Plots.Axis}) + precompile(Tuple{typeof(Plots.gr_axis_width), Plots.Subplot{Plots.GRBackend}, Plots.Axis}) + precompile(Tuple{typeof(Plots.gr_color), ColorTypes.RGBA{Float64}, Type{ColorTypes.RGB{Float64}}}) + precompile(Tuple{typeof(Plots.gr_colorbar_colors), Plots.Series, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.gr_contour_levels), Plots.Series, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.gr_display), Plots.Plot{Plots.GRBackend}, String}) + precompile(Tuple{typeof(Plots.gr_display), Plots.Plot{Plots.GRBackend}, String}) + precompile(Tuple{typeof(Plots.gr_display), Plots.Subplot{Plots.GRBackend}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.gr_display), Plots.Subplot{Plots.GRBackend}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.gr_draw_colorbar), Plots.GRColorbar, Plots.Subplot{Plots.GRBackend}, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Float64, Float64, Int64, Plots.Shape}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Float64, Float64, Int64, Symbol}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Float64, Plots.Shape}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Float64, Symbol}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Int64, Plots.Shape}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Float64, Int64, Symbol}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Int64, Int64, Plots.Shape}) + precompile(Tuple{typeof(Plots.gr_draw_marker), Int64, Int64, Int64, Symbol}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Float64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Float64, 1}, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Int64, 1}, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Array{Int64, 1}, Array{Int64, 1}, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.OneTo{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.OneTo{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Base.OneTo{Int64}, Array{Float64, 1}, Tuple{Float64, Float64}}) + precompile(Tuple{typeof(Plots.gr_draw_markers), Plots.Series, Float64, Float64, Tuple{Float64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.gr_fill_viewport), Array{Float64, 1}, ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.gr_get_color), Plots.Series}) + precompile(Tuple{typeof(Plots.gr_get_color), Plots.Series}) + precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{Any, 1}}, Int64}) + precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{String, 1}}, Int64}) + precompile(Tuple{typeof(Plots.gr_get_ticks_size), Tuple{Array{Float64, 1}, Array{String, 1}}, Int64}) + precompile(Tuple{typeof(Plots.gr_inqtext), Int64, Int64, String}) + precompile(Tuple{typeof(Plots.gr_inqtext), Int64, Int64, String}) + precompile(Tuple{typeof(Plots.gr_legend_pos), Plots.Subplot{Plots.GRBackend}, Float64, Float64}) + precompile(Tuple{typeof(Plots.gr_polaraxes), Int64, Float64, Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}, typeof(identity)}) + precompile(Tuple{typeof(Plots.gr_polyline), Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.gr_set_fill), ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.gr_set_fillcolor), ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.gr_set_font), Plots.Font}) + precompile(Tuple{typeof(Plots.gr_set_font), Plots.Font}) + precompile(Tuple{typeof(Plots.gr_set_gradient), PlotUtils.ColorGradient}) + precompile(Tuple{typeof(Plots.gr_set_gradient), Plots.Series}) + precompile(Tuple{typeof(Plots.gr_set_gradient), Plots.Series}) + precompile(Tuple{typeof(Plots.gr_set_line), Float64, Symbol, ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.gr_set_line), Int64, Symbol, ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.gr_set_line), Int64, Symbol, PlotUtils.ColorGradient}) + precompile(Tuple{typeof(Plots.gr_set_linecolor), PlotUtils.ColorGradient}) + precompile(Tuple{typeof(Plots.gr_set_markercolor), ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.gr_set_textcolor), ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}, Float64}) + precompile(Tuple{typeof(Plots.gr_set_transparency), ColorTypes.RGBA{Float64}, Nothing}) + precompile(Tuple{typeof(Plots.gr_set_viewport_cmap), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.gr_set_viewport_polar)}) + precompile(Tuple{typeof(Plots.gr_set_xticks_font), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.gr_set_xticks_font), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.gr_set_yticks_font), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.gr_set_yticks_font), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.gr_text), Float64, Float64, String}) + precompile(Tuple{typeof(Plots.gr_text), Float64, Float64, String}) + precompile(Tuple{typeof(Plots.gr_text_size), String, Int64}) + precompile(Tuple{typeof(Plots.gr_text_size), String, Int64}) + precompile(Tuple{typeof(Plots.gr_text_size), String}) + precompile(Tuple{typeof(Plots.gr_update_colorbar!), Plots.GRColorbar, Plots.Series}) + precompile(Tuple{typeof(Plots.gr_update_colorbar!), Plots.GRColorbar, Plots.Series}) + precompile(Tuple{typeof(Plots.gr_viewport_from_bbox), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.gr_viewport_from_bbox), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}, Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.gr_w3tondc), Float64, Float64, Float64}) + precompile(Tuple{typeof(Plots.gui), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.guidefont), Plots.Axis}) + precompile(Tuple{typeof(Plots.guidefont), Plots.Axis}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Array{Symbol, 2}, Symbol}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Array{Symbol, 2}, Symbol}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Array{Symbol, 2}, Symbol}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, ColorTypes.RGBA{Float64}, Symbol}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Plots.Shape, Symbol}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots.handleColors!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots.has_attribute_segments), Plots.Series}) + precompile(Tuple{typeof(Plots.has_attribute_segments), Plots.Series}) + precompile(Tuple{typeof(Plots.hascolorbar), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.hascolorbar), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.hasgrid), Symbol, Symbol}) + precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol, Array{Float64, 1}, Symbol, Tuple{Int64, Int64}}) + precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol, Bool}) + precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol, Bool}) + precompile(Tuple{typeof(Plots.heatmap_edges), Array{Float64, 1}, Symbol}) + precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Tuple{Int64, Int64}}) + precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Bool}) + precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Bool}) + precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol, Bool}) precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol}) + precompile(Tuple{typeof(Plots.heatmap_edges), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Symbol}) + precompile(Tuple{typeof(Plots.ignorenan_extrema), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.ignorenan_extrema), Array{Float64, 2}}) + precompile(Tuple{typeof(Plots.ignorenan_extrema), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) + precompile(Tuple{typeof(Plots.ignorenan_extrema), Base.StepRange{Int64, Int64}}) + precompile(Tuple{typeof(Plots.ignorenan_extrema), Plots.Axis}) + precompile(Tuple{typeof(Plots.ignorenan_extrema), Plots.Axis}) + precompile(Tuple{typeof(Plots.ignorenan_maximum), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.ignorenan_maximum), Base.OneTo{Int64}}) + precompile(Tuple{typeof(Plots.ignorenan_minimum), Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.ignorenan_minimum), Base.OneTo{Int64}}) + precompile(Tuple{typeof(Plots.inline), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.is3d), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.is3d), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.is3d), Symbol}) + precompile(Tuple{typeof(Plots.is_2tuple), Int64}) + precompile(Tuple{typeof(Plots.is_2tuple), Symbol}) + precompile(Tuple{typeof(Plots.is_2tuple), Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.is_2tuple), Tuple{Int64, Float64}}) + precompile(Tuple{typeof(Plots.is_2tuple), Tuple{Int64, Int64}}) + precompile(Tuple{typeof(Plots.is_attr_supported), Plots.GRBackend, Symbol}) + precompile(Tuple{typeof(Plots.is_attr_supported), Symbol}) + precompile(Tuple{typeof(Plots.is_marker_supported), Plots.GRBackend, Symbol}) + precompile(Tuple{typeof(Plots.is_marker_supported), Plots.Shape}) + precompile(Tuple{typeof(Plots.is_marker_supported), Plots.Stroke}) + precompile(Tuple{typeof(Plots.is_marker_supported), Symbol}) + precompile(Tuple{typeof(Plots.is_marker_supported), Symbol}) + precompile(Tuple{typeof(Plots.is_scale_supported), Plots.GRBackend, Symbol}) + precompile(Tuple{typeof(Plots.is_seriestype_supported), Plots.GRBackend, Symbol}) + precompile(Tuple{typeof(Plots.is_seriestype_supported), Symbol}) + precompile(Tuple{typeof(Plots.is_seriestype_supported), Symbol}) + precompile(Tuple{typeof(Plots.is_style_supported), Plots.GRBackend, Symbol}) + precompile(Tuple{typeof(Plots.is_uniformly_spaced), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.iscontour), Plots.Series}) + precompile(Tuple{typeof(Plots.iscontour), Plots.Series}) + precompile(Tuple{typeof(Plots.isijulia)}) + precompile(Tuple{typeof(Plots.ispolar), Plots.Series}) + precompile(Tuple{typeof(Plots.ispolar), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.isvertical), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.isvertical), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.iter_segments), Array{Float64, 1}, Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.iter_segments), Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.iter_segments), Array{Int64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.iter_segments), Base.OneTo{Int64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.iter_segments), Base.UnitRange{Int64}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.iter_segments), Plots.Series}) + precompile(Tuple{typeof(Plots.iter_segments), Plots.Series}) + precompile(Tuple{typeof(Plots.labelfunc), Symbol, Plots.GRBackend}) + precompile(Tuple{typeof(Plots.layout_args), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots.layout_args), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots.layout_args), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.layout_args), Int64, Int64}) + precompile(Tuple{typeof(Plots.layout_args), Int64, Plots.GridLayout}) + precompile(Tuple{typeof(Plots.layout_args), Int64, Tuple{Int64, Int64}}) + precompile(Tuple{typeof(Plots.layout_args), Int64}) + precompile(Tuple{typeof(Plots.layout_args), Plots.GridLayout}) + precompile(Tuple{typeof(Plots.leftpad), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.legendfont), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.legendfont), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.legendtitlefont), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.legendtitlefont), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.like_histogram), Symbol}) + precompile(Tuple{typeof(Plots.like_surface), Symbol}) + precompile(Tuple{typeof(Plots.link_axes!), Array{RecipesBase.AbstractLayout, 1}, Symbol}) + precompile(Tuple{typeof(Plots.link_axes!), Array{RecipesBase.AbstractLayout, 1}, Symbol}) + precompile(Tuple{typeof(Plots.link_axes!), Plots.Axis, Plots.Axis}) + precompile(Tuple{typeof(Plots.link_axes!), Plots.Axis, Plots.Axis}) + precompile(Tuple{typeof(Plots.link_axes!), Plots.GridLayout, Symbol}) + precompile(Tuple{typeof(Plots.link_axes!), Plots.GridLayout, Symbol}) + precompile(Tuple{typeof(Plots.link_axes!), Plots.Subplot{Plots.GRBackend}, Symbol}) + precompile(Tuple{typeof(Plots.link_subplots), Array{RecipesBase.AbstractLayout, 1}, Symbol}) + precompile(Tuple{typeof(Plots.locate_annotation), Plots.Subplot{Plots.GRBackend}, Int64, Float64, Plots.PlotText}) + precompile(Tuple{typeof(Plots.make_fillrange_from_ribbon), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.make_fillrange_side), Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.make_fillrange_side), Array{Float64, 1}, Int64}) + precompile(Tuple{typeof(Plots.make_steps), Array{Float64, 1}, Symbol}) + precompile(Tuple{typeof(Plots.make_steps), Array{Int64, 1}, Symbol}) + precompile(Tuple{typeof(Plots.make_steps), Base.OneTo{Int64}, Symbol}) + precompile(Tuple{typeof(Plots.make_steps), Nothing, Symbol}) + precompile(Tuple{typeof(Plots.nanappend!), Array{Float64, 1}, Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.nobigs), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.ohlc), Array{Plots.OHLC{T} where T<:Real, 1}}) + precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Base.StepRange{Int64, Int64}}) + precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Base.UnitRange{Int64}}) + precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Nothing}) + precompile(Tuple{typeof(Plots.optimal_ticks_and_labels), Plots.Subplot{Plots.GRBackend}, Plots.Axis, Nothing}) + precompile(Tuple{typeof(Plots.pie_labels), Plots.Subplot{Plots.GRBackend}, Plots.Series}) + precompile(Tuple{typeof(Plots.plotarea!), Plots.GridLayout, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + precompile(Tuple{typeof(Plots.plotarea!), Plots.Subplot{Plots.GRBackend}, Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + precompile(Tuple{typeof(Plots.png), Plots.Plot{Plots.GRBackend}, String}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Float64, 2}}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Int32, 1}}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Union{Base.Missing, Int64}, 1}}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Union{Base.Missing, Number}, 1}}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Array{Union{Base.Missing, Number}, 1}}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Base.LinRange{Float64}}) + precompile(Tuple{typeof(Plots.prepareSeriesData), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}}) + precompile(Tuple{typeof(Plots.prepare_output), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.prepare_output), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.preprocessArgs!), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.preprocessArgs!), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Bool}) + precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Float64}) + precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.processFillArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Bool, Symbol}) + precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Float64, Symbol}) + precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Int64, Symbol}) + precompile(Tuple{typeof(Plots.processGridArg!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Float64}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.processLineArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Array{Symbol, 2}}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Bool}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, ColorTypes.RGBA{Float64}}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Float64}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Float64}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Int64}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Plots.Shape}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Plots.Stroke}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.processMarkerArg), Base.Dict{Symbol, Any}, Symbol}) + precompile(Tuple{typeof(Plots.process_annotation), Plots.Subplot{Plots.GRBackend}, Int64, Float64, Plots.PlotText, Plots.Font}) + precompile(Tuple{typeof(Plots.process_annotation), Plots.Subplot{Plots.GRBackend}, Int64, Float64, Plots.PlotText}) + precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, Base.StepRange{Int64, Int64}, Symbol}) + precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, String, Symbol}) + precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, Symbol, Symbol}) + precompile(Tuple{typeof(Plots.process_axis_arg!), Base.Dict{Symbol, Any}, Tuple{Int64, Int64}, Symbol}) + precompile(Tuple{typeof(Plots.process_fillrange), Int64, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.process_fillrange), Nothing, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.process_ribbon), Base.StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.process_ribbon), Int64, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.process_ribbon), Nothing, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.process_ribbon), Tuple{Base.LinRange{Float64}, Base.LinRange{Float64}}, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.process_ribbon), typeof(identity), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.recompute_lengths), Array{Measures.Measure, 1}}) + precompile(Tuple{typeof(Plots.recompute_lengths), Array{Measures.Measure, 1}}) + precompile(Tuple{typeof(Plots.replaceAlias!), Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Symbol}}) + precompile(Tuple{typeof(Plots.replaceAliases!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Symbol}}) + precompile(Tuple{typeof(Plots.reset_extrema!), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.reset_extrema!), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.right), Measures.BoundingBox{Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}, Tuple{Measures.Length{:mm, Float64}, Measures.Length{:mm, Float64}}}}) + precompile(Tuple{typeof(Plots.rightpad), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.rowsize), Expr}) + precompile(Tuple{typeof(Plots.rowsize), Symbol}) + precompile(Tuple{typeof(Plots.series_annotations), Array{Any, 1}}) + precompile(Tuple{typeof(Plots.series_annotations), Nothing}) + precompile(Tuple{typeof(Plots.series_annotations), Plots.SeriesAnnotations}) + precompile(Tuple{typeof(Plots.series_annotations_shapes!), Plots.Series, Symbol}) + precompile(Tuple{typeof(Plots.series_annotations_shapes!), Plots.Series, Symbol}) + precompile(Tuple{typeof(Plots.setxy!), Plots.Plot{Plots.GRBackend}, Tuple{Array{Float64, 1}, Array{Float64, 1}}, Int64}) + precompile(Tuple{typeof(Plots.shape_data), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.shape_data), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.should_add_to_legend), Plots.Series}) + precompile(Tuple{typeof(Plots.should_add_to_legend), Plots.Series}) + precompile(Tuple{typeof(Plots.showaxis), Symbol, Symbol}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Array{Any, 1}, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Array{Any, 1}, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Any}, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Base.Dict{Symbol, Any}, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Bool, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Bool, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Float64, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Float64, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Int64, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Int64, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Measures.Length{:mm, Float64}, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Measures.Length{:mm, Float64}, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Nothing, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Nothing, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, String, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, String, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Symbol, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Symbol, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Tuple{Int64, Int64}, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg!), Base.Dict{Symbol, Any}, Base.Dict{Symbol, Any}, Symbol, Tuple{Int64, Int64}, Int64, Bool}) + precompile(Tuple{typeof(Plots.slice_arg), Array{ColorTypes.RGBA{Float64}, 2}, Int64}) + precompile(Tuple{typeof(Plots.slice_arg), Array{Measures.Length{:mm, Float64}, 2}, Int64}) + precompile(Tuple{typeof(Plots.slice_arg), Array{String, 2}, Int64}) + precompile(Tuple{typeof(Plots.slice_arg), Array{Symbol, 2}, Int64}) + precompile(Tuple{typeof(Plots.slice_arg), Base.ReshapedArray{Int64, 2, Base.UnitRange{Int64}, Tuple{}}, Int64}) + precompile(Tuple{typeof(Plots.slice_arg), Base.StepRange{Int64, Int64}, Int64}) + precompile(Tuple{typeof(Plots.slice_arg), Base.UnitRange{Int64}, Int64}) + precompile(Tuple{typeof(Plots.slice_arg), Bool, Int64}) + precompile(Tuple{typeof(Plots.slice_arg), ColorTypes.RGBA{Float64}, Int64}) + precompile(Tuple{typeof(Plots.slice_arg), Float64, Int64}) + precompile(Tuple{typeof(Plots.slice_arg), Int64, Int64}) + precompile(Tuple{typeof(Plots.slice_arg), Nothing, Int64}) + precompile(Tuple{typeof(Plots.slice_arg), String, Int64}) + precompile(Tuple{typeof(Plots.slice_arg), Symbol, Int64}) + precompile(Tuple{typeof(Plots.slice_arg), Tuple{Int64, Float64}, Int64}) + precompile(Tuple{typeof(Plots.slice_arg), Tuple{Int64, Int64}, Int64}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Array{Int64, 1}, Int64}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Array{String, 1}, Int64}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Array{Symbol, 2}, Int64}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, ColorTypes.RGB{Float64}, Int64}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Float64, Int64}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Int64, Int64}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Plots.GridLayout, Int64}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Plots.Plot{Plots.GRBackend}, Int64}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, String, Int64}) + precompile(Tuple{typeof(Plots.splittable_kw), Symbol, Symbol, Int64}) + precompile(Tuple{typeof(Plots.straightline_data), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.straightline_data), Plots.Series, Int64}) + precompile(Tuple{typeof(Plots.straightline_data), Tuple{Int64, Int64}, Tuple{Float64, Float64}, Array{Float64, 1}, Array{Float64, 1}, Int64}) + precompile(Tuple{typeof(Plots.stroke), Int64, Int}) + precompile(Tuple{typeof(Plots.supported_markers), Plots.GRBackend}) + precompile(Tuple{typeof(Plots.supported_markers)}) + precompile(Tuple{typeof(Plots.supported_styles), Plots.GRBackend}) + precompile(Tuple{typeof(Plots.supported_styles)}) + precompile(Tuple{typeof(Plots.text), String, Int64, Symbol, Symbol}) + precompile(Tuple{typeof(Plots.text), String, Symbol, Int64, Int}) + precompile(Tuple{typeof(Plots.text), String, Symbol}) + precompile(Tuple{typeof(Plots.tickfont), Plots.Axis}) + precompile(Tuple{typeof(Plots.tickfont), Plots.Axis}) + precompile(Tuple{typeof(Plots.title!), String}) + precompile(Tuple{typeof(Plots.titlefont), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.titlefont), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.toppad), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.tovec), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.transpose_z), Plots.Series, Array{Float64, 2}, Bool}) + precompile(Tuple{typeof(Plots.trueOrAllTrue), typeof(Plots.is3d), Symbol}) + precompile(Tuple{typeof(Plots.trueOrAllTrue), typeof(identity), Array{Symbol, 2}}) + precompile(Tuple{typeof(Plots.unzip), Array{Tuple{Float64, Float64, Float64}, 1}}) + precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout, Array{Measures.Length{:mm, Float64}, 1}}) + precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout, Array{Measures.Length{:mm, Float64}, 1}}) + precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout}) + precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.GridLayout}) + precompile(Tuple{typeof(Plots.update_child_bboxes!), Plots.Subplot{Plots.GRBackend}, Array{Measures.Length{:mm, Float64}, 1}}) + precompile(Tuple{typeof(Plots.update_inset_bboxes!), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.update_inset_bboxes!), Plots.Plot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.vline!), Array{Int64, 1}}) + precompile(Tuple{typeof(Plots.wand_edges), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.warnOnUnsupported), Plots.GRBackend, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.warnOnUnsupported), Plots.GRBackend, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.warnOnUnsupported_args), Plots.GRBackend, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.warnOnUnsupported_args), Plots.GRBackend, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.warnOnUnsupported_scales), Plots.GRBackend, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.warnOnUnsupported_scales), Plots.GRBackend, Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.widen), Float64, Float64, Symbol}) + precompile(Tuple{typeof(Plots.wrap_surfaces), Base.Dict{Symbol, Any}}) + precompile(Tuple{typeof(Plots.wraptuple), Array{Any, 1}}) + precompile(Tuple{typeof(Plots.wraptuple), Array{Float64, 1}}) + precompile(Tuple{typeof(Plots.wraptuple), Bool}) + precompile(Tuple{typeof(Plots.wraptuple), Float64}) + precompile(Tuple{typeof(Plots.wraptuple), Int64}) + precompile(Tuple{typeof(Plots.wraptuple), Nothing}) + precompile(Tuple{typeof(Plots.wraptuple), Plots.SeriesAnnotations}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Array{Float64, 1}, Array{Float64, 1}}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Array{Symbol, 2}, Int64, Float64, Plots.Stroke}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Array{Symbol, 2}, Int64}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Float64, Array{Symbol, 2}, Int64}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Float64, Symbol}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Array{Symbol, 2}}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Float64, Symbol, Plots.Stroke}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Float64, Symbol}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Symbol, Float64, Array{Symbol, 2}}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Symbol, Symbol}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Int64, Symbol}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Plots.Shape, Int64, ColorTypes.RGBA{Float64}}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{String, Symbol}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{String, Tuple{Int64, Int64}, Base.StepRange{Int64, Int64}, Symbol}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Float64, Plots.Stroke}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Int64}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Symbol, Int64, Symbol, Float64}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{Symbol, Symbol, Symbol, Int64, Float64}}) + precompile(Tuple{typeof(Plots.wraptuple), Tuple{}}) + precompile(Tuple{typeof(Plots.xgrid!), Plots.Plot{Plots.GRBackend}, Symbol, Int}) + precompile(Tuple{typeof(Plots.xlims), Int64}) + precompile(Tuple{typeof(Plots.xlims), Int64}) + precompile(Tuple{typeof(Plots.xlims), Plots.Subplot{Plots.GRBackend}}) + precompile(Tuple{typeof(Plots.yaxis!), String, Symbol}) + precompile(Tuple{typeof(Plots.ylims), Int64}) + precompile(Tuple{typeof(Plots.ylims), Int64}) + precompile(Tuple{typeof(Plots.ylims), Plots.Subplot{Plots.GRBackend}}) end From 61d4c84ef44a029c96412fc3f2551995bec7cb71 Mon Sep 17 00:00:00 2001 From: daschw Date: Fri, 13 Dec 2019 19:44:37 +0100 Subject: [PATCH 353/357] copy theme defaults --- src/themes.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/themes.jl b/src/themes.jl index aed8ecc0..1dc102d9 100644 --- a/src/themes.jl +++ b/src/themes.jl @@ -4,7 +4,7 @@ Specify the colour theme for plots. """ function theme(s::Symbol; kw...) - defaults = PlotThemes._themes[s].defaults + defaults = copy(PlotThemes._themes[s].defaults) _theme(s, defaults; kw...) end From 10ab3ae9745a2f629798ca93e6a5917ece29ef71 Mon Sep 17 00:00:00 2001 From: daschw Date: Fri, 13 Dec 2019 23:35:05 +0100 Subject: [PATCH 354/357] update showtheme --- src/themes.jl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/themes.jl b/src/themes.jl index 1dc102d9..4f47039b 100644 --- a/src/themes.jl +++ b/src/themes.jl @@ -120,7 +120,8 @@ _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func subplot := 4 seriestype := :heatmap seriescolor := colorgradient - ticks := -5:5:5 + xticks := (-2π:2π:2π, string.(-2:2:2, "π")) + yticks := (-2π:2π:2π, string.(-2:2:2, "π")) x, y, z end @@ -128,12 +129,14 @@ _get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func subplot := 5 seriestype := :surface seriescolor := colorgradient + xticks := (-2π:2π:2π, string.(-2:2:2, "π")) + yticks := (-2π:2π:2π, string.(-2:2:2, "π")) x, y, z end n = 100 ts = range(0, stop = 10π, length = n) - x = ts .* cos.(ts) + x = (0.1ts) .* cos.(ts) y = (0.1ts) .* sin.(ts) z = 1:n From 11322d0d8b8a3140308af558d5ec65260971174f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 17 Dec 2019 01:02:55 +0000 Subject: [PATCH 355/357] CompatHelper: bump compat for "FixedPointNumbers" to "0.7" --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index f9576daf..e99f05ee 100644 --- a/Project.toml +++ b/Project.toml @@ -33,7 +33,7 @@ UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" [compat] Contour = "0.5" FFMPEG = "0.2" -FixedPointNumbers = "0.6" +FixedPointNumbers = "0.6, 0.7" GR = "0.44" GeometryTypes = "0.7" JSON = "0.21" From 2022aebb07ce7822fc223cf118484fd66ba1ffaa Mon Sep 17 00:00:00 2001 From: Simon Christ Date: Tue, 17 Dec 2019 15:24:20 +0100 Subject: [PATCH 356/357] Update Project.toml --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index f9576daf..fb029bc5 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.3" +version = "0.28.4" [deps] Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" From 6ed18617d5d3fae86ad5cc6cb914edd9eb7de134 Mon Sep 17 00:00:00 2001 From: O01eg Date: Tue, 31 Dec 2019 13:43:41 +0300 Subject: [PATCH 357/357] Fix tests for PGXPlotsX backend The backend uses push! and append! methods introduced in 1.2.0 --- Project.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/Project.toml b/Project.toml index fb029bc5..695ee04e 100644 --- a/Project.toml +++ b/Project.toml @@ -39,6 +39,7 @@ GeometryTypes = "0.7" JSON = "0.21" Measures = "0.3" NaNMath = "0.3" +PGFPlotsX = "1.2.0" PlotThemes = "1" PlotUtils = "0.6.1" RecipesBase = "0.6, 0.7"