# HG changeset patch # User dbateman # Date 1196118820 0 # Node ID 97d2da8ed7462b117fcc7f166e560ab895d6df3d # Parent a927a2871a9302ea0dee9371e0c47e99261c7ac3 [project @ 2007-11-26 23:13:40 by dbateman] diff --git a/scripts/plot/Makefile.in b/scripts/plot/Makefile.in --- a/scripts/plot/Makefile.in +++ b/scripts/plot/Makefile.in @@ -111,6 +111,7 @@ peaks.m \ pie.m \ plot.m \ + plotyy.m \ plot3.m \ plotyy.m \ polar.m \ diff --git a/scripts/plot/plotyy.m b/scripts/plot/plotyy.m new file mode 100644 --- /dev/null +++ b/scripts/plot/plotyy.m @@ -0,0 +1,118 @@ +## Copyright (C) 2007 David Bateman +## +## This file is part of Octave. +## +## Octave is free software; you can redistribute it and/or modify it +## under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 3 of the License, or (at +## your option) any later version. +## +## Octave 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 Octave; see the file COPYING. If not, see +## . + +## -*- texinfo -*- +## @deftypefn {Function File} {} plotyy (@var{x1}, @var{y1}, @var{x2}, @var{y2}) +## @deftypefnx {Function File} {} plotyy (@dots{}, @var{fun}) +## @deftypefnx {Function File} {} plotyy (@dots{}, @var{fun1}, @var{fun2}) +## @deftypefnx {Function File} {} plotyy (@var{h}, @dots{}) +## @deftypefnx {Function File} {[@var{ax}, @var{h1}, @var{h2}] =} plotyy (@dots{}) +## Plots two sets of data with independent y-axes. The arguments @var{x1} and +## @var{y1} define the arguments for the first plot and @var{x1} and @var{y2} +## for the second. +## +## By default the arguments are evaluated with +## @code{feval (@@plot, @var{x}, @var{y})}. However the type of plot can be +## modified with the @var{fun} argument, in which case the plots are +## generated by @code{feval (@var{fun}, @var{x}, @var{y})}. @var{fun} can be +## a function handle, an inline function or a string of a function name. +## +## The function to use for each of the plots can be independently defined +## with @var{fun1} and @var{fun2}. +## +## If given, @var{h} defines the principal axis in which to plot the @var{x1} +## and @var{y1} data. The return value @var{ax} is a two element vector with +## the axis handles of the two plots. @var{h1} and @var{h2} are handles to +## the objects generated by the plot commands. +## +## @example +## @group +## x = 0:0.1:2*pi; +## y1 = sin (x); +## y2 = exp(x - 1); +## ax = plotyy(x, y1, x - 1, y2, @@plot, @@semilogy); +## xlabel ("X"); +## ylabel (ax(1), "Axis 1"); +## ylabel (ax(2), "Axis 2"); +## @end group +## @end example +## @end deftypefn + +function [Ax, H1, H2] = plotyy (varargin) + + if (isscalar (varargin{1}) && ishandle (varargin{1})) + ax = varargin {1}; + if (! strcmp (get (ax, "type"), "axes")) + error ("plotyy: expecting first argument to be an axes object"); + endif + if (nargin < 5) + print_usage(); + endif + oldh = gca (); + unwind_protect + axes (ax); + newplot (); + [ax, h1, h2] = __plotyy__ (ax, varargin{2:end}); + unwind_protect_cleanup + axes (oldh); + end_unwind_protect + else + if (nargin < 4) + print_usage(); + endif + newplot (); + [ax, h1, h2] = __plotyy__ (gca (), varargin{:}); + endif + + if (nargout > 0) + Ax = ax; + H1 = h1; + H2 = h2; + endif +endfunction + +function [ax, h1, h2] = __plotyy__ (ax, x1, y1, x2, y2, varargin) + if (nargin > 5) + fun1 = varargin{1}; + else + fun1 = @plot; + endif + if (nargin > 6) + fun2 = varargin{2}; + else + fun2 = fun1; + endif + + xlim = [min([x1(:); x2(:)]), max([x1(:); x2(:)])]; + + h1 = feval (fun1, x1, y1); + set (ax(1), "ycolor", get (h1, "color")); + set (ax(1), "position", get (ax(1), "outerposition")); + set (ax(1), "xlim", xlim); + + cf = gcf (); + set (cf, "nextplot", "add"); + ax(2) = axes ("position", get (ax(1), "position")); + colors = get (ax(1), "colororder"); + set (ax(2), "colororder", [colors(2:end,:); colors(1,:)]); + + h2 = feval (fun2, x2, y2); + set (ax(2), "ycolor", get (h2, "color")); + set (ax(2), "xlim", xlim); + set (ax(2), "yaxislocation", "right"); +endfunction