Mercurial > hg > ltpda
diff m-toolbox/classes/@ao/iplotyy.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/classes/@ao/iplotyy.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,361 @@ +% IPLOT provides an intelligent plotting tool for LTPDA. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: IPLOT provides an intelligent plotting tool for LTPDA. +% +% CALL: hfig = iplotyy (a1,a2,pl) +% [hfig, hax] = iplotyy (a1,a2,pl) +% [hfig, hax, hli] = iplotyy (a1,a2,pl) +% +% INPUTS: pl - a parameter list +% a1 - input analysis object for left y-axis +% a2 - input analysis object for right y-axis +% +% NOTE: the two input AOs must be the same data type. +% +% OUTPUTS: hfig - handles to figures +% hax - handles to axes +% hli - handles to lines +% +% <a href="matlab:utils.helper.displayMethodInfo('ao', 'iplotyy')">Parameters Description</a> +% +% VERSION: $Id: iplotyy.m,v 1.14 2011/04/08 08:56:15 hewitson Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function varargout = iplotyy(varargin) + + import utils.const.* + + %% Check if this is a call for parameters + if utils.helper.isinfocall(varargin{:}) + varargout{1} = getInfo(varargin{3}); + return + end + + utils.helper.msg(msg.PROC3, 'running %s/%s', mfilename('class'), mfilename); + + % Collect input variable names + in_names = cell(size(varargin)); + for ii = 1:nargin,in_names{ii} = inputname(ii);end + + % Check inputs + if nargin ~= 2 && nargin ~= 3 + error('### Incorrect inputs'); + end + + % Collect arrays + if nargin >= 2 + a1 = varargin{1}; + a2 = varargin{2}; + end + if ~isa(a1, 'ao') || ~isa(a2, 'ao') + error('### Please input two AOs followed by plists'); + end + + % Collect plists + if nargin >= 3 + pl = parse(varargin{3:end}, getDefaultPlist); + else + pl = getDefaultPlist; + end + + % Check size of input arrays + if numel(a1) ~= numel(a2) || numel(a1) ~= 1 + error('### Input two AOs.'); + end + + % get data type of a1 + dtype1 = class(a1.data); + % get data type of a2 + dtype2 = class(a2.data); + % check two arrays + if ~strcmp(dtype1, dtype2) + error('### The two input AOs should contain the same data type.'); + end + + dtype = dtype1; + + %% Now plot all the objects on separate figures + + switch dtype + case 'fsdata' + [hfig, hax, hli] = xy_plot(a1,a2,pl); + case 'tsdata' + [hfig, hax, hli] = xy_plot(a1,a2,pl); + case 'cdata' + error('### Currently unsupported'); + case 'xydata' + [hfig, hax, hli] = xy_plot(a1,a2,pl); + otherwise + error('### Unsupported data type: %s', dtype); + end + + %% Deal with outputs + if nargout == 1 + varargout{1} = hfig; + end + if nargout == 2 + varargout{1} = hfig; + varargout{2} = hax; + end + if nargout == 3 + varargout{1} = hfig; + varargout{2} = hax; + varargout{3} = hli; + end + + if nargout > 3 + error('### Incorrect number of outputs'); + end + +end + +%-------------------------------------------------------------------------- +% XY plot +%-------------------------------------------------------------------------- +function [hf, ha, hl] = xy_plot(a1,a2,pl) + + switch class(a1.data) + case 'fsdata' + pl = parse(pl, getDefaultPlist('Frequency-series plot')); + XLabelString = 'Frequency'; + x1 = a1.data.getX; + y1 = a1.data.getY; + x2 = a2.data.getX; + y2 = a2.data.getY; + % Title string + titleString = ''; + case 'tsdata' + pl = parse(pl, getDefaultPlist('Time-series plot')); + XLabelString = 'Time'; + % Collect T0s + T0(1) = inf; + if a1.data.t0.utc_epoch_milli/1000 < T0(1) + T0(1) = floor(a1.data.t0.utc_epoch_milli/1000); + end + T0(2) = inf; + if a2.data.t0.utc_epoch_milli/1000 < T0(2) + T0(2) = floor(a2.data.t0.utc_epoch_milli/1000); + end + + % deal with time-offsets + toff(1) = a1.data.t0.utc_epoch_milli/1000 - T0(1); + toff(2) = a2.data.t0.utc_epoch_milli/1000 - T0(1); + torigin(1) = time(T0(1)); + torigin(2) = time(T0(2)); + % need t0 offset for this time-series + x1 = a1.data.getX + toff(1); + y1 = a1.data.getY; + x2 = a2.data.getX + toff(2); + y2 = a2.data.getY; + % Title string + titleString = sprintf('Time origin: %s', char(torigin(1))); + case 'xydata' + pl = parse(pl, getDefaultPlist('X-Y plot')); + XLabelString = 'X'; + x1 = a1.data.getX; + y1 = a1.data.getY; + x2 = a2.data.getX; + y2 = a2.data.getY; + % Title string + titleString = ''; + end + + % Parameters + colL = find(pl, 'LeftColor'); + colR = find(pl, 'RightColor'); + styleL = find(pl, 'LeftLineStyle'); + styleR = find(pl, 'RightLineStyle'); + yscaleL = find(pl, 'LeftYScale'); + xscaleL = find(pl, 'LeftXScale'); + yscaleR = find(pl, 'RightYScale'); + xscaleR = find(pl, 'RightXScale'); + + pltfcn = 'plot'; + if strcmp(xscaleL, 'log') && strcmp(xscaleR, 'log') && ... + strcmp(yscaleL, 'log') && strcmp(yscaleR, 'log') + pltfcn = 'loglog'; + end + if strcmp(xscaleL, 'lin') && strcmp(xscaleR, 'lin') && ... + strcmp(yscaleL, 'log') && strcmp(yscaleR, 'log') + pltfcn = 'semilogy'; + end + if strcmp(xscaleL, 'log') && strcmp(xscaleR, 'log') && ... + strcmp(yscaleL, 'lin') && strcmp(yscaleR, 'lin') + pltfcn = 'semilogx'; + end + + % Make a new figure + hf = figure; + + % Plot + [ha,H1,H2] = plotyy(x1,y1,x2,y2,pltfcn); + hl = [H1 H2]; + % Set grid + grid(ha(1), 'on'); + grid(ha(2), 'on'); + + % Line color + set(H1, 'Color', colL); + set(H2, 'Color', colR); + % Line style + set(H1, 'LineStyle', styleL); + set(H2, 'LineStyle', styleR); + % Axis color + set(ha(1), 'XColor', 'k', 'YColor', colL); + set(ha(2), 'XColor', 'k', 'YColor', colR); + % Axis scales + set(ha(1), 'YScale', yscaleL); + set(ha(1), 'XScale', xscaleL); + set(ha(2), 'YScale', yscaleR); + set(ha(2), 'XScale', xscaleR); + + % Set y label 1 + ylabel(ha(2), [fixlabel(utils.plottools.label(a2.name)) ... + ' ' ... + fixlabel(char(a1.data.yunits)) ... + ]); + % Set y label 2 + ylabel(ha(1), [fixlabel(utils.plottools.label(a1.name)) ... + ' ' ... + fixlabel(char(a2.data.yunits))... + ]); + % Set x label + xlabel(ha(1), [XLabelString ' ' char(a1.data.xunits)]); + + % Print title + title(titleString); + +end % End fs_plot + + +%-------------------------------------------------------------------------- +% Get Info Object +%-------------------------------------------------------------------------- +function ii = getInfo(varargin) + if nargin == 1 && strcmpi(varargin{1}, 'None') + sets = {}; + pl = []; + elseif nargin == 1&& ~isempty(varargin{1}) && ischar(varargin{1}) + sets{1} = varargin{1}; + pl = getDefaultPlist(sets{1}); + else + sets = {'Time-series Plot', 'Frequency-series Plot', 'Y Plot', 'X-Y Plot', '3D Plot'}; + % get plists + pl(size(sets)) = plist; + for k = 1:numel(sets) + pl(k) = getDefaultPlist(sets{k}); + end + end + % Build info object + ii = minfo(mfilename, 'ao', 'ltpda', utils.const.categories.output, '$Id: iplotyy.m,v 1.14 2011/04/08 08:56:15 hewitson Exp $', sets, pl); + ii.setModifier(false); + ii.setArgsmin(2); + ii.setOutmin(0); +end + +%-------------------------------------------------------------------------- +% Get Default Plist +%-------------------------------------------------------------------------- +function plout = getDefaultPlist(set) + persistent pl; + persistent lastset; + if exist('pl', 'var')==0 || isempty(pl) || ~strcmp(lastset, set) + pl = buildplist(set); + lastset = set; + end + plout = pl; +end + +function out = buildplist(varargin) + + set = ''; + if nargin == 1 + set = varargin{1}; + end + + % Get the LTPDA color set for lines + colors = getappdata(0,'ltpda_default_plot_colors'); + + out = plist(... + 'LeftColor', colors{1}, ... + 'RightColor', colors{2}, ... + 'LeftLineStyle', '-', ... + 'RightLineStyle', '-'); + + switch lower(set) + case 'frequency-series plot' + out.append(... + 'LeftYScale', 'log', ... + 'RightYScale', 'log', ... + 'LeftXScale', 'log', ... + 'RightXScale', 'log'); + case 'time-series plot' + out.append(... + 'LeftYScale', 'lin', ... + 'RightYScale', 'lin', ... + 'LeftXScale', 'lin', ... + 'RightXScale', 'lin'); + case 'x-y plot' + out.append(... + 'LeftYScale', 'lin', ... + 'RightYScale', 'lin', ... + 'LeftXScale', 'lin', ... + 'RightXScale', 'lin'); + case '3d plot' + case 'y plot' + otherwise + error('### Unknown set [%s]', set); + end +end + + +% Perform some substitutions on the labels +function ss = fixlabel(ss) + + wasCell = true; + if ~iscell(ss) + ss = {ss}; + wasCell = false; + end + + for kk=1:numel(ss) + s = ss{kk}; + + % Replace all ^(...) with ^{...} + j = 1; + while j<numel(s) + if strcmp(s(j:j+1), '^(') + % find next ) + for k=1:numel(s)-j+1 + if s(j+k) == ')' + s(j+1) = '{'; + s(j+k) = '}'; + break; + end + end + end + j = j + 1; + end + % Replace all .^ with ^ + s = strrep(s, '.^', '^'); + + % reduce size + if length(s) > 25 + addStr = '...'; + else + addStr = ''; + end + ssize = min(25, length(s)); + s = [s(1:ssize) addStr]; + + ss(kk) = {s}; + end + + + if ~wasCell + ss = ss{1}; + end + +end