From d0367945763cf2a074789301b11d2ccfc13d334b Mon Sep 17 00:00:00 2001 From: Diaga Date: Mon, 22 Jun 2020 17:04:53 +0500 Subject: [PATCH 1/4] Fix #2330, #2202: Position legends closer to the borders --- src/backends/gr.jl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 9fc59392..4334f9ef 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -581,28 +581,28 @@ function gr_legend_pos(sp::Subplot, w, h, viewport_plotarea) # As per https://github.com/jheinen/GR.jl/blob/master/src/jlgr.jl#L525 xpos = viewport_plotarea[2] + 0.11 + ymirror * gr_axis_width(sp, sp[:yaxis]) else - xpos = viewport_plotarea[2] - 0.05 - w + xpos = viewport_plotarea[2] - 0.01 - w end elseif occursin("left", str) if occursin("outer", str) xpos = viewport_plotarea[1] - 0.05 - w - !ymirror * gr_axis_width(sp, sp[:yaxis]) else - xpos = viewport_plotarea[1] + 0.11 + xpos = viewport_plotarea[1] + 0.08 + 0.01 end else - xpos = (viewport_plotarea[2]-viewport_plotarea[1])/2 - w/2 +.04 + viewport_plotarea[1] + xpos = (viewport_plotarea[2]-viewport_plotarea[1])/2 - w/2 + 0.04 + viewport_plotarea[1] end if occursin("top", str) if s == :outertop ypos = viewport_plotarea[4] + 0.02 + h + xmirror * gr_axis_height(sp, sp[:xaxis]) else - ypos = viewport_plotarea[4] - 0.06 + ypos = viewport_plotarea[4] - 0.01 end elseif occursin("bottom", str) if s == :outerbottom ypos = viewport_plotarea[3] - 0.05 - !xmirror * gr_axis_height(sp, sp[:xaxis]) else - ypos = viewport_plotarea[3] + h + 0.06 + ypos = viewport_plotarea[3] + h + 0.01 end else # Adding min y to shift legend pos to correct graph (#2377) From 376fae0d79d27db4e8358ab9a40ddf6a7e0687a8 Mon Sep 17 00:00:00 2001 From: Diaga Date: Thu, 2 Jul 2020 18:12:23 +0500 Subject: [PATCH 2/4] Make legend offset calculation dynamic --- src/backends/gr.jl | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 4334f9ef..b27c7e39 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -568,6 +568,8 @@ function gr_legend_pos(sp::Subplot, w, h, viewport_plotarea) s = sp[:legend] typeof(s) <: Symbol || return gr_legend_pos(s, w, h, viewport_plotarea) str = string(s) + x_legend_offset = (viewport_plotarea[2] - viewport_plotarea[1]) / 30 + y_legend_offset = (viewport_plotarea[4] - viewport_plotarea[3]) / 15 if str == "best" str = "topright" end @@ -581,13 +583,13 @@ function gr_legend_pos(sp::Subplot, w, h, viewport_plotarea) # As per https://github.com/jheinen/GR.jl/blob/master/src/jlgr.jl#L525 xpos = viewport_plotarea[2] + 0.11 + ymirror * gr_axis_width(sp, sp[:yaxis]) else - xpos = viewport_plotarea[2] - 0.01 - w + xpos = viewport_plotarea[2] - x_legend_offset - w end elseif occursin("left", str) if occursin("outer", str) xpos = viewport_plotarea[1] - 0.05 - w - !ymirror * gr_axis_width(sp, sp[:yaxis]) else - xpos = viewport_plotarea[1] + 0.08 + 0.01 + xpos = viewport_plotarea[1] + 0.08 + x_legend_offset end else xpos = (viewport_plotarea[2]-viewport_plotarea[1])/2 - w/2 + 0.04 + viewport_plotarea[1] @@ -596,13 +598,13 @@ function gr_legend_pos(sp::Subplot, w, h, viewport_plotarea) if s == :outertop ypos = viewport_plotarea[4] + 0.02 + h + xmirror * gr_axis_height(sp, sp[:xaxis]) else - ypos = viewport_plotarea[4] - 0.01 + ypos = viewport_plotarea[4] - y_legend_offset end elseif occursin("bottom", str) if s == :outerbottom ypos = viewport_plotarea[3] - 0.05 - !xmirror * gr_axis_height(sp, sp[:xaxis]) else - ypos = viewport_plotarea[3] + h + 0.01 + ypos = viewport_plotarea[3] + h + y_legend_offset end else # Adding min y to shift legend pos to correct graph (#2377) From ff7235e9b8808910d106b9dbb16d02dc7b49fcc1 Mon Sep 17 00:00:00 2001 From: Diaga Date: Fri, 3 Jul 2020 17:56:13 +0500 Subject: [PATCH 3/4] Remove constant offsets for xpos --- src/backends/gr.jl | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index b27c7e39..15c3c7b0 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -565,11 +565,10 @@ gr_view_xcenter(viewport_plotarea) = 0.5 * (viewport_plotarea[1] + viewport_plot gr_view_ycenter(viewport_plotarea) = 0.5 * (viewport_plotarea[3] + viewport_plotarea[4]) function gr_legend_pos(sp::Subplot, w, h, viewport_plotarea) + legend_leftw, legend_rightw, legend_textw, x_legend_offset, y_legend_offset = w s = sp[:legend] typeof(s) <: Symbol || return gr_legend_pos(s, w, h, viewport_plotarea) str = string(s) - x_legend_offset = (viewport_plotarea[2] - viewport_plotarea[1]) / 30 - y_legend_offset = (viewport_plotarea[4] - viewport_plotarea[3]) / 15 if str == "best" str = "topright" end @@ -581,18 +580,18 @@ function gr_legend_pos(sp::Subplot, w, h, viewport_plotarea) 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_axis_width(sp, sp[:yaxis]) + xpos = viewport_plotarea[2] + x_legend_offset + legend_leftw + ymirror * gr_axis_width(sp, sp[:yaxis]) else - xpos = viewport_plotarea[2] - x_legend_offset - w + xpos = viewport_plotarea[2] - legend_rightw - legend_textw end elseif occursin("left", str) if occursin("outer", str) - xpos = viewport_plotarea[1] - 0.05 - w - !ymirror * gr_axis_width(sp, sp[:yaxis]) + xpos = viewport_plotarea[1] - !ymirror * gr_axis_width(sp, sp[:yaxis]) - x_legend_offset * 2 - legend_rightw - legend_textw else - xpos = viewport_plotarea[1] + 0.08 + x_legend_offset + xpos = viewport_plotarea[1] + legend_leftw + x_legend_offset end else - xpos = (viewport_plotarea[2]-viewport_plotarea[1])/2 - w/2 + 0.04 + viewport_plotarea[1] + xpos = (viewport_plotarea[2]-viewport_plotarea[1])/2 + viewport_plotarea[1] + legend_leftw - legend_rightw - legend_textw - x_legend_offset * 2 end if occursin("top", str) if s == :outertop @@ -1002,22 +1001,29 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) legendn += 1 lab = series[:label] tbx, tby = gr_inqtext(0, 0, string(lab)) - legendw = max(legendw, tbx[3] - tbx[1]) + legendw = max(legendw, tbx[3] - tbx[1]) # Holds text width right now end GR.setscale(1) GR.selntran(1) GR.restorestate() end + legend_textw = legendw + legend_rightw = 0.02 # To be made dynamic in a follow up PR + legend_leftw = 0.08 # To be made dynamic in a follow up PR + total_legendw = legend_textw + legend_leftw + legend_rightw + + x_legend_offset = (viewport_plotarea[2] - viewport_plotarea[1]) / 30 + y_legend_offset = (viewport_plotarea[4] - viewport_plotarea[3]) / 15 dy = gr_point_mult(sp) * sp[:legendfontsize] * 1.75 legendh = dy * legendn leg_str = string(sp[:legend]) if occursin("outer", leg_str) if occursin("right", leg_str) - viewport_plotarea[2] -= legendw + 0.12 + viewport_plotarea[2] -= total_legendw + x_legend_offset # Lessen plot max width to make space for outer legend elseif occursin("left", leg_str) - viewport_plotarea[1] += legendw + 0.11 + viewport_plotarea[1] += total_legendw + x_legend_offset # Increase plot min width to make space for outer legend elseif occursin("top", leg_str) viewport_plotarea[4] -= legendh + 0.03 elseif occursin("bottom", leg_str) @@ -1839,17 +1845,17 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) GR.selntran(0) GR.setscale(0) gr_set_font(legendfont(sp), sp) - w = legendw + w = legendw # This is the legend text width n = legendn if w > 0 dy = gr_point_mult(sp) * sp[:legendfontsize] * 1.75 h = dy*n - xpos, ypos = gr_legend_pos(sp, w, h, viewport_plotarea) + xpos, ypos = gr_legend_pos(sp, [legend_leftw, legend_rightw, legend_textw, x_legend_offset, y_legend_offset], h, viewport_plotarea) # Passing legend width components instead of legend text width GR.setfillintstyle(GR.INTSTYLE_SOLID) gr_set_fillcolor(sp[:background_color_legend]) - GR.fillrect(xpos - 0.08, xpos + w + 0.02, ypos + dy, ypos - dy * n) + GR.fillrect(xpos - legend_leftw, xpos + legend_textw + legend_rightw, ypos + dy, ypos - dy * n) # Allocating white space for actual legend width here gr_set_line(1, :solid, sp[:foreground_color_legend], sp) - GR.drawrect(xpos - 0.08, xpos + w + 0.02, ypos + dy, ypos - dy * n) + GR.drawrect(xpos - legend_leftw, xpos + legend_textw + legend_rightw, ypos + dy, ypos - dy * n) # Drawing actual legend width here i = 0 if sp[:legendtitle] !== nothing GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_HALF) From 02ca049bc656ebf25fb59e2d298f12a8c3a6731b Mon Sep 17 00:00:00 2001 From: Diaga Date: Fri, 3 Jul 2020 18:52:54 +0500 Subject: [PATCH 4/4] Remove static offsets for ypos --- src/backends/gr.jl | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 15c3c7b0..f980aadd 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -565,7 +565,8 @@ gr_view_xcenter(viewport_plotarea) = 0.5 * (viewport_plotarea[1] + viewport_plot gr_view_ycenter(viewport_plotarea) = 0.5 * (viewport_plotarea[3] + viewport_plotarea[4]) function gr_legend_pos(sp::Subplot, w, h, viewport_plotarea) - legend_leftw, legend_rightw, legend_textw, x_legend_offset, y_legend_offset = w + legend_leftw, legend_rightw, legend_textw, x_legend_offset = w + legend_dy, legendh, y_legend_offset = h s = sp[:legend] typeof(s) <: Symbol || return gr_legend_pos(s, w, h, viewport_plotarea) str = string(s) @@ -595,19 +596,19 @@ function gr_legend_pos(sp::Subplot, w, h, viewport_plotarea) end if occursin("top", str) if s == :outertop - ypos = viewport_plotarea[4] + 0.02 + h + xmirror * gr_axis_height(sp, sp[:xaxis]) + ypos = viewport_plotarea[4] + y_legend_offset + legendh + xmirror * gr_axis_height(sp, sp[:xaxis]) else ypos = viewport_plotarea[4] - y_legend_offset end elseif occursin("bottom", str) if s == :outerbottom - ypos = viewport_plotarea[3] - 0.05 - !xmirror * gr_axis_height(sp, sp[:xaxis]) + ypos = viewport_plotarea[3] - y_legend_offset - legendh - !xmirror * gr_axis_height(sp, sp[:xaxis]) else - ypos = viewport_plotarea[3] + h + y_legend_offset + ypos = viewport_plotarea[3] + legendh + y_legend_offset end else # Adding min y to shift legend pos to correct graph (#2377) - ypos = (viewport_plotarea[4]-viewport_plotarea[3])/2 + h/2 + viewport_plotarea[3] + ypos = (viewport_plotarea[4]-viewport_plotarea[3])/2 + legendh/2 + viewport_plotarea[3] end (xpos,ypos) end @@ -1014,7 +1015,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) total_legendw = legend_textw + legend_leftw + legend_rightw x_legend_offset = (viewport_plotarea[2] - viewport_plotarea[1]) / 30 - y_legend_offset = (viewport_plotarea[4] - viewport_plotarea[3]) / 15 + y_legend_offset = (viewport_plotarea[4] - viewport_plotarea[3]) / 30 dy = gr_point_mult(sp) * sp[:legendfontsize] * 1.75 legendh = dy * legendn @@ -1025,9 +1026,9 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) elseif occursin("left", leg_str) viewport_plotarea[1] += total_legendw + x_legend_offset # Increase plot min width to make space for outer legend elseif occursin("top", leg_str) - viewport_plotarea[4] -= legendh + 0.03 + viewport_plotarea[4] -= legendh + dy + y_legend_offset elseif occursin("bottom", leg_str) - viewport_plotarea[3] += legendh + 0.04 + viewport_plotarea[3] += legendh + dy + y_legend_offset end end if sp[:legend] == :inline @@ -1850,7 +1851,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) if w > 0 dy = gr_point_mult(sp) * sp[:legendfontsize] * 1.75 h = dy*n - xpos, ypos = gr_legend_pos(sp, [legend_leftw, legend_rightw, legend_textw, x_legend_offset, y_legend_offset], h, viewport_plotarea) # Passing legend width components instead of legend text width + xpos, ypos = gr_legend_pos(sp, [legend_leftw, legend_rightw, legend_textw, x_legend_offset, y_legend_offset], [dy, h, y_legend_offset], viewport_plotarea) # Passing legend width components instead of legend text width GR.setfillintstyle(GR.INTSTYLE_SOLID) gr_set_fillcolor(sp[:background_color_legend]) GR.fillrect(xpos - legend_leftw, xpos + legend_textw + legend_rightw, ypos + dy, ypos - dy * n) # Allocating white space for actual legend width here