Mercurial > hg > ltpda
diff m-toolbox/test/new_plot/miplot.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/test/new_plot/miplot.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,1231 @@ +function varargout = miplot(varargin) +% MIPLOT provides an intelligent plotting tool for LTPDA. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: MIPLOT provides an intelligent plotting tool for LTPDA. +% +% CALL: h = plot (a,pl) +% +% INPUTS: pl - a parameter list +% a - input analysis object +% +% OUTPUTS: h - handles to plot objects +% +% Plot parameters: +% +% 'type' - one of the data class types +% 'tsdata' [default], 'fsdata', 'cdata', 'xydata', 'xyzdata'. +% +% 'Arrangement' - select the plot layout: +% 'single' - plots all AOs on individual figures +% 'stacked' - plots all AOs on the same axes [default] +% 'subplots' - plots all AOs on subplots +% +% Line parameters: +% +% The following properties take cell array values. If the length of +% the cell array is shorter than the number of lines to plot, the +% remaining lines will be plotted with the default options. +% +% 'Colors' - a cell array of color definitions which will be +% looped over for each line. +% +% 'LineStyles' - a cell array of line styles. +% +% 'Legends' - specify a cell array of strings to be used for +% the plot legends. If a cell contains an empty +% string, the default legend string is built. +% If a single string 'off' is given instead of a +% cell array, then the legends are all switched +% off. +% +% 'XLabels' - Specify the labels to be used on the x-axis. The +% units are added from the data object 'xunits' +% property. +% +% 'YLabels' - Specify the labels to be used on the y-axis. The +% units are added from the data object 'yunits' +% property. If the object contains complex data, +% you should specify two y-labels for that object. +% +% 'XScales' - Specify the scales to be used on the x-axes. +% +% 'YScales' - Specify the scales to the used on the y-axes. If +% an object contains complex data, you should +% specify two y-labels for that object. +% +% 'LineWidths' - an array of line widths. If the length of the +% array is shorter than the number of lines to +% plot, the remaining lines will be plotted with +% the default line width. +% +% +% +% +% +% VERSION: $Id: miplot.m,v 1.3 2008/02/07 19:51:53 hewitson Exp $ +% +% The following call returns a parameter list object that contains the +% default parameter values: +% +% >> pl = miplot(ao, 'Params') +% +% HISTORY: 22-12-07 M Hewitson +% Creation +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% TODO: +% 1) Add XRange, YRange, ZRange +% 2) Add/test math functions to all plots +% +% + +%% Check if this is a call for parameters + +VERSION = '$Id: miplot.m,v 1.3 2008/02/07 19:51:53 hewitson Exp $'; +bs = []; + +if nargin == 2 + if isa(varargin{1}, 'ao') && ischar(varargin{2}) + in = char(varargin{2}); + if strcmp(in, 'Params') + varargout{1} = getDefaultPL(); + return + elseif strcmp(in, 'Version') + varargout{1} = VERSION; + return + end + end +end + +%% Collect input ao's, plist's and ao variable names +in_names = {}; +for ii = 1:nargin + in_names{end+1} = inputname(ii); +end + +[as, upl, invars] = collect_inputs(varargin, in_names); + +%% Go through AOs and collect them into similar types + +tsAOs = []; +fsAOs = []; +xyAOs = []; +xyzAOs = []; +cAOs = []; + +for j=1:numel(as) + switch class(as(j).data) + case 'tsdata' + tsAOs = [tsAOs as(j)]; + case 'fsdata' + fsAOs = [fsAOs as(j)]; + case 'xydata' + xyAOs = [xyAOs as(j)]; + case 'xyzdata' + xyzAOs = [xyzAOs as(j)]; + case 'cdata' + cAOs = [cAOs as(j)]; + otherwise + warning('!!! Unknown data type %s', class(as(j).data)); + end +end + +%% Now plot all the objects on separate figures + +%----------- TSDATA + +% get default plist +dpl = getDefaultPlist('tsdata'); +% combine the plists +pl = combine(upl, dpl); +% Call x-y plot +[hfig, hax, hli] = xy_plot(tsAOs, pl); + +%----------- XYDATA + +% get default plist +dpl = getDefaultPlist('xydata'); +% combine the plists +pl = combine(upl, dpl); +% Call x-y plot +[hfig, hax, hli] = xy_plot(xyAOs, pl); + +%----------- XYZDATA + +% get default plist +dpl = getDefaultPlist('xyzdata'); +% combine the plists +pl = combine(upl, dpl); +% Call x-y-z plot +[hfig, hax, hli] = xyz_plot(xyzAOs, pl); + +%----------- CDATA + +% get default plist +dpl = getDefaultPlist('cdata'); +% combine the plists +pl = combine(upl, dpl); +% Call x-y plot +[hfig, hax, hli] = y_plot(cAOs, pl); + +%----------- FSDATA + +% get default plist +dpl = getDefaultPlist('fsdata'); +% combine the plists +pl = combine(upl, dpl); +% Call fsdata plot +[hfig, hax, hli] = fs_plot(fsAOs, pl); + + +%-------------------------------------------------------------------------- +% Plot fsdata objects +% +function varargout = fs_plot(varargin) + +aos = varargin{1}; +pl = varargin{2}; + +% Extract parameters +arrangement = find(pl, 'Arrangement'); +colors = find(pl, 'Colors'); +linestyles = find(pl, 'LineStyles'); +linewidths = find(pl, 'LineWidths'); +legends = find(pl, 'Legends'); +ylabels = find(pl, 'YLabels'); +xlabels = find(pl, 'XLabels'); +yscales = find(pl, 'YScales'); +xscales = find(pl, 'XScales'); +yranges = find(pl, 'YRanges'); +xranges = find(pl, 'XRanges'); +xmaths = find(pl, 'XMaths'); +ymaths = find(pl, 'YMaths'); +complexPlotType = find(pl, 'complexPlotType'); + +% check whether we want legends or not +if iscell(legends) + legendsOn = 1; +else + if strcmpi(legends, 'off') + legendsOn = 0; + else + legendsOn = 1; + legends = []; + end +end + +if ~iscell(linestyles), linestyles = {linestyles}; end +if ~iscell(legends), legends = {legends}; end +if ~iscell(ylabels), ylabels = {ylabels}; end +if ~iscell(xlabels), xlabels = {xlabels}; end +if ~iscell(xmaths), xmaths = {xmaths}; end +if ~iscell(ymaths), ymaths = {ymaths}; end +if ~iscell(xscales), xscales = {xscales}; end +if ~iscell(yscales), yscales = {yscales}; end +if ~iscell(xranges), xranges = {xranges}; end +if ~iscell(yranges), yranges = {yranges}; end + + +% collect figure handles +tsfig = []; +tsax = []; +tsli = []; + +% Legend holder +legendStr = []; + +if ~isempty(aos) + + % Now loop over AOs + Na = length(aos); + + % - first to check if any are complex + haveComplex = 0; + for j=1:Na + a = aos(j); + y = a.data.y; + ymath = ''; + if j<=length(ymaths) + if ~isempty(ymaths{j}) + eval(sprintf('y = %s;', ymaths{j})); + ymath = ymaths{j}; + end + end + xmath = ''; + if j<=length(xmaths) + if ~isempty(xmaths{j}) + eval(sprintf('x = %s;', xmaths{j})); + xmath = xmaths{j}; + end + end + if ~isreal(y) + haveComplex = 1; + end + end + + % Loop over the AOs now + for j=1:Na + + % set real and imag subplot handles to empty + tsax_r = []; + tsax_i = []; + + % Get this AO + a = aos(j); + + %------- Apply math functions + x = a.data.x; + y = a.data.y; + + ymath = ''; + if j<=length(ymaths) + if ~isempty(ymaths{j}) + eval(sprintf('y = %s;', ymaths{j})); + ymath = ymaths{j}; + end + end + xmath = ''; + if j<=length(xmaths) + if ~isempty(xmaths{j}) + eval(sprintf('x = %s;', xmaths{j})); + xmath = xmaths{j}; + end + end + + % what figures do we need? + switch arrangement + case 'single' + + tsfig = [tsfig figure]; + col = colors{1}; + % check if this data set is real or complex + if ~isreal(y) + % complex means we use two subplots + tsax_r = subplot(2,1,1); + tsax_i = subplot(2,1,2); + tsax = [tsax tsax_r tsax_i]; + else + % real means we use a single subplot + tsax_r = subplot(1, 1, 1); + tsax = [tsax tsax_r]; + end + + case 'stacked' + + if j==1, tsfig = figure; end + % if at least one of the input fsdata AOs is complex, we need to + % allow for subplots + if haveComplex + tsax_r = subplot(2,1,1); + tsax_i = subplot(2,1,2); + tsax = [tsax_r tsax_i]; + else + tsax_r = subplot(1, 1, 1); + tsax = tsax_r; + end + col = colors{mod(j-1,length(colors))+1}; + hold(tsax_r, 'on'); + if ishandle(tsax_i) + hold(tsax_i, 'on'); + end + case 'subplots' + + if j == 1, tsfig = figure; end + c = 1+(j-1)*2; + sx = Na; + sy = 2; + % Now we have one or two subplots per input object. + if ~isreal(y) + tsax_r = subplot(sx, sy,c); + tsax_i = subplot(sx, sy,c+1); + tsax = [tsax tsax_r tsax_i]; + else + tsax_r = subplot(sx, sy, c:c+1); + tsax = [tsax tsax_r]; + end + col = colors{1}; + + otherwise + error('### Unknown plot arrangement'); + end + + %------- Plot the data + + % plot real or complex data and setup default values for scale and + % labels as we go. + if isreal(y) + tsli = [tsli plot(tsax_r, x, y)]; + ylabelr = 'amplitude'; + ylabeli = 'imag'; + yscaleR = 'log'; + yscaleI = 'lin'; + xscaleR = 'log'; + xscaleI = 'lin'; + else + switch complexPlotType + case 'realimag' + tsli = [tsli plot(tsax_r, x, real(y))]; + tsli = [tsli plot(tsax_i, x, imag(y))]; + ylabelr = 'real'; + ylabeli = 'imag'; + yscaleR = 'lin'; + yscaleI = 'lin'; + xscaleR = 'lin'; + xscaleI = 'lin'; + case 'absdeg' + tsli = [tsli plot(tsax_r, x, abs(y))]; + tsli = [tsli plot(tsax_i, x, phase(y))]; + ylabelr = 'amplitude'; + ylabeli = 'Phase [deg]'; + yscaleR = 'log'; + yscaleI = 'lin'; + xscaleR = 'log'; + xscaleI = 'log'; + case 'absrad' + tsli = [tsli plot(tsax_r, x, abs(y))]; + tsli = [tsli plot(tsax_i, x, angle(y))]; + ylabelr = 'amplitude'; + ylabeli = 'phase [rad]'; + yscaleR = 'log'; + yscaleI = 'lin'; + xscaleR = 'log'; + xscaleI = 'log'; + otherwise + error('### Unknown plot type for complex data'); + end + end + + %------- Axis properties + + % Set ylabel + c = 1+(j-1)*2; + if c<=length(ylabels) + if ~isempty(ylabels{c}) + ylstrR = ylabels{c}; + else + ylstrR = ylabelr; + end + else + ylstrR = ylabelr; + end + if c<length(ylabels) + if ~isempty(ylabels{c+1}) + ylstrI = ylabels{c+1}; + else + ylstrI = ylabeli; + end + else + ylstrI = ylabeli; + end + if ~isempty(ymath) + ymath = strrep(ymath, 'y', sprintf('%s', a.data.yunits)); + ylstrR = [ylstrR ' [' ymath ']' ]; + else + ylstrR = [ylstrR ' [' a.data.yunits ']' ]; + end + ylabel(tsax_r, ylstrR); + if ishandle(tsax_i) + ylabel(tsax_i, ylstrI); + end + + % Set xlabel + if j<=length(xlabels) && ~isempty(xlabels{j}) + xlstr = xlabels{j}; + else + xlstr = find(pl, 'XLabel'); + end + if ~isempty(xmath) + xmath = strrep(xmath, 'x', sprintf('%s', a.data.xunits)); + xlstr = [xlstr ' [' xmath ']' ]; + else + xlstr = [xlstr ' [' a.data.xunits ']' ]; + end + xlabel(tsax_r, xlstr); + if ishandle(tsax_i) + xlabel(tsax_i, xlstr); + end + + % Set grid on or off + grid(tsax_r, 'on'); + if ishandle(tsax_i) + grid(tsax_i, 'on'); + end + + % Set Y scale + c = 1+(j-1)*2; + if c<=length(yscales) + if ~isempty(yscales{c}) + yscaleR = yscales{c}; + end + end + if c<length(yscales) + if ~isempty(yscales{c+1}) + yscaleI = yscales{c+1}; + end + end + set(tsax_r, 'YScale', yscaleR); + if ishandle(tsax_i) + set(tsax_i, 'YScale', yscaleI); + end + + % Set X scale + c = 1+(j-1)*2; + if c<=length(xscales) + if ~isempty(xscales{c}) + xscaleR = xscales{c}; + end + end + if c<length(xscales) + if ~isempty(xscales{c+1}) + xscaleI = xscales{c+1}; + end + end + set(tsax_r, 'XScale', xscaleR); + if ishandle(tsax_i) + set(tsax_i, 'XScale', xscaleI); + end + + % Set Y range + c = 1+(j-1)*2; + if c<=length(yranges) + if ~isempty(yranges{c}) + set(tsax_r, 'YLim', yranges{c}); + end + end + if c<length(yranges) + if ~isempty(yranges{c+1}) + if ishandle(tsax_i) + set(tsax_i, 'YLim', yranges{c+1}); + end + end + end + + % Set X range + c = 1+(j-1)*2; + if c<=length(xranges) + if ~isempty(xranges{c}) + set(tsax_r, 'XLim', xranges{c}); + end + end + if c<length(xranges) + if ~isempty(xranges{c+1}) + if ishandle(tsax_i) + set(tsax_i, 'XLim', xranges{c+1}); + end + end + end + + %------- line properties + + % Set line color + if isreal(y) + set(tsli(end), 'Color', col); + else + set(tsli(end-1), 'Color', col); + set(tsli(end), 'Color', col); + end + + % Set line style + if j<=length(linestyles) && ~isempty(linestyles{j}) + if isreal(y) + set(tsli(end), 'LineStyle', linestyles{j}); + else + set(tsli(end-1), 'LineStyle', linestyles{j}); + set(tsli(end), 'LineStyle', linestyles{j}); + end + end + + % Set line widths + if j<=length(linewidths) && ~isempty(linewidths(j)) + if isreal(y) + set(tsli(end), 'LineWidth', linewidths(j)); + else + set(tsli(end-1), 'LineWidth', linewidths(j)); + set(tsli(end), 'LineWidth', linewidths(j)); + end + end + + % Set legend string + lstr = ''; + if legendsOn + if j<=length(legends) && ~isempty(legends{j}) + lstr = legends{j}; + else + lstr = ltpda_label(a.name); + end + end + legendStr = [legendStr cellstr(lstr)]; + + % Set the legend now if we can + if legendsOn + if strcmp(arrangement, 'single') || strcmp(arrangement, 'subplots') + legend(tsax_r, legendStr{end}); + end + end + + end % End loop over AOs + + % Process legends for stacked plots + if legendsOn + if strcmp(arrangement, 'stacked') + h = legend(tsax_r, legendStr); + set(h, 'FontSize', 10) + end + end + +end + +% Set outputs +if nargout > 0 + varargout{1} = tsfig; +end +if nargout > 1 + varargout{2} = tsax; +end +if nargout == 3 + varargout{3} = tsli; +end +if nargout > 3 + error('### Too many output arguments'); +end + +%-------------------------------------------------------------------------- +% Plot tsdata and xydata objects +% +function varargout = xy_plot(varargin) + +aos = varargin{1}; +pl = varargin{2}; + +% Extract parameters +arrangement = find(pl, 'Arrangement'); +colors = find(pl, 'Colors'); +linestyles = find(pl, 'LineStyles'); +linewidths = find(pl, 'LineWidths'); +legends = find(pl, 'Legends'); +ylabels = find(pl, 'YLabels'); +xlabels = find(pl, 'XLabels'); +xmaths = find(pl, 'XMaths'); +ymaths = find(pl, 'YMaths'); + +% check whether we want legends or not +if iscell(legends) + legendsOn = 1; +else + if strcmpi(legends, 'off') + legendsOn = 0; + else + legendsOn = 1; + legends = []; + end +end + +if ~iscell(linestyles), linestyles = {linestyles}; end +if ~iscell(legends), legends = {legends}; end +if ~iscell(ylabels), ylabels = {ylabels}; end +if ~iscell(xlabels), xlabels = {xlabels}; end +if ~iscell(xmaths), xmaths = {xmaths}; end +if ~iscell(ymaths), ymaths = {ymaths}; end + + +% collect figure handles +tsfig = []; +tsax = []; +tsli = []; + +% Legend holder +legendStr = []; + +if ~isempty(aos) + + % Now loop over AOs + Na = length(aos); + for j=1:Na + + % Get this AO + a = aos(j); + + % what figures do we need? + switch arrangement + case 'single' + + tsfig = [tsfig figure]; + tsax = subplot(1,1,1); + col = colors{1}; + + case 'stacked' + + if j==1, tsfig = figure; end + tsax = subplot(1,1,1); + col = colors{mod(j-1,length(colors))+1}; + hold on; + + case 'subplots' + + if j == 1, tsfig = figure; end + tsax = [tsax subplot(Na, 1, j)]; + col = colors{1}; + + otherwise + error('### Unknown plot arrangement'); + end + + %------- Apply math functions + x = a.data.x; + y = a.data.y; + + ymath = ''; + if j<=length(ymaths) + if ~isempty(ymaths{j}) + eval(sprintf('y = %s;', ymaths{j})); + ymath = ymaths{j}; + end + end + xmath = ''; + if j<=length(xmaths) + if ~isempty(xmaths{j}) + eval(sprintf('x = %s;', xmaths{j})); + xmath = xmaths{j}; + end + end + + %------- Plot the data + + tsli = [tsli plot(tsax(end), x, y)]; + + %------- Axis properties + + % Set ylabel + if j<=length(ylabels) && ~isempty(ylabels{j}) + ylstr = ylabels{j}; + else + ylstr = find(pl, 'YLabel'); + end + if ~isempty(ymath) + ymath = strrep(ymath, 'y', sprintf('%s', a.data.yunits)); + ylstr = [ylstr ' [' ymath ']' ]; + else + ylstr = [ylstr ' [' a.data.yunits ']' ]; + end + ylabel(ylstr); + + % Set xlabel + if j<=length(xlabels) && ~isempty(xlabels{j}) + xlstr = xlabels{j}; + else + xlstr = find(pl, 'XLabel'); + end + if ~isempty(xmath) + xmath = strrep(xmath, 'x', sprintf('%s', a.data.xunits)); + xlstr = [xlstr ' [' xmath ']' ]; + else + xlstr = [xlstr ' [' a.data.xunits ']' ]; + end + xlabel(xlstr); + + + % Set grid on or off + grid(tsax(end), 'on'); + + %------- line properties + + % Set line color + set(tsli(end), 'Color', col); + + % Set line style + if j<=length(linestyles) && ~isempty(linestyles{j}) + set(tsli(end), 'LineStyle', linestyles{j}); + end + + % Set line widths + if j<=length(linewidths) && ~isempty(linewidths(j)) + set(tsli(end), 'LineWidth', linewidths(j)); + end + + % Set legend string + lstr = ''; + if legendsOn + if j<=length(legends) && ~isempty(legends{j}) + lstr = legends{j}; + else + lstr = ltpda_label(a.name); + end + end + legendStr = [legendStr cellstr(lstr)]; + + % Set the legend now if we can + if legendsOn + if strcmp(arrangement, 'single') || strcmp(arrangement, 'subplots') + legend(legendStr{end}); + end + end + end + + % Process legends for stacked plots + if legendsOn + if strcmp(arrangement, 'stacked') + h = legend(legendStr); + set(h, 'FontSize', 10) + end + end + +end + +% Set outputs +if nargout > 0 + varargout{1} = tsfig; +end +if nargout > 1 + varargout{2} = tsax; +end +if nargout == 3 + varargout{3} = tsli; +end +if nargout > 3 + error('### Too many output arguments'); +end + + +%-------------------------------------------------------------------------- +% Plot cdata objects +% +function varargout = y_plot(varargin) + +aos = varargin{1}; +pl = varargin{2}; + +% Extract parameters +arrangement = find(pl, 'Arrangement'); +colors = find(pl, 'Colors'); +linestyles = find(pl, 'LineStyles'); +linewidths = find(pl, 'LineWidths'); +legends = find(pl, 'Legends'); +ylabels = find(pl, 'YLabels'); +xlabels = find(pl, 'XLabels'); +xmaths = find(pl, 'XMaths'); +ymaths = find(pl, 'YMaths'); + +% check whether we want legends or not +if iscell(legends) + legendsOn = 1; +else + if strcmp(legends, 'off') + legendsOn = 0; + else + legendsOn = 1; + legends = []; + end +end + +if ~iscell(linestyles), linestyles = {linestyles}; end +if ~iscell(legends), legends = {legends}; end +if ~iscell(ylabels), ylabels = {ylabels}; end +if ~iscell(xlabels), xlabels = {xlabels}; end +if ~iscell(xmaths), xmaths = {xmaths}; end +if ~iscell(ymaths), ymaths = {ymaths}; end + +% collect figure handles +tsfig = []; +tsax = []; +tsli = []; + +% Legend holder +legendStr = []; + +if ~isempty(aos) + + % Now loop over AOs + Na = length(aos); + for j=1:Na + + % Get this AO + a = aos(j); + + % what figures do we need? + switch arrangement + case 'single' + + tsfig = [tsfig figure]; + tsax = subplot(1,1,1); + col = colors{1}; + + case 'stacked' + + if j==1, tsfig = figure; end + tsax = subplot(1,1,1); + col = colors{mod(j-1,length(colors))+1}; + hold on; + + case 'subplots' + + if j == 1, tsfig = figure; end + tsax = [tsax subplot(Na, 1, j)]; + col = colors{1}; + + otherwise + error('### Unknown plot arrangement'); + end + + %------- Apply math functions + x = 1:length(a.data.y); + y = a.data.y; + + ymath = ''; + if j<=length(ymaths) + if ~isempty(ymaths{j}) + eval(sprintf('y = %s;', ymaths{j})); + ymath = ymaths{j}; + end + end + xmath = ''; + if j<=length(xmaths) + if ~isempty(xmaths{j}) + eval(sprintf('x = %s;', xmaths{j})); + xmath = xmaths{j}; + end + end + + %------- Plot the data + + idcs = plot(tsax(end), x, y); + tsli = [tsli idcs(1:end).']; + + %------- Axis properties + + % Set ylabel + if j<=length(ylabels) && ~isempty(ylabels{j}) + ylstr = ylabels{j}; + else + ylstr = find(pl, 'YLabel'); + end + if ~isempty(ymath) + ymath = strrep(ymath, 'y', sprintf('%s', a.data.yunits)); + ylstr = [ylstr ' [' ymath ']' ]; + else + ylstr = [ylstr ' [' a.data.yunits ']' ]; + end + ylabel(ylstr); + + % Set xlabel + if j<=length(xlabels) && ~isempty(xlabels{j}) + xlstr = xlabels{j}; + else + xlstr = find(pl, 'XLabel'); + end + if ~isempty(xmath) + xmath = strrep(xmath, 'x', sprintf('%s', a.data.xunits)); + xlstr = [xlstr ' [' xmath ']' ]; + else + xlstr = [xlstr ' [' a.data.xunits ']' ]; + end + xlabel(xlstr); + + + % Set grid on or off + grid(tsax(end), 'on'); + + %------- line properties + + % Set line color + set(tsli(end), 'Color', col); + + % Set line style + if j<=length(linestyles) && ~isempty(linestyles{j}) + set(tsli(end), 'LineStyle', linestyles{j}); + end + + % Set line widths + if j<=length(linewidths) + set(tsli(end), 'LineWidth', linewidths(j)); + end + + % Set legend string + if legendsOn + if j<=length(legends) && ~isempty(legends{j}) + legendStr = [legendStr legends(j)]; + else + lstr = ltpda_label(a.name); + legendStr = [legendStr cellstr(lstr)]; + end + end + + % Set the legend now if we can + if legendsOn + if strcmp(arrangement, 'single') || strcmp(arrangement, 'subplots') + legend(legendStr{end}); + end + end + end + + % Process legends for stacked plots + if legendsOn + if strcmp(arrangement, 'stacked') + h = legend(legendStr); + set(h, 'FontSize', 10) + end + end + +end + +% Set outputs +if nargout > 0 + varargout{1} = tsfig; +end +if nargout > 1 + varargout{2} = tsax; +end +if nargout == 3 + varargout{3} = tsli; +end +if nargout > 3 + error('### Too many output arguments'); +end + +%-------------------------------------------------------------------------- +% Plot xyzdata objects +% +function varargout = xyz_plot(varargin) + +aos = varargin{1}; +pl = varargin{2}; + +% Extract parameters +arrangement = find(pl, 'Arrangement'); +colors = find(pl, 'Colors'); +linestyles = find(pl, 'LineStyles'); +linewidths = find(pl, 'LineWidths'); +legends = find(pl, 'Legends'); +zlabels = find(pl, 'ZLabels'); +ylabels = find(pl, 'YLabels'); +xlabels = find(pl, 'XLabels'); +xmaths = find(pl, 'XMaths'); +ymaths = find(pl, 'YMaths'); +zmaths = find(pl, 'ZMaths'); + +% check whether we want legends or not +if iscell(legends) + legendsOn = 1; +else + if strcmp(legends, 'off') + legendsOn = 0; + else + legendsOn = 1; + legends = []; + end +end + +% collect figure handles +tsfig = []; +tsax = []; +tsli = []; + +% Legend holder +legendStr = []; + +if ~isempty(aos) + + % Now loop over AOs + Na = length(aos); + for j=1:Na + + % Get this AO + a = aos(j); + + % what figures do we need? + switch arrangement + case 'single' + + tsfig = [tsfig figure]; + tsax = subplot(1,1,1); + + case 'subplots' + + if j == 1, tsfig = figure; end + tsax = [tsax subplot(Na, 1, j)]; + + otherwise + error('### Unknown plot arrangement'); + end + + %------- Apply math functions + x = a.data.x; + y = a.data.y; + z = a.data.z; + + + ymath = ''; + if j<=length(ymaths) + if ~isempty(ymaths{j}) + eval(sprintf('y = %s;', ymaths{j})); + ymath = ymaths{j}; + end + end + xmath = ''; + if j<=length(xmaths) + if ~isempty(xmaths{j}) + eval(sprintf('x = %s;', xmaths{j})); + xmath = xmaths{j}; + end + end + zmath = ''; + if j<=length(zmaths) + if ~isempty(zmaths{j}) + eval(sprintf('z = %s;', zmaths{j})); + zmath = zmaths{j}; + end + end + + %------- Plot the data + + idcs = pcolor(x,y,z); + tsli = [tsli idcs(1:end).']; + + % plot properties + set(idcs, 'EdgeColor', 'none'); + + %------- Axis properties + + % Reverse y-direction for spectrograms + set(tsax(end), 'YDir', 'reverse'); + + % Set ylabel + if j<=length(ylabels) && ~isempty(ylabels{j}) + ylstr = ylabels{j}; + else + ylstr = find(pl, 'YLabel'); + end + if ~isempty(ymath) + ymath = strrep(ymath, 'y', sprintf('%s', a.data.yunits)); + ylstr = [ylstr ' [' ymath ']' ]; + else + ylstr = [ylstr ' [' a.data.yunits ']' ]; + end + ylabel(ylstr); + + % Set xlabel + if j<=length(xlabels) && ~isempty(xlabels{j}) + xlstr = xlabels{j}; + else + xlstr = find(pl, 'XLabel'); + end + if ~isempty(xmath) + xmath = strrep(xmath, 'x', sprintf('%s', a.data.xunits)); + xlstr = [xlstr ' [' xmath ']' ]; + else + xlstr = [xlstr ' [' a.data.xunits ']' ]; + end + xlabel(xlstr); + + % Set grid on or off + grid(tsax(end), 'on'); + + % Set title string + if ~strcmpi(legends, 'off') + if j<=length(legends) && ~isempty(legends{j}) + legendStr = [legendStr legends(j)]; + else + lstr = ltpda_label(a.name); + legendStr = [legendStr cellstr(lstr)]; + end + end + + % Set the legend now if we can + tstr = legendStr{end}; + if legendsOn + title(tstr); + end + + % Set colorbars + hc = colorbar('peer', tsax(end)); + if j<=length(zlabels) + if ~isempty(zlabels{j}) + zlstr = zlabels{j}; + end + else + zlstr = find(pl, 'Zlabel'); + end + if ~isempty(zmath), zlstr = [zlstr sprintf('\n%s', zmath)]; end + ylh = get(hc, 'YLabel'); + set(ylh, 'String', zlstr); + set(ylh, 'Fontsize', get(tsax(end), 'Fontsize')) + set(ylh, 'FontName', get(tsax(end), 'FontName')) + set(ylh, 'FontAngle', get(tsax(end), 'FontAngle')) + set(ylh, 'FontWeight', get(tsax(end), 'FontWeight')) + end +end + +% Set outputs +if nargout > 0 + varargout{1} = tsfig; +end +if nargout > 1 + varargout{2} = tsax; +end +if nargout == 3 + varargout{3} = tsli; +end +if nargout > 3 + error('### Too many output arguments'); +end + + +%-------------------------------------------------------------------------- +% Default Parameter Lists +% +function out = getDefaultPlist(varargin) + +% list of available parameter sets +sets = {'tsdata', 'fsdata', 'cdata', 'xydata'}; + +% Get the LTPDA color set for lines +colors = getappdata(0,'ltpda_default_plot_colors'); + +if nargin == 0 + out = sets; + return +end + +set = varargin{1}; + +out = plist('Colors', colors, ... + 'Arrangement', 'stacked'); + +switch set + case 'fsdata' + out = append(out, 'type', 'fsdata', ... + 'complexPlotType', 'absdeg', ... + 'XLabel', 'Frequency'); + case 'tsdata' + out = append(out, 'type', 'tsdata', ... + 'Xlabel', 'Time', ... + 'Ylabel', 'Amplitude'); + case 'xydata' + out = append(out, 'type', 'xydata', ... + 'Xlabel', 'X-data', ... + 'Ylabel', 'Y-data', ... + 'YMaths', '', ... + 'XMaths', ''); + case 'xyzdata' + out = plist('Colors', colors, 'Arrangement', 'single', ... + 'type', 'xydata', ... + 'Xlabel', 'Time', ... + 'Ylabel', 'Frequency',... + 'Zlabel', 'Amplitude', ... + 'YMaths', '', ... + 'ZMaths', '', ... + 'XMaths', ''); + case 'cdata' + out = append(out, 'type', 'tsdata', ... + 'Xlabel', 'Index', ... + 'Ylabel', 'Value'); + otherwise + out = plist(); +end + +