From 3907ae7f21b71574f6704ffa4ae304d81a78b2cb Mon Sep 17 00:00:00 2001 From: MA Laforge Date: Sat, 30 Jan 2021 13:36:16 -0500 Subject: [PATCH] Add support for custom tick labels Also: - Correctly register changes to "plot.layout" - Fix deprecated use of series[:marker[stroke][color/alpha]]. --- src/backends/inspectdr.jl | 78 +++++++++++++++++++++++++++++++++++---- 1 file changed, 71 insertions(+), 7 deletions(-) diff --git a/src/backends/inspectdr.jl b/src/backends/inspectdr.jl index e86fb995..005d3da2 100644 --- a/src/backends/inspectdr.jl +++ b/src/backends/inspectdr.jl @@ -79,6 +79,58 @@ end # --------------------------------------------------------------------------- +function _inspectdr_getaxisticks(ticks, gridlines, xfrm) + TickCustom = InspectDR.TickCustom + _xfrm(coord) = InspectDR.axis2aloc(Float64(coord), xfrm.spec) #Ensure Float64 - in case + + ttype = ticksType(ticks) + if ticks == :native + #keep current + elseif ttype == :ticks_and_labels + pos = ticks[1]; labels = ticks[2]; nticks = length(ticks[1]) + newticks = TickCustom[TickCustom(_xfrm(pos[i]), labels[i]) for i in 1:nticks] + gridlines = InspectDR.GridLinesCustom(gridlines) + gridlines.major = newticks + gridlines.minor = [] + gridlines.displayminor = false + elseif ttype == :ticks + nticks = length(ticks) + gridlines.major = Float64[_xfrm(t) for t in ticks] + gridlines.minor = [] + gridlines.displayminor = false + elseif isnothing(ticks) + gridlines.major = [] + gridlines.minor = [] + else #Assume ticks == :native + #keep current + end + + return gridlines #keep current +end + +function _inspectdr_setticks(sp::Subplot, plot, strip, xaxis, yaxis) + InputXfrm1D = InspectDR.InputXfrm1D + _get_ticks(axis) = :native == axis[:ticks] ? (:native) : get_ticks(sp, axis) + wantnative(ticks) = (:native == ticks) + + xticks = _get_ticks(xaxis) + yticks = _get_ticks(yaxis) + + if wantnative(xticks) && wantnative(yticks) + #Don't "eval" tick values + return + end + + #TODO: Allow InspectDR to independently "eval" x or y ticks + ext = InspectDR.getextents_aloc(plot, 1) + grid = InspectDR._eval(strip.grid, plot.xscale, strip.yscale, ext) + grid.xlines = _inspectdr_getaxisticks(xticks, grid.xlines, InputXfrm1D(plot.xscale)) + grid.ylines = _inspectdr_getaxisticks(yticks, grid.ylines, InputXfrm1D(strip.yscale)) + strip.grid = grid +end + +# --------------------------------------------------------------------------- + function _inspectdr_getscale(s::Symbol, yaxis::Bool) #TODO: Support :asinh, :sqrt kwargs = yaxis ? (:tgtmajor=>8, :tgtminor=>2) : () #More grid lines on y-axis @@ -167,6 +219,7 @@ function _series_added(plt::Plot{InspectDRBackend}, series::Series) st = series[:seriestype] sp = series[:subplot] plot = sp.o + clims = get_clims(sp, series) #Don't do anything without a "subplot" object: Will process later. if nothing == plot; return; end @@ -256,8 +309,8 @@ For st in :shape: wfrm.glyph = InspectDR.glyph( shape = _inspectdr_mapglyph(series[:markershape]), size = _inspectdr_mapglyphsize(series[:markersize]), - color = _inspectdr_mapcolor(plot_color(series[:markerstrokecolor], series[:markerstrokealpha])), - fillcolor = _inspectdr_mapcolor(plot_color(series[:markercolor], series[:markeralpha])), + color = _inspectdr_mapcolor(plot_color(get_markerstrokecolor(series), get_markerstrokealpha(series))), + fillcolor = _inspectdr_mapcolor(plot_color(get_markercolor(series, clims), get_markeralpha(series))), ) end @@ -288,8 +341,8 @@ function _inspectdr_setupsubplot(sp::Subplot{InspectDRBackend}) ygrid_show = yaxis[:grid] strip.grid = InspectDR.GridRect( - vmajor=xgrid_show, # vminor=xgrid_show, - hmajor=ygrid_show, # hminor=ygrid_show, + vmajor=xgrid_show, # vminor=xgrid_show, + hmajor=ygrid_show, # hminor=ygrid_show, ) plot.xscale = _inspectdr_getscale(xaxis[:scale], false) @@ -302,18 +355,27 @@ function _inspectdr_setupsubplot(sp::Subplot{InspectDRBackend}) xmin, xmax = -rmax, rmax ymin, ymax = -rmax, rmax end - plot.xext = InspectDR.PExtents1D() #reset - strip.yext = InspectDR.PExtents1D() #reset plot.xext_full = InspectDR.PExtents1D(xmin, xmax) strip.yext_full = InspectDR.PExtents1D(ymin, ymax) + #Set current extents = full extents (needed for _eval(strip.grid,...)) + plot.xext = plot.xext_full + strip.yext = strip.yext_full + _inspectdr_setticks(sp, plot, strip, xaxis, yaxis) + a = plot.annotation a.title = sp[:title] a.xlabel = xaxis[:guide]; a.ylabels = [yaxis[:guide]] l = plot.layout + #IMPORTANT: Don't forget to actually register changes + #(TODO: need to find a better way to set layout properties) l[:frame_canvas].fillcolor = _inspectdr_mapcolor(sp[:background_color_subplot]) + l[:frame_canvas] = l[:frame_canvas] #register changes l[:frame_data].fillcolor = _inspectdr_mapcolor(sp[:background_color_inside]) + l[:frame_data] = l[:frame_data] #register changes + l[:frame_data].line.color = _inspectdr_mapcolor(xaxis[:foreground_color_axis]) + l[:frame_data] = l[:frame_data] #register changes l[:font_title] = InspectDR.Font(sp[:titlefontfamily], _inspectdr_mapptsize(sp[:titlefontsize]), color = _inspectdr_mapcolor(sp[:titlefontcolor]) @@ -334,6 +396,7 @@ function _inspectdr_setupsubplot(sp::Subplot{InspectDRBackend}) color = _inspectdr_mapcolor(sp[:legendfontcolor]) ) l[:frame_legend].fillcolor = _inspectdr_mapcolor(sp[:background_color_legend]) + l[:frame_legend] = l[:frame_legend] #register changes end # called just before updating layout bounding boxes... in case you need to prep @@ -347,8 +410,9 @@ function _before_layout_calcs(plt::Plot{InspectDRBackend}) #Don't use window_title... probably not what you want. #mplot.title = plt[:window_title] end - mplot.layout[:frame].fillcolor = _inspectdr_mapcolor(plt[:background_color_outside]) + mplot.layout[:frame].fillcolor = _inspectdr_mapcolor(plt[:background_color_outside]) + mplot.layout[:frame] = mplot.layout[:frame] #register changes resize!(mplot.subplots, length(plt.subplots)) nsubplots = length(plt.subplots) for (i, sp) in enumerate(plt.subplots)