From e16125cb507438c9399d1ea499933ca46ecf474f Mon Sep 17 00:00:00 2001 From: Pietro Vertechi Date: Wed, 23 Aug 2017 13:49:33 +0100 Subject: [PATCH 1/4] some GR margin fixes --- src/backends/gr.jl | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index c90c26b8..d1924446 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -326,7 +326,7 @@ function gr_draw_markers(series::Series, x, y, msize, mz) cfuncind(ci) GR.settransparency(_gr_gradient_alpha[ci-999]) end - # don't draw filled area if marker shape is 1D + # don't draw filled area if marker shape is 1D if !(shape in (:hline, :vline, :+, :x, :cross, :xcross)) gr_draw_marker(x[i], y[i], msi, shape) end @@ -543,10 +543,10 @@ end function _update_min_padding!(sp::Subplot{GRBackend}) - leftpad = 10mm - toppad = 2mm - rightpad = 2mm - bottompad = 6mm + leftpad = 10mm + sp[:left_margin] + toppad = 2mm + sp[:top_margin] + rightpad = 2mm + sp[:right_margin] + bottompad = 6mm + sp[:bottom_margin] if sp[:title] != "" toppad += 5mm end @@ -558,10 +558,11 @@ function _update_min_padding!(sp::Subplot{GRBackend}) valign = :top, color = sp[:xaxis][:foreground_color_axis], rotation = sp[:xaxis][:rotation]) - h = 0 + h = 0.0 for (cv, dv) in zip(xticks...) tbx, tby = gr_inqtext(0, 0, string(dv)) - h = max(h, tby[2] - tby[1]) + tby_min, tby_max = extrema(tby) + h = max(h, tby_max - tby_min) end bottompad += 1mm + gr_plot_size[2] * h * px else From b3b533db94c58b1dc666bb6722cbc9426141028b Mon Sep 17 00:00:00 2001 From: Pietro Vertechi Date: Wed, 23 Aug 2017 14:10:35 +0100 Subject: [PATCH 2/4] fix margin in case there is no label (gr) --- src/backends/gr.jl | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index d1924446..4a3c06ee 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -543,32 +543,36 @@ end function _update_min_padding!(sp::Subplot{GRBackend}) + # Add margin given by the user leftpad = 10mm + sp[:left_margin] toppad = 2mm + sp[:top_margin] - rightpad = 2mm + sp[:right_margin] - bottompad = 6mm + sp[:bottom_margin] + rightpad = 4mm + sp[:right_margin] + bottompad = 2mm + sp[:bottom_margin] + # Add margin for title if sp[:title] != "" toppad += 5mm end - if sp[:xaxis][:guide] != "" - xticks = axis_drawing_info(sp)[1] - if !(xticks in (nothing, false)) - gr_set_font(sp[:xaxis][:tickfont], - halign = (:left, :hcenter, :right)[sign(sp[:xaxis][:rotation]) + 2], - valign = :top, - color = sp[:xaxis][:foreground_color_axis], - rotation = sp[:xaxis][:rotation]) - h = 0.0 - for (cv, dv) in zip(xticks...) - tbx, tby = gr_inqtext(0, 0, string(dv)) - tby_min, tby_max = extrema(tby) - h = max(h, tby_max - tby_min) - end - bottompad += 1mm + gr_plot_size[2] * h * px - else - bottompad += 4mm + # Add margin for x ticks + xticks = axis_drawing_info(sp)[1] + if !(xticks in (nothing, false)) + gr_set_font(sp[:xaxis][:tickfont], + halign = (:left, :hcenter, :right)[sign(sp[:xaxis][:rotation]) + 2], + valign = :top, + color = sp[:xaxis][:foreground_color_axis], + rotation = sp[:xaxis][:rotation]) + h = 0.0 + for (cv, dv) in zip(xticks...) + tbx, tby = gr_inqtext(0, 0, string(dv)) + tby_min, tby_max = extrema(tby) + h = max(h, tby_max - tby_min) end + bottompad += 1mm + gr_plot_size[2] * h * px end + # Add margin for x label + if sp[:xaxis][:guide] != "" + bottompad += 4mm + end + # Add margin for y label if sp[:yaxis][:guide] != "" leftpad += 4mm end From 06115f25bad8114c187f4b32a013b55236ae46ec Mon Sep 17 00:00:00 2001 From: Pietro Vertechi Date: Wed, 23 Aug 2017 17:43:06 +0100 Subject: [PATCH 3/4] factorize tickfont --- src/backends/gr.jl | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 4a3c06ee..12fd42de 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -542,6 +542,30 @@ function gr_display(plt::Plot) end +function gr_set_xticks_font(sp) + flip = sp[:yaxis][:flip] + mirror = sp[:xaxis][:mirror] + gr_set_font(sp[:xaxis][:tickfont], + halign = (:left, :hcenter, :right)[sign(sp[:xaxis][:rotation]) + 2], + valign = (mirror ? :bottom : :top), + color = sp[:xaxis][:foreground_color_axis], + rotation = sp[:xaxis][:rotation]) + return flip, mirror +end + + +function gr_set_yticks_font(sp) + flip = sp[:xaxis][:flip] + mirror = sp[:yaxis][:mirror] + gr_set_font(sp[:yaxis][:tickfont], + halign = (mirror ? :left : :right), + valign = (:top, :vcenter, :bottom)[sign(sp[:yaxis][:rotation]) + 2], + color = sp[:yaxis][:foreground_color_axis], + rotation = sp[:yaxis][:rotation]) + return flip, mirror +end + + function _update_min_padding!(sp::Subplot{GRBackend}) # Add margin given by the user leftpad = 10mm + sp[:left_margin] @@ -747,13 +771,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) if !(xticks in (nothing, false)) # x labels - flip = sp[:yaxis][:flip] - mirror = sp[:xaxis][:mirror] - gr_set_font(sp[:xaxis][:tickfont], - halign = (:left, :hcenter, :right)[sign(sp[:xaxis][:rotation]) + 2], - valign = (mirror ? :bottom : :top), - color = sp[:xaxis][:foreground_color_axis], - rotation = sp[:xaxis][:rotation]) + 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, xor(flip, mirror) ? ymax : ymin) @@ -764,13 +782,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) if !(yticks in (nothing, false)) # y labels - flip = sp[:xaxis][:flip] - mirror = sp[:yaxis][:mirror] - gr_set_font(sp[:yaxis][:tickfont], - halign = (mirror ? :left : :right), - valign = (:top, :vcenter, :bottom)[sign(sp[:yaxis][:rotation]) + 2], - color = sp[:yaxis][:foreground_color_axis], - rotation = sp[:yaxis][:rotation]) + 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(xor(flip, mirror) ? xmax : xmin, cv) From 91158b1c20708375082301d9a272c33b3b135157 Mon Sep 17 00:00:00 2001 From: Pietro Vertechi Date: Wed, 23 Aug 2017 18:00:39 +0100 Subject: [PATCH 4/4] add proper pad for ticks --- src/backends/gr.jl | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 12fd42de..515aaa7e 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -565,10 +565,19 @@ function gr_set_yticks_font(sp) return flip, mirror end +function gr_get_ticks_size(ticks, i) + l = 0.0 + for (cv, dv) in zip(ticks...) + tb = gr_inqtext(0, 0, string(dv))[i] + tb_min, tb_max = extrema(tb) + l = max(l, tb_max - tb_min) + end + return l +end function _update_min_padding!(sp::Subplot{GRBackend}) # Add margin given by the user - leftpad = 10mm + sp[:left_margin] + leftpad = 2mm + sp[:left_margin] toppad = 2mm + sp[:top_margin] rightpad = 4mm + sp[:right_margin] bottompad = 2mm + sp[:bottom_margin] @@ -576,21 +585,25 @@ function _update_min_padding!(sp::Subplot{GRBackend}) if sp[:title] != "" toppad += 5mm end - # Add margin for x ticks - xticks = axis_drawing_info(sp)[1] + # Add margin for x and y ticks + xticks, yticks = axis_drawing_info(sp)[1:2] if !(xticks in (nothing, false)) - gr_set_font(sp[:xaxis][:tickfont], - halign = (:left, :hcenter, :right)[sign(sp[:xaxis][:rotation]) + 2], - valign = :top, - color = sp[:xaxis][:foreground_color_axis], - rotation = sp[:xaxis][:rotation]) - h = 0.0 - for (cv, dv) in zip(xticks...) - tbx, tby = gr_inqtext(0, 0, string(dv)) - tby_min, tby_max = extrema(tby) - h = max(h, tby_max - tby_min) + flip, mirror = gr_set_xticks_font(sp) + l = gr_get_ticks_size(xticks, 2) + if mirror + toppad += 1mm + gr_plot_size[2] * l * px + else + bottompad += 1mm + gr_plot_size[2] * l * px + end + end + if !(yticks in (nothing, false)) + flip, mirror = gr_set_yticks_font(sp) + l = gr_get_ticks_size(yticks, 1) + if mirror + rightpad += 1mm + gr_plot_size[1] * l * px + else + leftpad += 1mm + gr_plot_size[1] * l * px end - bottompad += 1mm + gr_plot_size[2] * h * px end # Add margin for x label if sp[:xaxis][:guide] != ""