diff main/plot/legend.m @ 0:6b33357c7561 octave-forge

Initial revision
author pkienzle
date Wed, 10 Oct 2001 19:54:49 +0000
parents
children 97f29109d9b9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main/plot/legend.m	Wed Oct 10 19:54:49 2001 +0000
@@ -0,0 +1,211 @@
+## Copyright (C) 2001 Laurent Mazet
+##
+## This program is free software; it is distributed in the hope that it
+## will be useful, but WITHOUT ANY WARRANTY; without even the implied
+## warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+## the GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this file; see the file COPYING.  If not, write to the
+## Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+## 02111-1307, USA.
+
+## usage: legend (string1, string2, string3, ..., [pos])
+##        legend ([string1; string2; string3; ...], [pos])
+##        legend ("off")
+##
+## Legend puts a legend on the current plot using the specified strings
+## as labels. Legend works on line graphs, bar graphs, etc...
+##
+## pos: places the legend in the specified location:
+##      0 = Don't move the legend box (default)
+##      1 = Upper right-hand corner
+##      2 = Upper left-hand corner
+##      3 = Lower left-hand corner
+##      4 = Lower right-hand corner
+##      -1 = To the right of the plot
+##
+## off will switch off legends from the plot
+##
+## REQUIRES: unix piping functionality, grep, sed and awk
+
+## 2001-03-31 Paul Kienzle
+##   * use tmpnam for temporary file name; unlink to remove
+
+function legend (...)
+
+  gset key;
+  
+  ## Data type
+
+  data_type = 0;
+  va_start();
+  str = "";
+  if (nargin > 0)
+    str = va_arg();
+  endif;
+      
+  ## Test for off
+
+  if ((isstr(str)) && (strcmp(tolower(deblank(str)),"off")) && (nargin == 1))
+    gset nokey;
+    replot;
+    return;
+  endif;
+
+  ## Test for data type (0 -> list of string, 1 -> array of string)
+  
+  if (length(str) != 0) && (isstr(str(1,:))) && (rows(str) != 1)
+    data_type = 1;
+    va_start();
+    data = va_arg();
+    nb_data = rows(data);
+    nargin--;
+  endif;
+
+  pos_leg = 0;
+  
+  ## Get the original plotting command
+  
+  tmpfilename=tmpnam;
+  command=["save \"",tmpfilename,"\"\n"];
+  graw(command);
+
+  awk_prog= \
+      "BEGIN { \
+        dq = 0; \
+        format = \"%s\\n\"; \
+       } \
+       NF != 0 { \
+        for (i=1;i<=NF;i++) { \
+         if ($(i) == \"\\\"\") { \
+          if (dp == 0) { \
+           dp = 1; \
+           if ($(i+1) != \"\\\"\") { \
+            i++; \
+            printf (\"%s\", $(i)); \
+           } \
+          format = \" %s\"; \
+          } else { \
+           dp = 0; \
+           format = \"%s\\n\"; \
+           printf (\"\\n\"); \
+          } \
+         } else { \
+          printf (format, $(i)); \
+         } \
+        } \
+       }";
+            
+  shell_cmd=["grep \"^pl \" " tmpfilename " | " \
+             "sed -e 's/,/ , /g' -e 's/\"/ \" /g'" " | " \
+             "awk '" awk_prog "'"];
+  plot_cmd = split(system(shell_cmd),"\n");
+  if (~length(deblank(plot_cmd(rows(plot_cmd), :))))
+    plot_cmd = plot_cmd ([1:rows(plot_cmd)-1],:);
+  endif;
+  unlink(tmpfilename);
+  
+  ## Look for the number of graph
+
+  nb_graph = 0;
+  i = 0;
+  while (i++ < rows(plot_cmd))
+    line = deblank(plot_cmd(i,:));
+    if ((strcmp(line, "pl")) || (strcmp(line, ",")))
+      nb_graph++;
+    endif;
+  endwhile;
+
+  ## Change the legend of each graph
+  
+  new_plot = [];
+  if (data_type == 0)
+    va_start();
+  endif;
+  fig = 0;
+  i = 1;
+  while (fig < nb_graph)
+
+    ## Get the legend string
+
+    if (((data_type == 0) && (nargin <= 0)) || \
+        ((data_type == 1) && (fig >= nb_data)))
+      leg = "\"\"";
+    else
+      if (data_type == 0)
+        leg = va_arg () ;
+        nargin--;
+      else
+        leg = data(fig+1,:);
+      endif;
+      if (!isstr(leg))
+        pos_leg = leg;
+        leg = "\"\"";
+      elseif (length(deblank(leg)) == 0)
+        leg = "\"\"";
+      else
+        leg=["\"" leg "\""];
+      endif;
+    endif;
+
+    ## look for the end of the graph command i.e. ","
+
+    new_line = [deblank(plot_cmd(i++,:)) " \"" deblank(plot_cmd(i++,:)) "\""];
+    while ((i <= rows(plot_cmd)) && (!strcmp(deblank(plot_cmd(i,:)), ",")))
+      if (strcmp(deblank(plot_cmd(i,:)), "t"))
+        new_line = [new_line " t " leg];
+        i++;
+      else
+        new_line = [new_line " " deblank(plot_cmd(i,:))];
+      endif;
+      i++;
+    endwhile;
+
+    if (length(new_plot))
+      new_plot = [ new_plot new_line];
+    else
+      new_plot = new_line;
+    endif;
+    
+    fig++;
+  endwhile;
+
+  ## Create a new ploting command
+
+  new_plot = [new_plot "\n"];  
+  graw(new_plot);
+
+  ## Check for the last argument if we don't already get it
+  
+  while (nargin-- > 0)
+    pos_leg = va_arg () ;
+    if (isstr(pos_leg))
+      pos_leg = 0;
+    endif;
+  endwhile;
+  
+  ## Change the legend position
+
+  if ((is_scalar (pos_leg)) && (isreal(pos_leg)))
+    switch (pos_leg)
+      case 1
+        gset key right top;
+      case 2
+        gset key left top;
+      case 3
+        gset key left bottom;
+      case 4
+        gset key right bottom;
+      case -1
+        gset key right top outside;
+    endswitch;
+  else
+    warning ("pos must be a scalar");
+  endif;
+
+  ## Regenerate the plot
+  
+  replot;
+  
+endfunction;