diff --git a/src/backends/pgfplotsx.jl b/src/backends/pgfplotsx.jl index a75b0408..35ea6ba1 100644 --- a/src/backends/pgfplotsx.jl +++ b/src/backends/pgfplotsx.jl @@ -75,7 +75,7 @@ function Base.push!(pgfx_plot::PGFPlotsXPlot, item) end function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) - if !pgfx_plot.is_created + if !pgfx_plot.is_created || pgfx_plot.was_shown the_plot = PGFPlotsX.TikzPicture(PGFPlotsX.Options()) bgc = plt.attr[:background_color_outside] == :match ? plt.attr[:background_color] : plt.attr[:background_color_outside] @@ -129,8 +129,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) ) => nothing, "fill" => cstr, "fill opacity" => a, - "text opacity" => - alpha(plot_color(sp[:legendfontcolor])), + "text opacity" => alpha(plot_color(sp[:legendfontcolor])), "font" => pgfx_font( sp[:legendfontsize], pgfx_thickness_scaling(sp), @@ -254,9 +253,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) end for (i, rng) in enumerate(segments) segment_opt = PGFPlotsX.Options() - if opt[:label] == "" - push!(segment_opt, "forget plot" => nothing) - end segment_opt = merge(segment_opt, pgfx_linestyle(opt, i)) if opt[:markershape] != :none marker = opt[:markershape] @@ -302,12 +298,11 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) rng, ) end - if i == 1 && sp[:legend] != :none && pgfx_should_add_to_legend(series) + if i == 1 && + sp[:legend] != :none && pgfx_should_add_to_legend(series) pgfx_filllegend!(series_opt, opt) end end - # series - # coordinates = pgfx_series_coordinates!(sp, series, segment_opt, opt, rng) segment_plot = @@ -339,15 +334,6 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) series_index, ) end - # add to legend? - if i == 1 && sp[:legend] != :none && pgfx_should_add_to_legend(series) - leg_opt = PGFPlotsX.Options() - if ribbon !== nothing - pgfx_filllegend!(axis.contents[end - 3].options, opt) - end - legend = PGFPlotsX.LegendEntry(leg_opt, opt[:label], false) - push!(axis, legend) - end # add series annotations anns = series[:series_annotations] for (xi, yi, str, fnt) in EachAnn(anns, series[:x], series[:y]) @@ -359,7 +345,31 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend}) pgfx_thickness_scaling(series), ) end - end + # add to legend? + if sp[:legend] != :none && pgfx_should_add_to_legend(series) + leg_entry = if opt[:label] isa AVec + get(opt[:label], i, "") + elseif opt[:label] isa AbstractString + if i == 1 + opt[:label] + else + "" + end + else + throw(ArgumentError("Malformed label. label = $(opt[:label])")) + end + if leg_entry == "" + push!(segment_plot.options, "forget plot" => nothing) + continue + end + leg_opt = PGFPlotsX.Options() + if ribbon !== nothing + pgfx_filllegend!(axis.contents[end - 3].options, opt) + end + legend = PGFPlotsX.LegendEntry(leg_opt, leg_entry, false) + push!(axis, legend) + end + end # for segments # add subplot annotations for ann in sp[:annotations] pgfx_add_annotation!( @@ -534,8 +544,7 @@ function pgfx_series_coordinates!( cs = join( [ - join(["($x, $y) [$(zs[j, i])]" for (j, x) in enumerate(xs)], " ") - for (i, y) in enumerate(ys) + join(["($x, $y) [$(zs[j, i])]" for (j, x) in enumerate(xs)], " ") for (i, y) in enumerate(ys) ], "\n\n", ) @@ -726,8 +735,8 @@ function pgfx_marker(plotattributes, i = 1) "fill" => cstr, "fill opacity" => a, "line width" => - pgfx_thickness_scaling(plotattributes) * - _cycle(plotattributes[:markerstrokewidth], i), + pgfx_thickness_scaling(plotattributes) * + _cycle(plotattributes[:markerstrokewidth], i), "rotate" => if shape == :dtriangle 180 elseif shape == :rtriangle @@ -882,8 +891,7 @@ function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) opt, string(letter, "label style") => PGFPlotsX.Options( labelpos => nothing, - "font" => - pgfx_font(axis[:guidefontsize], pgfx_thickness_scaling(sp)), + "font" => pgfx_font(axis[:guidefontsize], pgfx_thickness_scaling(sp)), "color" => cstr, "draw opacity" => α, "rotate" => axis[:guidefontrotation], @@ -969,7 +977,7 @@ function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) opt, string(letter, "ticklabel style") => PGFPlotsX.Options( "font" => - pgfx_font(axis[:tickfontsize], pgfx_thickness_scaling(sp)), + pgfx_font(axis[:tickfontsize], pgfx_thickness_scaling(sp)), "color" => cstr, "draw opacity" => α, "rotate" => axis[:tickfontrotation], @@ -988,8 +996,7 @@ function pgfx_axis!(opt::PGFPlotsX.Options, sp::Subplot, letter) # framestyle if framestyle in (:axes, :origin) - axispos = axis[:mirror] ? "right" : - framestyle == :axes ? "left" : "middle" + axispos = axis[:mirror] ? "right" : framestyle == :axes ? "left" : "middle" if axis[:draw_arrow] push!(opt, string("axis ", letter, " line") => axispos) @@ -1062,6 +1069,7 @@ for mime in ("application/pdf", "image/png", "image/svg+xml") mime::MIME{Symbol($mime)}, plt::Plot{PGFPlotsXBackend}, ) + plt.o.was_shown = true show(io, mime, plt.o.the_plot) end end @@ -1071,6 +1079,7 @@ function _show( mime::MIME{Symbol("application/x-tex")}, plt::Plot{PGFPlotsXBackend}, ) + plt.o.was_shown = true PGFPlotsX.print_tex( io, plt.o.the_plot, @@ -1079,5 +1088,6 @@ function _show( end function _display(plt::Plot{PGFPlotsXBackend}) + plt.o.was_shown = true display(PGFPlotsX.PGFPlotsXDisplay(), plt.o.the_plot) end