changeset 26243:b22a2aa820e6

legend.m: Implement new placement algorithm with larger spacing from axes. * legend.m: New variable "bpad" specifying legend box padding to axes. Use bpad in all spacing calculations for legend location.
author Rik <rik@octave.org>
date Sat, 15 Dec 2018 20:28:52 -0800
parents 2730917a7979
children 58b3107a00bc
files scripts/plot/appearance/legend.m
diffstat 1 files changed, 48 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/plot/appearance/legend.m	Sat Dec 15 15:44:01 2018 -0800
+++ b/scripts/plot/appearance/legend.m	Sat Dec 15 20:28:52 2018 -0800
@@ -585,6 +585,8 @@
       xpad = 2 + 1/3;
       ypad = 4;
 
+      bpad = 8;  # padding of legend box from surrounding axes
+
       linelength = 15;
 
       ## Preamble code to restore figure and axes after legend creation
@@ -765,95 +767,98 @@
           case "north"
             if (outside)
               lpos = [ca_pos(1) + (ca_pos(3) - lpos(3)) / 2, ...
-                      ca_outpos(2) + ca_outpos(4) - lpos(4) - ypad, lpos(3), ...
-                      lpos(4)];
+                      ca_outpos(2) + ca_outpos(4) - lpos(4) - bpad/2, ...
+                      lpos(3), lpos(4)];
 
               new_pos = [ca_pos(1), ca_pos(2), ca_pos(3), ca_pos(4) - lpos(4)];
             else
               lpos = [ca_pos(1) + (ca_pos(3) - lpos(3)) / 2, ...
-                      ca_pos(2) + ca_pos(4) - lpos(4) - ypad, lpos(3), lpos(4)];
+                      ca_pos(2) + ca_pos(4) - lpos(4) - bpad, ...
+                      lpos(3), lpos(4)];
             endif
           case "south"
             if (outside)
               lpos = [ca_pos(1) + (ca_pos(3) - lpos(3)) / 2, ...
-                      ca_outpos(2) + ypad, lpos(3), lpos(4)];
-              new_pos = [ca_pos(1), lpos(2) + lpos(4) + 2 * ypad ...
-                      + tightinset(2), ca_pos(3), ...
-                         ca_pos(4) - lpos(4)];
+                      ca_outpos(2) + bpad/2, lpos(3), lpos(4)];
+              new_pos = [ca_pos(1), ...
+                         lpos(2) + lpos(4) + bpad/2 + tightinset(2), ...
+                         ca_pos(3), ca_pos(4) - lpos(4)];
             else
               lpos = [ca_pos(1) + (ca_pos(3) - lpos(3)) / 2, ...
-                      ca_pos(2) + ypad, lpos(3), lpos(4)];
+                      ca_pos(2) + bpad, lpos(3), lpos(4)];
             endif
           case "east"
             if (outside)
-              lpos = [ca_outpos(1) + ca_outpos(3) - lpos(3) - ypad, ...
-                      ca_pos(2) + (ca_pos(4) - lpos(4)) / 2, lpos(3), lpos(4)];
+              lpos = [ca_outpos(1) + ca_outpos(3) - lpos(3) - bpad/2, ...
+                      ca_pos(2) + (ca_pos(4) - lpos(4)) / 2, ...
+                      lpos(3), lpos(4)];
               new_pos = [ca_pos(1), ca_pos(2), ...
-                         lpos(1) - 2 * xpad - ca_pos(1) - tightinset(3), ...
+                         lpos(1) - bpad - tightinset(3) - ca_pos(1), ...
                          ca_pos(4)];
-              new_pos(3) = new_pos(3) + gnuplot_offset;
+              new_pos(3) += gnuplot_offset;
             else
-              lpos = [ca_pos(1) + ca_pos(3) - lpos(3) - ypad, ...
+              lpos = [ca_pos(1) + ca_pos(3) - lpos(3) - bpad, ...
                       ca_pos(2) + (ca_pos(4) - lpos(4)) / 2, lpos(3), lpos(4)];
             endif
           case "west"
             if (outside)
-              lpos = [ca_outpos(1) + ypad, ...
+              lpos = [ca_outpos(1) + bpad/2, ...
                       ca_pos(2) + (ca_pos(4) - lpos(4)) / 2, ...
                       lpos(3), lpos(4)];
-              new_pos = [lpos(1) + lpos(3) + 2 * xpad + tightinset(1), ...
-                         ca_pos(2), ca_pos(3) - lpos(3) - 2 * xpad, ca_pos(4)];
-              new_pos(1) = new_pos(1) - gnuplot_offset;
-              new_pos(3) = new_pos(3) + gnuplot_offset;
+              new_pos = [lpos(1) + lpos(3) + bpad/2 + tightinset(1), ...
+                         ca_pos(2), ca_pos(3) - lpos(3) - bpad/2, ca_pos(4)];
+              new_pos([1, 3]) += [-gnuplot_offset, gnuplot_offset];
             else
-              lpos = [ca_pos(1) +  ypad, ...
+              lpos = [ca_pos(1) + bpad, ...
                       ca_pos(2) + (ca_pos(4) - lpos(4)) / 2, lpos(3), lpos(4)];
             endif
           case "northeast"
             if (outside)
-              lpos = [ca_outpos(1) + ca_outpos(3) - lpos(3) - ypad, ...
-                      ca_pos(2) + ca_pos(4) - lpos(4), lpos(3), lpos(4)];
+              lpos = [ca_outpos(1) + ca_outpos(3) - lpos(3) - bpad/2, ...
+                      ca_pos(2) + ca_pos(4) - lpos(4), ...
+                      lpos(3), lpos(4)];
               new_pos = [ca_pos(1), ca_pos(2), ...
-                         lpos(1) - 2 * xpad - tightinset(3) - ca_pos(1), ...
+                         lpos(1) - bpad - tightinset(3) - ca_pos(1), ...
                          ca_pos(4)];
-              new_pos(3) = new_pos(3) + gnuplot_offset;
+              new_pos(3) += gnuplot_offset;
             else
-              lpos = [ca_pos(1) + ca_pos(3) - lpos(3) - ypad, ...
-                      ca_pos(2) + ca_pos(4) - lpos(4) - ypad, lpos(3), lpos(4)];
+              lpos = [ca_pos(1) + ca_pos(3) - lpos(3) - bpad, ...
+                      ca_pos(2) + ca_pos(4) - lpos(4) - bpad, ...
+                      lpos(3), lpos(4)];
             endif
           case "northwest"
             if (outside)
-              lpos = [ca_outpos(1) + ypad , ca_pos(2) + ca_pos(4) - lpos(4), ...
+              lpos = [ca_outpos(1) + bpad/2, ...
+                      ca_pos(2) + ca_pos(4) - lpos(4), ...
                       lpos(3), lpos(4)];
-              new_pos = [lpos(1) + lpos(3) + 2 * xpad + tightinset(1), ...
-              ca_pos(2), ca_pos(3) - lpos(3) - 2 * xpad, ca_pos(4)];
-              new_pos(1) = new_pos(1) - gnuplot_offset;
-              new_pos(3) = new_pos(3) + gnuplot_offset;
+              new_pos = [lpos(1) + lpos(3) + bpad/2 + tightinset(1), ...
+                         ca_pos(2), ca_pos(3) - lpos(3) - bpad/2, ca_pos(4)];
+              new_pos([1, 3]) += [-gnuplot_offset, gnuplot_offset];
             else
-              lpos = [ca_pos(1) + ypad, ...
-                      ca_pos(2) + ca_pos(4) - lpos(4) - ypad, lpos(3), lpos(4)];
+              lpos = [ca_pos(1) + bpad, ...
+                      ca_pos(2) + ca_pos(4) - lpos(4) - bpad, ...
+                      lpos(3), lpos(4)];
             endif
           case "southeast"
             if (outside)
-              lpos = [ca_outpos(1) + ca_outpos(3) - lpos(3) - ypad, ...
+              lpos = [ca_outpos(1) + ca_outpos(3) - lpos(3) - bpad/2, ...
                       ca_pos(2), lpos(3), lpos(4)];
               new_pos = [ca_pos(1), ca_pos(2), ...
-                         lpos(1) - 2 * xpad - ca_pos(1) - tightinset(3), ...
+                         lpos(1) - bpad - ca_pos(1) - tightinset(3), ...
                          ca_pos(4)];
-              new_pos(3) = new_pos(3) + gnuplot_offset;
+              new_pos(3) += gnuplot_offset;
             else
-              lpos = [ca_pos(1) + ca_pos(3) - lpos(3) - ypad, ...
-                      ca_pos(2) + ypad, lpos(3), lpos(4)];
+              lpos = [ca_pos(1) + ca_pos(3) - lpos(3) - bpad, ...
+                      ca_pos(2) + bpad, lpos(3), lpos(4)];
             endif
           case "southwest"
             if (outside)
-              lpos = [ca_outpos(1) + ypad, ca_pos(2), lpos(3), lpos(4)];
-              new_pos = [lpos(1) + lpos(3) + 2 * xpad + tightinset(1), ...
-              ca_pos(2), ca_pos(3) - lpos(3) - 2 * xpad, ca_pos(4)];
-              new_pos(1) = new_pos(1) - gnuplot_offset;
-              new_pos(3) = new_pos(3) + gnuplot_offset;
+              lpos = [ca_outpos(1) + bpad/2, ca_pos(2), lpos(3), lpos(4)];
+              new_pos = [lpos(1) + lpos(3) + bpad/2 + tightinset(1), ...
+                         ca_pos(2), ca_pos(3) - lpos(3) - bpad/2, ca_pos(4)];
+              new_pos([1, 3]) += [-gnuplot_offset, gnuplot_offset];
             else
-              lpos = [ca_pos(1) + ypad, ca_pos(2) + ypad, lpos(3), lpos(4)];
+              lpos = [ca_pos(1) + bpad, ca_pos(2) + bpad, lpos(3), lpos(4)];
             endif
         endswitch