From bug-octave-request@bevo.che.wisc.edu  Fri May 12 21:01:47 2000
Received: (from slist@localhost)
	by bevo.che.wisc.edu (8.9.1/8.9.1) id VAA28592;
	Fri, 12 May 2000 21:01:47 -0500 (CDT)
Resent-Date: Fri, 12 May 2000 21:01:47 -0500 (CDT)
Message-Id: <m12qGvt-000H4YC@kienzle>
Date: Fri, 12 May 2000 16:00:53 +0100 (BST)
From: pkienzle@kienzle.powernet.co.uk (Paul Kienzle)
To: bug-octave@bevo.che.wisc.edu, pkienzle@kienzle.powernet.co.uk
Subject:  axis doesn't handle string opts
Resent-Message-ID: <"P3IiBBEIGmN.A.qZF.LeLH5"@bevo.che.wisc.edu>
Resent-From: bug-octave@bevo.che.wisc.edu
X-Mailing-List: <bug-octave@bevo.che.wisc.edu> 
X-Loop: bug-octave@bevo.che.wisc.edu
Precedence: list
Resent-Sender: bug-octave-request@bevo.che.wisc.edu
Sender: bug-octave-request@bevo.che.wisc.edu
Errors-To: bug-octave-request@bevo.che.wisc.edu

To: bug-octave@bevo.che.wisc.edu
Cc: pkienzle
Subject: axis doesn't handle string opts

Bug report for Octave 2.0.13 configured for i386-pc-linux-gnu

Description:
-----------

The axis() script doesn't handle the string options available in Matlab.
  'on'|'off' controls tic marks
  'auto[xyz]'|'manual'|'tight' controls scaling
  'ij'|'xy' controls y-axis direction
  'square'|'equal'|'normal' controls aspect ratio
  'image' is just 'tight' and 'equal'

Repeat-By:
---------


Fix:
---

Patch to add the above controls (with gnuplot support), plus:
  'tic[xyz]' controls tic marks for individual axes
  'label[xyz]'|'nolabel' controls tic labels for individual axes


*** axis.m-2.1.28	Wed May  3 21:57:36 2000
--- axis.m	Fri May 12 15:56:40 2000
***************
*** 26,55 ****
  ## 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.
  ## @end deftypefn
  
  ## Author: jwe
  
! 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
  
    if (nargin == 0)
      gset autoscale;
      curr_axis = __current_axis__;
    elseif (is_vector (ax))
  
      len = length (ax);
--- 26,209 ----
  ## axis.  The third and fourth specify the limits for the y axis, and the
  ## fifth and sixth specify the limits for the z axis.
  ##
  ## 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.
+ ##
+ ## @deftypefnx {Function File} {} axis
+ ## Turns autoscaling on.
+ ##
+ ## @deftypefnx {Function File} {} axis (..., @code{"square"|"equal"|"normal"})
+ ## @table @code
+ ## @item "square"
+ ##    forces a square aspect ratio
+ ## @item "equal"
+ ##    forces x distance to equal y-distance
+ ## @item "normal"
+ ##    restores the balance
+ ## @end table
+ ##
+ ## @deftypefnx {Function File} {} axis (..., @code{"auto[xyz]"|"manual"|"tight"})
+ ## @table @code
+ ## @item "auto" 
+ ##    sets the specified axes to have nice limits around the data
+ ##    or all if no axes are specified
+ ## @item "manual" 
+ ##    fixes the current axes limits
+ ## @item "tight"
+ ##    fix axes to the limits of the data (not implemented)
+ ## @end table
+ ##         
+ ## @deftypefnx {Function File} {} axis (..., @code{"on"|"off"|"tic[xyz]"|"label[xyz]"|"nolabel"})
+ ## @table @code
+ ## @item "on" 
+ ##    turns tic marks and labels on for all axes
+ ## @item "off"
+ ##    turns tic marks off for all axes
+ ## @item "tic[xyz]"
+ ##    turns tic marks on for all axes, or turns them on for the
+ ##    specified axes and turns them off the remainder
+ ## @item "label[xyz]"
+ ##    turns tic labels on for all axes, or turns them on for the 
+ ##    specified axes and turns them off for the remainder
+ ## @item "nolabel"
+ ##    turns tic labels off for all axes.
+ ## @end table
+ ## Note, if there are no tic marks for an axis, there can be no labels.
+ ##
+ ## @deftypefnx {Function File} {} axis (..., @code{"ij"|"xy"})
+ ## @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
+ ##
+ ## @deftypefnx {Function File} {} axis (..., @code{"image"})
+ ##    Equivalent to @code{"tight"} and @code{"equal"}.
  ## @end deftypefn
  
  ## Author: jwe
  
! 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];
  
!   ## 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,79 ****
--- 230,317 ----
      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.

Configuration (please do not edit this section):
-----------------------------------------------

uname output:     Linux kienzle 2.0.34 #3 Fri Oct 9 23:37:16 BST 1998 i586 unknown
configure opts:   --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --with-g77 --enable-dl --enable-shared --enable-lite-kernel --host i386-linux
Fortran compiler: g77
FFLAGS:           -O2 -fomit-frame-pointer
F2C:              
F2CFLAGS:         
FLIBS:            -L/usr/lib/gcc-lib/i486-linux/egcs-2.90.29 -lf2c -lm
CPPFLAGS:         
INCFLAGS:         -I/usr/include -I/usr/include/octave-2.0.13
C compiler:       egcc, version 2.7.2.3
CFLAGS:           -DHAVE_CONFIG_H -mieee-fp -O2 -fomit-frame-pointer
CPICFLAG:         -fPIC
C++ compiler:     c++, version 2.90.29 980515 (egcs-1.0.3 release)
CXXFLAGS:         -DHAVE_CONFIG_H -mieee-fp -fno-rtti -fno-exceptions -fno-implicit-templates -O2 -fomit-frame-pointer
CXXPICFLAG:       -fPIC
LDFLAGS:          -s
LIBFLAGS:         -L/usr/lib/octave-2.0.13
RLD_FLAG:         -Xlinker -rpath -Xlinker /usr/lib/octave-2.0.13
TERMLIBS:         -lncurses
LIBS:             
LEXLIB:           
LIBPLPLOT:        
LIBDLFCN:         
DEFS:

  -DOCTAVE_SOURCE=1 -DSEPCHAR=':' -DSEPCHAR_STR=":" -DUSE_READLINE=1
  -DCXX_NEW_FRIEND_TEMPLATE_DECL=1 -DF77_APPEND_UNDERSCORE=1 -DOCTAVE_LITE=1
  -DSIZEOF_SHORT=2 -DSIZEOF_INT=4 -DSIZEOF_LONG=4 -DHAVE_ALLOCA_H=1
  -DHAVE_ALLOCA=1 -DNPOS=string::npos -DSTDC_HEADERS=1 -DHAVE_DIRENT_H=1
  -DTIME_WITH_SYS_TIME=1 -DHAVE_SYS_WAIT_H=1 -DHAVE_ASSERT_H=1
  -DHAVE_CURSES_H=1 -DHAVE_DLFCN_H=1 -DHAVE_FCNTL_H=1 -DHAVE_FLOAT_H=1
  -DHAVE_FNMATCH_H=1 -DHAVE_GLOB_H=1 -DHAVE_GRP_H=1 -DHAVE_LIMITS_H=1
  -DHAVE_MEMORY_H=1 -DHAVE_NAN_H=1 -DHAVE_NCURSES_H=1 -DHAVE_PWD_H=1
  -DHAVE_SGTTY_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_SYS_PARAM_H=1
  -DHAVE_SYS_RESOURCE_H=1 -DHAVE_SYS_SELECT_H=1 -DHAVE_SYS_STAT_H=1
  -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_TIMES_H=1 -DHAVE_SYS_TYPES_H=1
  -DHAVE_SYS_UTSNAME_H=1 -DHAVE_TERMCAP_H=1 -DHAVE_TERMIO_H=1
  -DHAVE_TERMIOS_H=1 -DHAVE_UNISTD_H=1 -DHAVE_VARARGS_H=1 -DHAVE_FNMATCH=1
  -DHAVE_GLOB=1 -DHAVE_ATEXIT=1 -DHAVE_BCOPY=1 -DHAVE_BZERO=1
  -DHAVE_DUP2=1 -DHAVE_ENDGRENT=1 -DHAVE_ENDPWENT=1 -DHAVE_EXECVP=1
  -DHAVE_FCNTL=1 -DHAVE_FORK=1 -DHAVE_GETCWD=1 -DHAVE_GETEGID=1
  -DHAVE_GETEUID=1 -DHAVE_GETGID=1 -DHAVE_GETGRENT=1 -DHAVE_GETGRGID=1
  -DHAVE_GETGRNAM=1 -DHAVE_GETHOSTNAME=1 -DHAVE_GETPGRP=1 -DHAVE_GETPID=1
  -DHAVE_GETPPID=1 -DHAVE_GETPWENT=1 -DHAVE_GETPWNAM=1 -DHAVE_GETPWUID=1
  -DHAVE_GETTIMEOFDAY=1 -DHAVE_GETUID=1 -DHAVE_GETWD=1 -DHAVE_LSTAT=1
  -DHAVE_MEMMOVE=1 -DHAVE_MKDIR=1 -DHAVE_MKFIFO=1 -DHAVE_ON_EXIT=1
  -DHAVE_PIPE=1 -DHAVE_PUTENV=1 -DHAVE_RENAME=1 -DHAVE_RINDEX=1
  -DHAVE_RMDIR=1 -DHAVE_SETGRENT=1 -DHAVE_SETPWENT=1 -DHAVE_SETVBUF=1
  -DHAVE_SIGACTION=1 -DHAVE_SIGPENDING=1 -DHAVE_SIGPROCMASK=1
  -DHAVE_SIGSUSPEND=1 -DHAVE_STAT=1 -DHAVE_STRCASECMP=1 -DHAVE_STRDUP=1
  -DHAVE_STRERROR=1 -DHAVE_STRNCASECMP=1 -DHAVE_TEMPNAM=1 -DHAVE_UMASK=1
  -DHAVE_UNLINK=1 -DHAVE_USLEEP=1 -DHAVE_VFPRINTF=1 -DHAVE_VSPRINTF=1
  -DHAVE_WAITPID=1 -DSMART_PUTENV=1 -DHAVE_PROGRAM_INVOCATION_NAME=1
  -DHAVE_LIBDL=1 -DHAVE_DLOPEN=1 -DHAVE_DLSYM=1 -DHAVE_DLERROR=1
  -DHAVE_DLCLOSE=1 -DWITH_DL=1 -DWITH_DYNAMIC_LINKING=1 -DHAVE_LIBM=1
  -DHAVE_FINITE=1 -DHAVE_ISNAN=1 -DHAVE_ISINF=1 -DHAVE_ACOSH=1
  -DHAVE_ASINH=1 -DHAVE_ATANH=1 -DHAVE_ERF=1 -DHAVE_ERFC=1
  -DHAVE_ST_BLKSIZE=1 -DHAVE_ST_BLOCKS=1 -DHAVE_ST_RDEV=1 -DHAVE_TM_ZONE=1
  -DHAVE_GR_PASSWD=1 -DEXCEPTION_IN_MATH=1 -DRETSIGTYPE=void
  -DSYS_SIGLIST_DECLARED=1 -DHAVE_SYS_SIGLIST=1 -DHAVE_POSIX_SIGNALS=1
  -DHAVE_GETRUSAGE=1 -DHAVE_TIMES=1 -DGNUPLOT_HAS_MULTIPLOT=1
  -DGNUPLOT_HAS_FRAMES=1

User-preferences (please do not edit this section):
--------------------------------------------------

  EDITOR = "vi"
  EXEC_PATH = "/home/pkienzle/octave/audio::/scratch/programs/audio/package/pipewave.1.3/bin:/scratch/programs/audio/pitch/POWERpv1.1G/bin:/home/pkienzle/pantome/bin:/home/pkienzle/sfs/bin:/scratch/usr/bin:/home/pkienzle/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/usr/games"
  IMAGEPATH = ".:/usr/share/octave/2.0.13/imagelib//"
  INFO_FILE = "/usr/info/octave.info"
  INFO_PROGRAM = "info"
  LOADPATH = "/home/pkienzle/octave//:/usr/local/share/octave/site-m//:"
  PAGER = "less"
  PS1 = "\\s:\\#> "
  PS2 = "> "
  PS4 = "+ "
  auto_unload_dot_oct_files = 1
  automatic_replot = 0
  beep_on_error = 0
  completion_append_char = " "
  default_eval_print_flag = 1
# default_global_variable_value = <no value or error in displaying it>
  default_return_value = []
  default_save_format = "ascii"
  define_all_return_values = 0
  do_fortran_indexing = 0
  echo_executing_commands = 0
  empty_list_elements_ok = "warn"
  fixed_point_format = 0
  gnuplot_binary = "gnuplot"
  gnuplot_has_frames = 1
  gnuplot_has_multiplot = 1
  history_file = "/home/pkienzle/.octave_hist"
  history_size = 1024
  ignore_function_time_stamp = "system"
  implicit_num_to_str_ok = 0
  implicit_str_to_num_ok = 0
  initialize_global_variables = 0
  max_recursion_depth = 256
  ok_to_lose_imaginary_part = "warn"
  output_max_field_width = 10
  output_precision = 5
  page_output_immediately = 0
  page_screen_output = 1
  prefer_column_vectors = 1
  prefer_zero_one_indexing = 0
  print_answer_id_name = 1
  print_empty_dimensions = 1
  propagate_empty_matrices = 1
  resize_on_range_error = 1
  return_last_computed_value = 0
  save_precision = 15
  saving_history = 1
  silent_functions = 0
  split_long_rows = 1
  string_fill_char = " "
  struct_levels_to_print = 2
  suppress_verbose_help_message = 1
  treat_neg_dim_as_zero = 0
  warn_assign_as_truth_value = 1
  warn_comma_in_global_decl = 1
  warn_divide_by_zero = 1
  warn_function_name_clash = 1
  warn_missing_semicolon = 0
  warn_reload_forces_clear = 1
  warn_variable_switch_label = 0
  whitespace_in_literal_matrix = 



-----------------------------------------------------------------------
Octave is freely available under the terms of the GNU GPL.

Octave's home on the web:  http://www.che.wisc.edu/octave/octave.html
How to fund new projects:  http://www.che.wisc.edu/octave/funding.html
Subscription information:  http://www.che.wisc.edu/octave/archive.html
-----------------------------------------------------------------------

