changeset 23253:8a1ba13e9914 stable

Correct hggroup plot legends for gnuplot toolkit, add legend demo 17 items (bug #49341) * legend.m: For demo 17, use 2x1 subplots and add a stem example having both stem series with single color and with different color for stems and markers. Place both plot legends in the northwest corner. * __gnuplot_draw_axes__.m: Move title and phantom data sooner in 'line' object case and set is_image_data, parametric, have_cdata and have_3d_patch array values all to 'false'. Distinguish between stem series data and error bar data under 'line' case by checking for existence of 'format' property in the hggroup. For stem series data, call another do_linestyle_command using the parent, i.e., hggroup. For the 'patch' case, copy the parent 'displayname' property to the object--as was done prior to the phantom data approach. The above two changes fixes 'demo legend 17'. For 'surface' case, make a mock key symbol using phantom data and a thick line. The above change fixes 'demo legend 18'. (do_linestyle_command): Remove extraneous '! isempty (pt)' conditional tests.
author Daniel J Sebald <daniel.sebald@ieee.org>
date Sun, 16 Oct 2016 02:23:54 -0500
parents 64c0842f4e81
children 7eeb2c561a1a 61ec2557eece
files scripts/plot/appearance/legend.m scripts/plot/util/private/__gnuplot_draw_axes__.m
diffstat 2 files changed, 75 insertions(+), 52 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/plot/appearance/legend.m	Thu Oct 06 12:18:15 2016 -0500
+++ b/scripts/plot/appearance/legend.m	Sun Oct 16 02:23:54 2016 -0500
@@ -1369,6 +1369,12 @@
 %! ylim ([0 1.0]);
 %! title ("legend() works for bar graphs (hggroups)");
 %! legend ({"1st Bar", "2nd Bar", "3rd Bar"});
+%! x = linspace (0, 10, 20);
+%! stem (x, 0.5+x.*rand (size (x))/max (x), "markeredgecolor", [0 0.7 0]);
+%! hold on;
+%! stem (x+10/(2*20), x.*(1.0+rand (size (x)))/max (x));
+%! xlim ([0 10+10/(2*20)]);
+%! legend ({"Multicolor", "Unicolor"}, "location", "northwest");
 
 %!demo
 %! clf;
--- a/scripts/plot/util/private/__gnuplot_draw_axes__.m	Thu Oct 06 12:18:15 2016 -0500
+++ b/scripts/plot/util/private/__gnuplot_draw_axes__.m	Sun Oct 16 02:23:54 2016 -0500
@@ -612,6 +612,52 @@
         withclause{data_idx} = sprintf ("with %s;", imagetype);
 
       case "line"
+        if (strcmp (get (obj.parent, "type"), "hggroup"))
+          hg = get (obj.parent, "children");
+          if (hg(1) == h_obj && ! isempty (get (obj.parent, "displayname")))
+            data_idx += 1;
+            is_image_data(data_idx) = false;
+            parametric(data_idx) = false;
+            have_cdata(data_idx) = false;
+            have_3d_patch(data_idx) = false;
+            tmpdispname = obj.displayname;
+            obj.displayname = get (obj.parent, "displayname");
+            tmp = undo_string_escapes (
+                    __maybe_munge_text__ (enhanced, obj, "displayname")
+                  );
+            titlespec{data_idx} = ['title "' tmp '"'];
+            obj.displayname = tmpdispname;
+            if (! isempty (findobj (obj.parent, "-property", "format", "-depth", 0)))
+              # Place phantom errorbar data for legend
+              data{data_idx} = nan (4,1);
+              usingclause{data_idx} = sprintf ("record=1 using ($1):($2):($3):($4)");
+              switch (get (obj.parent, "format"))
+                case {"box" "boxy" "boxxy"}
+                  errbars = "boxxy";
+                case "xyerr"
+                  errbars = "xyerrorbars";
+                case "yerr"
+                  errbars = "yerrorbars";
+                case "xerr"
+                  errbars = "xerrorbars";
+                otherwise
+                  errbars = "xerrorbars";
+              endswitch
+              withclause{data_idx} = sprintf ("with %s linestyle %d",
+                                              errbars, sidx(1));
+            else
+              ## Place phantom stemseries data for legend
+              data{data_idx} = nan (2,1);
+              usingclause{data_idx} = sprintf ("record=1 using ($1):($2)");
+              hgobj = get (obj.parent);
+              [hgstyle, hgsidx] = do_linestyle_command (hgobj, hgobj.color, data_idx,
+                                                        plot_stream);
+              withclause{data_idx} = sprintf ("with %s linestyle %d",
+                                              hgstyle{1}, hgsidx(1));
+            endif
+          endif
+        endif
+
         if (strcmp (obj.linestyle, "none")
             && (! isfield (obj, "marker")
                 || (isfield (obj, "marker")
@@ -688,44 +734,11 @@
                                           style{3}, sidx(3));
         endif
 
+      case "patch"
         if (strcmp (get (obj.parent, "type"), "hggroup"))
-          hg = get (obj.parent, "children");
-          if (hg(1) == h_obj)
-            # Place phantom errorbar data for legend
-            data_idx += 1;
-            is_image_data(data_idx) = is_image_data(data_idx - 1);
-            parametric(data_idx) = parametric(data_idx - 1);
-            have_cdata(data_idx) = have_cdata(data_idx - 1);
-            have_3d_patch(data_idx) = have_3d_patch(data_idx - 1);
-            obj.displayname = get (obj.parent, "displayname");
-            if (isempty (get (obj.parent, "displayname")))
-              titlespec{data_idx} = "title \"\"";
-            else
-              tmp = undo_string_escapes (
-                      __maybe_munge_text__ (enhanced, obj, "displayname")
-                    );
-              titlespec{data_idx} = ['title "' tmp '"'];
-            endif
-            data{data_idx} = nan (4,1);
-            usingclause{data_idx} = sprintf ("record=1 using ($1):($2):($3):($4)");
-            switch (get (obj.parent, "format"))
-              case {"box" "boxy" "boxxy"}
-                errbars = "boxxy";
-              case "xyerr"
-                errbars = "xyerrorbars";
-              case "yerr"
-                errbars = "yerrorbars";
-              case "xerr"
-                errbars = "xerrorbars";
-              otherwise
-                errbars = "xerrorbars";
-            endswitch
-            withclause{data_idx} = sprintf ("with %s linestyle %d",
-                                            errbars, sidx(1));
-          endif
+          obj.displayname = get (obj.parent, "displayname");
         endif
 
-      case "patch"
         [nr, nc] = size (obj.xdata);
 
         if (! isempty (obj.cdata))
@@ -1183,13 +1196,22 @@
 
       case "surface"
         view_map = true;
-        if (isempty (obj.displayname))
-          tspec = "title \"\"";
-        else
+        tspec = 'title ""';
+        if (! isempty (obj.displayname))
+          ## Place phantom line data for approximate legend symbol
+          data_idx += 1;
+          is_image_data(data_idx) = false;
+          parametric(data_idx) = false;
+          have_cdata(data_idx) = false;
+          have_3d_patch(data_idx) = false;
           tmp = undo_string_escapes (
                   __maybe_munge_text__ (enhanced, obj, "displayname")
                 );
-          tspec = ['title "' tmp '"'];
+          titlespec{data_idx} = ['title "' tmp '"'];
+          data{data_idx} = nan (3,1);
+          usingclause{data_idx} = sprintf ("record=1 using ($1):($2):($3)");
+          withclause{data_idx} = sprintf ("with line linewidth 10 linecolor rgb \"#%02x%02x%02x\"",
+                                          round (255*cmap(end/2,:)));
         endif
 
         xdat = obj.xdata;
@@ -1981,16 +2003,13 @@
   endif
   if (! isempty(pt) && isfield (obj, "markeredgecolor")
       && ! strcmp (obj.markeredgecolor, "none"))
-    if (facesame && ! isempty (pt)
-        && (strcmp (obj.markeredgecolor, "auto")
-            || (isnumeric (obj.markeredgecolor)
-                && isequal (color, obj.markeredgecolor))))
+    if (facesame && (strcmp (obj.markeredgecolor, "auto")
+        || (isnumeric (obj.markeredgecolor)
+            && isequal (color, obj.markeredgecolor))))
       if (sidx == 1 && ((length (style{sidx}) == 5
           && strncmp (style{sidx}, "lines", 5)) || isempty (style{sidx})))
-        if (! isempty (pt))
-          style{sidx} = [style{sidx} "points"];
-          fprintf (plot_stream, " pointtype %s", pt);
-        endif
+        style{sidx} = [style{sidx} "points"];
+        fprintf (plot_stream, " pointtype %s", pt);
         if (isfield (obj, "markersize"))
           fprintf (plot_stream, " pointsize %f", obj.markersize / 3);
         endif
@@ -2019,11 +2038,9 @@
       else
         fprintf (plot_stream, " palette");
       endif
-      if (! isempty (pt))
-        style{sidx} = "points";
-        ltidx(sidx) = idx;
-        fprintf (plot_stream, " pointtype %s", pt);
-      endif
+      style{sidx} = "points";
+      ltidx(sidx) = idx;
+      fprintf (plot_stream, " pointtype %s", pt);
       if (isfield (obj, "markersize"))
         fprintf (plot_stream, " pointsize %f", obj.markersize / 3);
       endif