changeset 3667:f7f94396dd81

[project @ 2000-05-13 06:31:28 by jwe]
author jwe
date Sat, 13 May 2000 06:31:29 +0000
parents 301e0da5b455
children b0a68efa1295
files scripts/ChangeLog scripts/plot/axis.m scripts/strings/strrep.m
diffstat 3 files changed, 267 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/ChangeLog
+++ b/scripts/ChangeLog
@@ -5,6 +5,7 @@
 2000-05-13  Paul Kienzle <pkienzle@kienzle.powernet.co.uk>
 
 	* strings/strrep.m: Avoid for loop for speed.
+	* plot/axis.m: Handle string options for Matlab compatibility. 
 
 2000-04-04  John Smith <john@arrows.demon.co.uk>
 
--- a/scripts/plot/axis.m
+++ b/scripts/plot/axis.m
@@ -19,37 +19,210 @@
 
 ## -*- texinfo -*-
 ## @deftypefn {Function File} {} axis (@var{limits})
-## Sets the axis limits for plots.
+## Set axis limits for plots.
 ##
 ## The argument @var{limits} should be a 2, 4, or 6 element vector.  The
 ## first and second elements specify the lower and upper limits for the x
 ## axis.  The third and fourth specify the limits for the y axis, and the
 ## fifth and sixth specify the limits for the z axis.
 ##
-## With no arguments, @code{axis} turns autoscaling on.
-##
 ## If your plot is already drawn, then you need to use @code{replot} before
 ## the new axis limits will take effect.  You can get this to happen
 ## automatically by setting the built-in variable @code{automatic_replot}
 ## to a nonzero value.
+##
+## Without any arguments, @code{axis} turns autoscaling on.
+##
+## A second argument may be used to specify various formats.  For
+## example,
+##
+## @example
+## axis ([1, 2, 3, 4], "square");
+## @end example
+##
+## @noindent
+## forces a square aspect ratio.
+##
+## @noindent
+## The following options control the aspect ratio of the axes.
+##
+## @table @code
+## @item "square"
+## Force a square aspect ratio.
+## @item "equal"
+## Force x distance to equal y-distance.
+## @item "normal"
+## Restore the balance.
+## @end table
+##
+## @noindent
+## The following options control the way axis limits are interpreted.
+##
+## @table @code
+## @item "auto" 
+## Set the specified axes to have nice limits around the data
+## or all if no axes are specified.
+## @item "manual" 
+## Fix the current axes limits.
+## @item "tight"
+## Fix axes to the limits of the data (not implemented).
+## @end table
+##
+## @noindent
+## The option @code{"image"} is equivalent to @code{"tight"} and
+## @code{"equal"}.
+##
+## @noindent
+## The following options affect the appearance of tic marks.
+##
+## @table @code
+## @item "on" 
+## Turn tic marks and labels on for all axes.
+## @item "off"
+## Turn tic marks off for all axes.
+## @item "tic[xyz]"
+## Turn tic marks on for all axes, or turns them on for the
+## specified axes and turns them off the remainder.
+## @item "label[xyz]"
+## Turn tic labels on for all axes, or turns them on for the 
+## specified axes and turns them off for the remainder.
+## @item "nolabel"
+## Turn tic labels off for all axes.
+## @end table
+## Note, if there are no tic marks for an axis, there can be no labels.
+##
+## @noindent
+## The following options affect the direction of increasing values on
+## the axes.
+##
+## @table @code
+## @item "ij"
+## Reverse y-axis, so lower values are nearer the top.
+## @item "xy" 
+## Restore y-axis, so higher values are nearer the top. 
+## @end table
 ## @end deftypefn
 
 ## Author: jwe
 
-function curr_axis = axis (ax)
+function curr_axis = axis (ax, ...)
 
   ## This may not be correct if someone has used the gnuplot interface
   ## directly...
 
   global __current_axis__ = [-10, 10, -10, 10];
 
-  if (nargin > 1)
-    usage ("axis ([xmin, xmax, ymin, ymax, zmin, zmax])");
-  endif
+  ## To return curr_axis properly, octave needs to take control of scaling.
+  ## It isn't hard to compute good axis limits:
+  ##   scale = 10 ^ floor (log10 (max - min) - 1);
+  ##   r = scale * [floor (min / scale), ceil (max / scale)];
+  ## However, with axis("manual") there is little need to know the current
+  ## limits.
 
   if (nargin == 0)
     gset autoscale;
     curr_axis = __current_axis__;
+
+  elseif (isstr (ax))
+    ax = tolower (ax);
+
+    ## 'matrix mode' to reverse the y-axis
+    if (strcmp (ax, "ij"))
+      gset yrange [] reverse; 
+    elseif (strcmp (ax, "xy"))
+      gset yrange [] noreverse;
+
+      ## aspect ratio
+    elseif (strcmp (ax, "image"))
+      gset size ratio -1; 
+      gset autoscale; ## XXX FIXME XXX should be the same as "tight"
+    elseif (strcmp (ax, "equal"))
+      gset size ratio -1;
+    elseif (strcmp (ax, "square"))
+      gset size ratio 1;
+    elseif (strcmp (ax, "normal"))
+      gset size noratio;
+
+
+      ## axis limits
+    elseif (length (ax) >= 4 && strcmp (ax (1:4), "auto"))
+      if length (ax) > 4
+      	eval (["gset autoscale ", ax (5 : length (ax)), ";"]);
+      else
+	gset autoscale;
+      endif
+    elseif (strcmp (ax, "manual"))
+      ## fixes the axis limits, like axis(axis) should;
+      gset xrange [] writeback;
+      gset yrange [] writeback;
+      gset zrange [] writeback;
+      ## XXX FIXME XXX if writeback were set in plot, no need to replot here.
+      replot; 
+      gset noautoscale x;
+      gset noautoscale y;
+      gset noautoscale z;
+    elseif (strcmp (ax, "tight"))
+      ## XXX FIXME XXX if tight, plot must set ranges to limits of the
+      ## all the data on the current plot, even if from a previous call.
+      ## Instead, just let gnuplot do as it likes.
+      gset autoscale;
+
+
+      ## tic marks
+    elseif (strcmp (ax, "on"))
+      gset xtics;
+      gset ytics;
+      gset ztics;
+      gset format;
+    elseif (strcmp (ax, "off"))
+      gset noxtics;
+      gset noytics;
+      gset noztics;
+    elseif (strcmp (ax, "tic"))
+      gset xtics;
+      gset ytics;
+      gset ztics;
+    elseif (length (ax) > 3 && strcmp (ax (1:3), "tic"))
+      if any (ax == "x")
+	gset xtics;
+      else
+	gset noxtics;
+      endif
+      if any (ax == "y")
+	gset ytics;
+      else
+	gset noytics;
+      endif
+      if any (ax == "z")
+	gset ztics;
+      else
+	gset noztics;
+      endif
+    elseif (strcmp (ax, "label"))
+      gset format;
+    elseif (strcmp (ax, "nolabel"))
+      gset format "\\0";
+    elseif (length (ax) > 5 && strcmp (ax (1:5), "label"))
+      if any (ax == "x")
+	gset format x;
+      else
+	gset format x "\\0";
+      endif
+      if any (ax == "y")
+	gset format y;
+      else
+	gset format y "\\0";
+      endif
+      if any (ax == "z")
+	gset format z;
+      else
+	gset format z "\\0";
+      endif
+
+    else
+      warning (["unknown axis option '", ax, "'"]);
+    endif
+
   elseif (is_vector (ax))
 
     len = length (ax);
@@ -76,4 +249,88 @@
     error ("axis: expecting no args, or a vector with 2, 4, or 6 elements");
   endif
 
+  if (nargin > 1)
+    axis(all_va_args);
+  endif
 endfunction
+
+%!demo
+%! t=0:0.01:2*pi; x=sin(t);
+%!
+%! subplot(221);    title("normal plot");
+%! plot(t, x, ";;");
+%!
+%! subplot(222);    title("square plot");
+%! axis("square");  plot(t, x, ";;");
+%!
+%! subplot(223);    title("equal plot");
+%! axis("equal");   plot(t, x, ";;");
+%! 
+%! subplot(224);    title("normal plot again");
+%! axis("normal");  plot(t, x, ";;");
+
+%!demo
+%! t=0:0.01:2*pi; x=sin(t);
+%!
+%! subplot(121);   title("ij plot");
+%! axis("ij");     plot(t, x, ";;");
+%!
+%! subplot(122);   title("xy plot");
+%! axis("xy");     plot(t, x, ";;");
+
+%!demo
+%! t=0:0.01:2*pi; x=sin(t);
+%!
+%! subplot(331);   title("x tics & labels");
+%! axis("ticx");   plot(t, x, ";;");
+%!
+%! subplot(332);   title("y tics & labels");
+%! axis("ticy");   plot(t, x, ";;");
+%!
+%! subplot(334);     title("x & y tics, x labels");
+%! axis("labelx","tic");   plot(t, x, ";;");
+%!
+%! subplot(335);     title("x & y tics, y labels");
+%! axis("labely","tic");   plot(t, x, ";;");
+%!
+%! subplot(337);     title("x tics, no labels");
+%! axis("nolabel","ticx");   plot(t, x, ";;");
+%!
+%! subplot(338);     title("y tics, no labels");
+%! axis("nolabel","ticy");   plot(t, x, ";;");
+%!
+%! subplot(333);     title("no tics or labels");
+%! axis("off");    plot(t, x, ";;");
+%!
+%! subplot(336);     title("all tics but no labels");
+%! axis("nolabel","tic");    plot(t, x, ";;");
+%!
+%! subplot(339);     title("all tics & labels");
+%! axis("on");       plot(t, x, ";;");
+
+%!demo
+%! t=0:0.01:2*pi; x=sin(t);
+%!
+%! subplot(321);    title("axes at [0 3 0 1]")
+%! axis([0,3,0,1]); plot(t, x, ";;");
+%!
+%! subplot(322);    title("auto");
+%! axis("auto");    plot(t, x, ";;");
+%!
+%! subplot(323);    title("manual");
+%! plot(t, x, ";sine [0:2pi];"); hold on;
+%! axis("manual");
+%! plot(-3:3,-3:3, ";line (-3,-3)->(3,3);"); hold off;
+%!
+%! subplot(324);    title("axes at [0 3 0 1], then autox");
+%! axis([0,3,0,1]); axis("autox");
+%! plot(t, x, ";sine [0:2pi];");
+%!
+%! subplot(325);    title("axes at [3 6 0 1], then autoy");
+%! axis([3,6,0,1]); axis("autoy");
+%! plot(t, x, ";sine [0:2p];");
+%!
+%! subplot(326);    title("tight");
+%! axis("tight");   plot(t, x, ";;");
+%! % The last plot should not have any whitespace outside the data
+%! % limits, but "tight" isn't implemented yet.
--- a/scripts/strings/strrep.m
+++ b/scripts/strings/strrep.m
@@ -73,8 +73,8 @@
     ## search string was found.  Note that we must first update the
     ## target positions to account for any expansion or contraction
     ## of s that may have occurred.
-    ind = ind + jump * [ 0 : length (ind) - 1 ];
-    repeat = [1 : length (y)]' * ones (1, length (ind));
+    ind = ind + jump * [0:length(ind)-1];
+    repeat = [1:length(y))]' * ones (1, length (ind));
     dest = ones (length (y), 1) * ind + repeat - 1;
     t (dest) = y (repeat);
   else                        # deletion