Mercurial > hg > ltpda
diff m-toolbox/classes/@history/plot.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/@history/plot.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,249 @@ +% PLOT plots a history object as a tree diagram. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: PLOT plots a history object as a tree diagram. +% +% NOTE: Some of the code below is taken from Mathworks's treeplot.m +% +% CALL: plot (history) +% plot (history, arg) +% plot (history, arg, pl) +% plot (axes_handle, ...) +% +% PARAMETER: 'stop_option' - 'File' ignores the history steps below load-history step +% - 'Repo' ignores the history steps below retrieve-history step +% - 'File Repo' both steps above +% - N maximun depth +% +% VERSION: $Id: plot.m,v 1.34 2011/02/18 16:48:52 ingo Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function varargout = plot(varargin) + + import utils.const.* + prefs = getappdata(0, 'LTPDApreferences'); + utils.helper.msg(msg.OMNAME, 'running %s/%s', mfilename('class'), mfilename); + + %%% Used call: plot (history, arg) + if isa(varargin{1}, 'history') + + figure; + hists = varargin{1}; + curr_axes = axes; + if nargin >= 2 + varargin = varargin(2:end); + else + varargin = {}; + end + + %%% Used call: plot (curr_axes_handle, history, arg) + elseif ishandle(varargin{1}) + + curr_axes = varargin{1}; + axes(curr_axes); + hists = varargin{2}; + if nargin >= 3 + varargin = varargin(3:end); + else + varargin = {}; + end + + else + error (['### the first input should be a history object or an axes handle' ... + sprintf(' varargin{1} = [%s]',varargin{1})]); + end + + %%% collect the parameter and put them into the parameter list + plot_args = {}; + pl = plist(); + args = varargin; + + while ~isempty(args) + + if isa(args{1}, 'plist') + arg = args{1}; + pl = append(pl, arg); + args = args(2:end); + + % Add the key-values to the parameter list + elseif length(args) >= 2 + if ischar(args{1}) + arg = args{1}; + val = args{2}; + pl = append(pl, param(arg, val)); + + plot_args{end+1} = arg; + plot_args{end+1} = val; + args = args(3:end); + + else + error('### the key [%s] is not from the type ''char''', char(args{1})); + end + else + help(mfilename('fullpath')) + error('### There is no key/value pair left.'); + end + + end + + %%% Combine input plist and default plist + pl = combine(pl, getDefaultPlist); + + %%% Comes the call from the browser or from the command window + stop_option = find(pl, 'stop_option'); + + %%% Output handles for figures and axes + hfig = []; + ax = []; + at = []; + + nhists = length(hists); + for i=1:nhists + + hist = hists(i); + % disp(sprintf('--- plotting history %s', hist.name)); + + % convert history object to a node list + [n,a, nodes] = getNodes(hist, stop_option); + + p = [nodes(:).pn]; + [x,y,h]=treelayout(p); + f = find(p~=0); + pp = p(f); + X = [x(f); x(pp); repmat(NaN,size(f))]; + Y = [y(f); y(pp); repmat(NaN,size(f))]; + X = X(:); + Y = Y(:); + + % figure + hfig = [hfig gcf]; + + % axes objects + a = plot (curr_axes, X, Y, 'r--', x, y, 'ro'); + % plot (X,Y) --> die linien + if length(a)>1 + set(a(2), 'MarkerFaceColor', 'r'); + set(a(2), 'MarkerSize', 8); + end + args = plot_args; + while ~isempty(args) + prop = args{1}; + val = args{2}; + args = args(3:end); + for ii = 1:length(a) + set(a(ii), prop, val); + end + end + ax = [ax a]; + + % text objects + a = []; + for j=1:length(x) + % node description + fcnname = getFcnName(nodes(j).names); + str = ['{\bf\color{blue}' num2str(nodes(j).n) ':}{\bf\color{red}' fcnname '} ' strrep(strrep(char(nodes(j).params), '{', '\{'), '}', '\}')]; + nlstr = getNodeInputs(nodes(j).invars); + + na = text(x(j), y(j),... + [utils.prog.wrapstring(strrep(str,'_', '\_'), double(prefs.getDisplayPrefs.getDisplayWrapStrings)) ... + cellstr(['{\color{magenta} ' strrep(nlstr,'_', '\_') '}'])]); + set(na, 'HorizontalAlignment', 'center'); + set(na, 'EdgeColor', 'k', 'Fontsize', 10); + set(na, 'BackgroundColor', 'w'); + set(na, 'Margin', 5); + a = [a na]; + end + at = [at a]; + + % xlabel(['height = ' int2str(h)]); + axis([0 1 0 1]); + box off; + axis off; + + end + + % Make outputs + if nargout > 0 + varargout{1} = hfig; + end + if nargout > 1 + varargout{2} = ax; + end + if nargout > 2 + varargout{3} = at; + end +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Local Functions % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% FUNCTION: getFcnName +% +% DESCRIPTION: compute strings to display for function name. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function fcnname = getFcnName(name) + + % switch name + % case 'mtimes' + % fcnname = 'x'; + % case 'times' + % fcnname = 'x'; + % case 'plus' + % fcnname = '+'; + % case 'minus' + % fcnname = '-'; + % % case 'sqrt' + % % fcnname = '\surd'; + % case 'mrdivide' + % fcnname = '/'; + % case 'rdivide' + % fcnname = '/'; + % otherwise + % fcnname = char(name); + % end + + fcnname = char(name); +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% FUNCTION: getNodeInputs +% +% DESCRIPTION: compute strings to display for inputs to nodes. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function str = getNodeInputs(invars) + + ni = length(invars); + if ni > 0 + str = char(invars{1}); + for iv=2:ni + s = char(invars{iv}); + if ~strcmp(s, 'pl') + str = [str ' ' s]; + end + end + else + str = ''; + end +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% FUNCTION: getDefaultPlist +% +% DESCRIPTION: Returns the default parameter list. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function plo = getDefaultPlist() + plo = plist('stop_option', 'full'); +end +