From 18188516ec7c02994b57ae7e7ffff03c56edd189 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Fri, 29 Sep 2017 11:48:17 +0200 Subject: [PATCH] implement showaxis attribute for gr --- src/arg_desc.jl | 3 ++- src/args.jl | 22 ++++++++++++++-- src/axes.jl | 63 +++++++++++++++++++++++++++------------------- src/backends/gr.jl | 52 ++++++++++++++++++++++---------------- 4 files changed, 89 insertions(+), 51 deletions(-) diff --git a/src/arg_desc.jl b/src/arg_desc.jl index 88bc8cf8..ce7cde8b 100644 --- a/src/arg_desc.jl +++ b/src/arg_desc.jl @@ -115,5 +115,6 @@ const _arg_desc = KW( :gridalpha => "Number in [0,1]. The alpha/opacity override for the grid lines.", :gridstyle => "Symbol. Style of the grid lines. Choose from $(_allStyles)", :gridlinewidth => "Number. Width of the grid lines (in pixels)", -:tick_direction => "Symbol. Direction of the ticks. `:in` or `:out`" +:tick_direction => "Symbol. Direction of the ticks. `:in` or `:out`", +:showaxis => "Bool, Symbol or String. Show the axis. `true`, `false`, `:show`, `:hide`, `:yes`, `:no`, `:x`, `:y`, `:z`, `:xy`, ..., `:all`, `:none`, `:off`" ) diff --git a/src/args.jl b/src/args.jl index 2ceeaa93..83379dfd 100644 --- a/src/args.jl +++ b/src/args.jl @@ -170,8 +170,8 @@ const _scaleAliases = Dict{Symbol,Symbol}( const _allGridSyms = [:x, :y, :z, :xy, :xz, :yx, :yz, :zx, :zy, :xyz, :xzy, :yxz, :yzx, :zxy, :zyx, - :all, :both, :on, - :none, :off,] + :all, :both, :on, :yes, + :none, :off, :no] const _allGridArgs = [_allGridSyms; string.(_allGridSyms); nothing] hasgrid(arg::Void, letter) = false hasgrid(arg::Bool, letter) = arg @@ -185,6 +185,24 @@ function hasgrid(arg::Symbol, letter) end hasgrid(arg::AbstractString, letter) = hasgrid(Symbol(arg), letter) +const _allShowaxisSyms = [:x, :y, :z, + :xy, :xz, :yx, :yz, :zx, :zy, + :xyz, :xzy, :yxz, :yzx, :zxy, :zyx, + :all, :both, :on, :yes, + :none, :off, :no] +const _allShowaxisArgs = [_allGridSyms; string.(_allGridSyms)] +showaxis(arg::Void, letter) = false +showaxis(arg::Bool, letter) = arg +function hasgrid(arg::Symbol, letter) + if arg in _allGridSyms + arg in (:all, :both, :on, :yes) || contains(string(arg), string(letter)) + else + warn("Unknown showaxis argument $arg; $(Symbol(letter, :showaxis)) was set to `true` instead.") + true + end +end +showaxis(arg::AbstractString, letter) = hasgrid(Symbol(arg), letter) + const _allFramestyles = [:box, :semi, :axes, :origin, :zerolines, :grid, :none] const _framestyleAliases = Dict{Symbol, Symbol}( :frame => :box, diff --git a/src/axes.jl b/src/axes.jl index f989a8fb..6d06a261 100644 --- a/src/axes.jl +++ b/src/axes.jl @@ -70,6 +70,9 @@ function process_axis_arg!(d::KW, arg, letter = "") elseif arg == nothing d[Symbol(letter,:ticks)] = [] + elseif arg in _allShowaxisArgs + d[Symbol(letter,:showaxis)] = showaxis(arg, letter) + elseif typeof(arg) <: Number d[Symbol(letter,:rotation)] = arg @@ -517,16 +520,18 @@ function axis_drawing_info(sp::Subplot) if !(sp[:framestyle] == :none) # xaxis - sp[:framestyle] in (:grid, :origin, :zerolines) || push!(xaxis_segs, (xmin,ymin), (xmax,ymin)) # bottom spine / xaxis - if sp[:framestyle] in (:origin, :zerolines) - push!(xaxis_segs, (xmin, 0.0), (xmax, 0.0)) - # don't show the 0 tick label for the origin framestyle - if sp[:framestyle] == :origin && length(xticks) > 1 - showticks = xticks[1] .!= 0 - xticks = (xticks[1][showticks], xticks[2][showticks]) + if xaxis[:showaxis] + sp[:framestyle] in (:grid, :origin, :zerolines) || push!(xaxis_segs, (xmin,ymin), (xmax,ymin)) # bottom spine / xaxis + if sp[:framestyle] in (:origin, :zerolines) + push!(xaxis_segs, (xmin, 0.0), (xmax, 0.0)) + # don't show the 0 tick label for the origin framestyle + if sp[:framestyle] == :origin && 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,ymax), (xmax,ymax)) # top spine end - sp[:framestyle] in (:semi, :box) && push!(xborder_segs, (xmin,ymax), (xmax,ymax)) # top spine if !(xaxis[:ticks] in (nothing, false)) f = scalefunc(yaxis[:scale]) invf = invscalefunc(yaxis[:scale]) @@ -536,28 +541,32 @@ function axis_drawing_info(sp::Subplot) t3 = invf(f(0) + 0.015 * (f(ymax) - f(ymin)) * ticks_in) for xtick in xticks[1] - tick_start, tick_stop = if sp[:framestyle] == :origin - (0, t3) - else - xaxis[:mirror] ? (ymax, t2) : (ymin, t1) + if xaxis[:showaxis] + tick_start, tick_stop = if sp[:framestyle] == :origin + (0, t3) + else + xaxis[:mirror] ? (ymax, t2) : (ymin, t1) + end + push!(xtick_segs, (xtick, tick_start), (xtick, tick_stop)) # bottom tick end - push!(xtick_segs, (xtick, tick_start), (xtick, tick_stop)) # bottom tick # sp[:draw_axes_border] && push!(xaxis_segs, (xtick, ymax), (xtick, t2)) # top tick xaxis[:grid] && push!(xgrid_segs, (xtick, t1), (xtick, t2)) # vertical grid end end # yaxis - sp[:framestyle] in (:grid, :origin, :zerolines) || push!(yaxis_segs, (xmin,ymin), (xmin,ymax)) # left spine / yaxis - if sp[:framestyle] in (:origin, :zerolines) - push!(yaxis_segs, (0.0, ymin), (0.0, ymax)) - # don't show the 0 tick label for the origin framestyle - if sp[:framestyle] == :origin && length(yticks) > 1 - showticks = yticks[1] .!= 0 - yticks = (yticks[1][showticks], yticks[2][showticks]) + if yaxis[:showaxis] + sp[:framestyle] in (:grid, :origin, :zerolines) || push!(yaxis_segs, (xmin,ymin), (xmin,ymax)) # left spine / yaxis + if sp[:framestyle] in (:origin, :zerolines) + push!(yaxis_segs, (0.0, ymin), (0.0, ymax)) + # don't show the 0 tick label for the origin framestyle + if sp[:framestyle] == :origin && length(yticks) > 1 + showticks = yticks[1] .!= 0 + yticks = (yticks[1][showticks], yticks[2][showticks]) + end end + sp[:framestyle] in (:semi, :box) && push!(yborder_segs, (xmax,ymin), (xmax,ymax)) # right spine end - sp[:framestyle] in (:semi, :box) && push!(yborder_segs, (xmax,ymin), (xmax,ymax)) # right spine if !(yaxis[:ticks] in (nothing, false)) f = scalefunc(xaxis[:scale]) invf = invscalefunc(xaxis[:scale]) @@ -567,12 +576,14 @@ function axis_drawing_info(sp::Subplot) t3 = invf(f(0) + 0.015 * (f(xmax) - f(xmin)) * ticks_in) for ytick in yticks[1] - tick_start, tick_stop = if sp[:framestyle] == :origin - (0, t3) - else - yaxis[:mirror] ? (xmax, t2) : (xmin, t1) + if yaxis[:showaxis] + tick_start, tick_stop = if sp[:framestyle] == :origin + (0, t3) + else + yaxis[:mirror] ? (xmax, t2) : (xmin, 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[:grid] && push!(ygrid_segs, (t1, ytick), (t2, ytick)) # horizontal grid end diff --git a/src/backends/gr.jl b/src/backends/gr.jl index fcd93547..3bad3a0f 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -793,35 +793,43 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) GR.settransparency(1.0) # axis lines - gr_set_line(1, :solid, xaxis[:foreground_color_axis]) - GR.setclip(0) - gr_polyline(coords(xspine_segs)...) - gr_set_line(1, :solid, yaxis[:foreground_color_axis]) - GR.setclip(0) - gr_polyline(coords(yspine_segs)...) + if xaxis[:showaxis] + gr_set_line(1, :solid, xaxis[:foreground_color_axis]) + GR.setclip(0) + gr_polyline(coords(xspine_segs)...) + end + if yaxis[:showaxis] + gr_set_line(1, :solid, yaxis[:foreground_color_axis]) + GR.setclip(0) + gr_polyline(coords(yspine_segs)...) + end GR.setclip(1) # axis ticks - if sp[:framestyle] in (:zerolines, :grid) - gr_set_line(1, :solid, xaxis[:foreground_color_grid]) - GR.settransparency(xaxis[:gridalpha]) - else - gr_set_line(1, :solid, xaxis[:foreground_color_axis]) + if xaxis[:showaxis] + if sp[:framestyle] in (:zerolines, :grid) + gr_set_line(1, :solid, xaxis[:foreground_color_grid]) + GR.settransparency(xaxis[:gridalpha]) + else + gr_set_line(1, :solid, xaxis[:foreground_color_axis]) + end + GR.setclip(0) + gr_polyline(coords(xtick_segs)...) end - GR.setclip(0) - gr_polyline(coords(xtick_segs)...) - if sp[:framestyle] in (:zerolines, :grid) - gr_set_line(1, :solid, yaxis[:foreground_color_grid]) - GR.settransparency(yaxis[:gridalpha]) - else - gr_set_line(1, :solid, yaxis[:foreground_color_axis]) + if yaxis[:showaxis] + if sp[:framestyle] in (:zerolines, :grid) + gr_set_line(1, :solid, yaxis[:foreground_color_grid]) + GR.settransparency(yaxis[:gridalpha]) + else + gr_set_line(1, :solid, yaxis[:foreground_color_axis]) + end + GR.setclip(0) + gr_polyline(coords(ytick_segs)...) end - GR.setclip(0) - gr_polyline(coords(ytick_segs)...) GR.setclip(1) # tick marks - if !(xticks in (:none, nothing, false)) + if !(xticks in (:none, nothing, false)) && xaxis[:showaxis] # x labels flip, mirror = gr_set_xticks_font(sp) for (cv, dv) in zip(xticks...) @@ -832,7 +840,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) end end - if !(yticks in (:none, nothing, false)) + if !(yticks in (:none, nothing, false)) && yaxis[:showaxis] # y labels flip, mirror = gr_set_yticks_font(sp) for (cv, dv) in zip(yticks...)