Mercurial > hg > ltpda
diff m-toolbox/classes/@ao/gnuplot.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/gnuplot.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,867 @@ +% GNUPLOT a gnuplot interface for AOs. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: IPLOT provides an intelligent plotting tool for LTPDA. +% +% CALL: filenames = gnuplot(a,pl) +% +% INPUTS: pl - a parameter list +% a - input analysis objects +% +% OUTPUTS: filenames - if gnuplot is configured to output files, then +% the filenames are returned here. +% +% +% NOTE: this method requires gnuplot to be installed on the system. The +% path to the gnuplot binary can be set in the input plist with the key +% 'GNUPLOT'. +% +% gnuplot: http://www.gnuplot.info/ +% +% AO Plot Info +% ------------ +% +% If an input AO has a filled plotinfo plist, then the options contained in +% therein will overide any other options. The recognised keys are: +% +% 'linestyle', 'linewidth', 'color', 'marker', 'legend_on' +% +% The possible values are all those accepted by plot. +% +% +% EXAMPLES: +% +% 1) Plot two time-series AOs on the same plot and output to a PDF file +% +% gnuplot(a1, a2, plist('terminal', 'pdf enhanced', ... +% 'output', outfile, ... +% 'preamble', {'set title "my nice plot"', 'set key outside top right'}, ... +% 'markerscale', 3)) +% +% 2) Plot two time-series AOs in subplots. If the AOs have markers set in +% the plotinfo, they will be scaled in size x3 from default. +% +% gnuplot(a1, a2, plist('arrangement', 'subplots', 'terminal', 'pdf enhanced', ... +% 'output', outfile, ... +% 'preamble', {'set title "my nice plot"', 'set key outside top right'}, ... +% 'markerscale', 3)) +% +% 3) Plot two time-series AOs, each to its own output pdf file. +% +% gnuplot(a1, a2, plist('arrangement', 'single', 'terminal', 'pdf enhanced', ... +% 'output', outfile, 'outdir', '.', ... +% 'preamble', {'set title "my nice plot"', 'set key outside top right'}, ... +% 'markerscale', 3)) +% +% +% <a href="matlab:utils.helper.displayMethodInfo('ao', 'gnuplot')">Parameters Description</a> +% +% VERSION: $Id: gnuplot.m,v 1.12 2011/04/13 04:51:36 mauro Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +function varargout = gnuplot(varargin) + + + % Check if this is a call for parameters + if utils.helper.isinfocall(varargin{:}) + varargout{1} = getInfo(varargin{3}); + return + end + + import utils.const.* + 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 + + % Collect all AOs + [as, ao_invars] = utils.helper.collect_objects(varargin(:), 'ao', in_names); + + % Apply defaults to plist + usepl = applyDefaults(getDefaultPlist, varargin{:}); + + % Loop over input AOs and collect the different types + [timeAOs, freqAOs, yAOs, xyAOs] = collectAOs(as); + + fnames = {}; + % Do time-series + if ~isempty(timeAOs) + fnames = [fnames plot_ao_set(timeAOs, usepl)]; + end + % Do freq-series + if ~isempty(freqAOs) + fnames = [fnames plot_ao_set(freqAOs, usepl)]; + end + + if ~isempty(xyAOs) + error('Plotting xy-data objects is not yet supported.'); + end + + if ~isempty(yAOs) + error('Plotting c-data objects is not yet supported.'); + end + + if nargout == 1 + varargout{1} = fnames; + end + + +end + +function fnames = plot_ao_set(as,pl) + + fnames = {}; + + Na = numel(as); + + % Parameters + odir = pl.find('OutputDir'); + output = pl.find('output'); + terminal = pl.find('terminal'); + terminalOpts = pl.find('terminal options'); + gnuplotBin = pl.find('gnuplot'); + + if isempty(terminal) + runcmd(gnuplotBin, ' -e "help terminal"'); + return; + end + + if isempty(output) + output = tempname; + else + output = fullfile(odir, output); + end + + %---------------- + % Make filenames + %---------------- + aTmpFile = tempname; + % One data file per AO + tmpData = {}; + for kk = 1:Na + tmpData = [tmpData {sprintf('%s_%d.dat', aTmpFile, kk)}]; + end + % One gnu file + tmpGnu = [aTmpFile '.gnu']; + % Output file + [path,name,ext] = fileparts(output); + if isempty(ext) + output = [output '.' terminal]; + end + + utils.helper.msg(utils.const.msg.PROC1, 'Output file: %s', output); + utils.helper.msg(utils.const.msg.PROC1, 'Plotting %d time-series AOs...', numel(as)); + + switch class(as(1).data) + case 'tsdata' + fnames = [fnames ts_plot(output, terminal, terminalOpts, tmpGnu, tmpData, as, pl)]; + case 'fsdata' + fnames = [fnames fs_plot(output, terminal, terminalOpts, tmpGnu, tmpData, as, pl)]; + case 'xydata' + case 'ydata' + otherwise + end + + % Clean up tmp files + for kk = 1:numel(tmpData) + delete(tmpData{kk}); + end + delete(tmpGnu); + + +end + +%-------------------------------------------------------------------------- +% Make freq-series plot +% + +function fnames = fs_plot(output, terminal, terminalOpts, tmpGnu, tmpData, as, pl) + + switch pl.find('arrangement') + case 'single' + fnames = write_single_freqseries_plot(terminal, terminalOpts, output, tmpGnu, tmpData, as, pl); + case 'stacked' + fnames = write_stacked_freqseries_plot(terminal, terminalOpts, output, tmpGnu, tmpData, as, pl); + case 'subplots' + error('subplots arrangement for frequency-series is not currently supported'); + otherwise + fnames = {}; + end + +end + +%-------------------------------------------------------------------------- +% Plots all the freq-series AOs on individual plots. +% +function fnames = write_single_freqseries_plot(terminal, terminalOpts, output, tmpGnu, tmpData, as, pl); + + fnames = {}; + gnuplotBin = pl.find('gnuplot'); + Na = numel(as); + + % Export data + for kk=1:Na + export(as(kk), tmpData{kk}, plist('complex format', 'absdeg')); + end + + % Process each AO + for kk=1:Na + + % Are we processing complex data? + complexData = false; + if ~isreal(as(kk).y) + complexData = true; + end + + [path,name,ext] = fileparts(output); + ofile = fullfile(path,sprintf('%s_%02d%s',name,kk,ext)); + fnames = [fnames {ofile}]; + + % Open and write gnu file + fd = fopen(tmpGnu, 'w+'); + writeHeader(fd, terminal, terminalOpts, ofile); + + % Need two plots for complex data + if complexData + fprintf(fd, 'set multiplot layout 2,1\n'); + end + + + % Line style + [color, lwidth, style, pointType, pointScale] = lineStyle(kk, as(kk), pl); + + % Axis labels + fprintf(fd, 'set xlabel "Frequency %s"\n', as(kk).xunits.char); + fprintf(fd, 'set ylabel "Amplitude %s"\n', fixUnits(as(kk).yunits.char)); + + % Axis scales + fprintf(fd, 'set lmargin at screen 0.15\n'); + fprintf(fd, 'unset logscale xy\n'); + fprintf(fd, 'set logscale x\n'); + fprintf(fd, 'set logscale y\n'); + + % Preamble + preamble = pl.find('preamble'); + writePreamble(fd, preamble); + + % Write the plot line + fprintf(fd, 'plot "%s" using 1:2 with %s lt %s lw %d %s %s title "%s"\n', ... + tmpData{kk}, style, color, lwidth, pointType, pointScale, as(kk).name); + if complexData + fprintf(fd, 'set ylabel "Phase [deg]"\n'); + fprintf(fd, 'unset logscale xy\n'); + fprintf(fd, 'set logscale x\n'); + fprintf(fd, 'plot "%s" using 1:3 with %s lt %s lw %d %s %s title "%s"\n', ... + tmpData{kk}, style, color, lwidth, pointType, pointScale, as(kk).name); + end + fclose(fd); + % Run gnuplot + runcmd(gnuplotBin, tmpGnu); + end + +end + +%-------------------------------------------------------------------------- +% Plots all the freq-series AOs on individual plots. +% +function fnames = write_stacked_freqseries_plot(terminal, terminalOpts, output, tmpGnu, tmpData, as, pl); + + fnames = {output}; + + gnuplotBin = pl.find('gnuplot'); + Na = numel(as); + + % Check the yunits + xlbl = as(1).xunits.char; + ylbl = as(1).yunits.char; + ylbl = fixUnits(ylbl); + for kk=2:Na + if ~strcmp(ylbl,fixUnits(as(kk).yunits.char)) + ylbl = '[mixed]'; + break; + end + end + + % Export data + allReal = true; + for kk=1:Na + export(as(kk), tmpData{kk}, plist('complex format', 'absdeg')); + if ~isreal(as(kk).y) + allReal = false; + end + end + + % Open and write gnu file + fd = fopen(tmpGnu, 'w+'); + + writeHeader(fd, terminal, terminalOpts, output); + + fprintf(fd, 'set lmargin at screen 0.15\n'); + % Axis labels + fprintf(fd, 'set xlabel "Frequency %s"\n', xlbl); + fprintf(fd, 'set ylabel "Amplitude %s"\n', ylbl); + + + % Need two plots for complex data + if ~allReal + fprintf(fd, 'set multiplot\n'); + fprintf(fd, 'set size 0.9,0.45\n'); + fprintf(fd, 'set origin 0.05,0.5\n'); + end + + fprintf(fd, 'unset logscale xy\n'); + fprintf(fd, 'set logscale x\n'); + fprintf(fd, 'set logscale y\n'); + + % Preamble + preamble = pl.find('preamble'); + writePreamble(fd, preamble); + + % Process real part of each AO + fprintf(fd, 'plot\\\n'); + for kk=1:Na + + hasErrors = ~isempty(as(kk).dy); + + % Line style + [color, lwidth, style, pointType, pointScale] = lineStyle(kk, as(kk), pl); + % Write the plot line + if hasErrors + fprintf(fd, ' "%s" using 1:2:4 with %s lt %s lw %d %s %s title "%s"', ... + tmpData{kk}, style, color, lwidth, pointType, pointScale, as(kk).name); + else + fprintf(fd, ' "%s" using 1:2 with %s lt %s lw %d %s %s title "%s"', ... + tmpData{kk}, style, color, lwidth, pointType, pointScale, as(kk).name); + end + if kk<Na + fprintf(fd, ',\\\n'); + end + end + + fprintf(fd, '\n\n'); + + % Need two plots for complex data + if ~allReal + hasErrors = ~isempty(as(kk).dy); + fprintf(fd, 'set ylabel "Phase [deg]"\n'); + fprintf(fd, 'set size 0.9,0.45\n'); + fprintf(fd, 'set origin 0.05,0.1\n'); + + fprintf(fd, 'unset logscale xy\n'); + fprintf(fd, 'set logscale x\n'); + + % Preamble + preamble = pl.find('preamble'); + writePreamble(fd, preamble); + + % Process real part of each AO + fprintf(fd, 'plot\\\n'); + for kk=1:Na + if ~isreal(as(kk).y) + % Line style + [color, lwidth, style, pointType, pointScale] = lineStyle(kk, as(kk), pl); + % Write the plot line + if hasErrors + fprintf(fd, ' "%s" using 1:3:4 with %s lt %s lw %d %s %s title "%s"', ... + tmpData{kk}, style, color, lwidth, pointType, pointScale, as(kk).name); + else + fprintf(fd, ' "%s" using 1:3 with %s lt %s lw %d %s %s title "%s"', ... + tmpData{kk}, style, color, lwidth, pointType, pointScale, as(kk).name); + end + if kk<Na + fprintf(fd, ',\\\n'); + end + end + end + + end + + fclose(fd); + + % Run gnuplot + runcmd(gnuplotBin, tmpGnu); + +end + + +%-------------------------------------------------------------------------- +% Make time-series plot + +function fnames = ts_plot(output, terminal, terminalOpts, tmpGnu, tmpData, as, pl) + + switch pl.find('arrangement') + case 'single' + fnames = write_single_timeseries_plot(terminal, terminalOpts, output, tmpGnu, tmpData, as, pl); + case 'stacked' + fnames = write_stacked_timeseries_plot(terminal, terminalOpts, output, tmpGnu, tmpData, as, pl); + case 'subplots' + fnames = write_subplot_timeseries_plot(terminal, terminalOpts, output, tmpGnu, tmpData, as, pl); + otherwise + fnames = {}; + end + +end + + +%-------------------------------------------------------------------------- +% Plots all time-series AOs on a single x-y plot. If the AOs have different +% yunits, then the label is set to [mixed]. +function fnames = write_stacked_timeseries_plot(terminal, terminalOpts, output, tmpGnu, tmpData, as, pl) + + fnames = {output}; + + gnuplotBin = pl.find('gnuplot'); + Na = numel(as); + + % Check the yunits + xlbl = as(1).xunits.char; + ylbl = as(1).yunits.char; + ylbl = fixUnits(ylbl); + for kk=2:Na + if ~strcmp(ylbl,fixUnits(as(kk).yunits.char)) + ylbl = '[mixed]'; + break; + end + end + + % Export data + for kk=1:Na + export(as(kk), tmpData{kk}, plist('complex format', 'absdeg')); + end + + % Open and write gnu file + fd = fopen(tmpGnu, 'w+'); + + writeHeader(fd, terminal, terminalOpts, output); + + % Axis labels + fprintf(fd, 'set xlabel "Time %s"\n', xlbl); + fprintf(fd, 'set ylabel "Amplitude %s"\n', ylbl); + + % Preamble + preamble = pl.find('preamble'); + writePreamble(fd, preamble); + + % Process each AO + fprintf(fd, 'plot\\\n'); + for kk=1:Na + % Line style + [color, lwidth, style, pointType, pointScale] = lineStyle(kk, as(kk), pl); + % Write the plot line + fprintf(fd, ' "%s" using 1:2 with %s lt %s lw %d %s %s title "%s"', ... + tmpData{kk}, style, color, lwidth, pointType, pointScale, as(kk).name); + if kk<Na + fprintf(fd, ',\\\n'); + end + end + fclose(fd); + + % Run gnuplot + runcmd(gnuplotBin, tmpGnu); +end + + +%-------------------------------------------------------------------------- +% Plots all time-series AOs on a single x-y plot. If the AOs have different +% yunits, then the label is set to [mixed]. +function fnames = write_subplot_timeseries_plot(terminal, terminalOpts, output, tmpGnu, tmpData, as, pl) + + fnames = {output}; + gnuplotBin = pl.find('gnuplot'); + Na = numel(as); + + + % Export data + for kk=1:Na + export(as(kk), tmpData{kk}, plist('complex format', 'absdeg')); + end + + % Open and write gnu file + fd = fopen(tmpGnu, 'w+'); + + writeHeader(fd, terminal, terminalOpts, output); + + fprintf(fd, 'set multiplot layout %d,1\n', Na); + + + + % Process each AO + for kk=1:Na + % Line style + [color, lwidth, style, pointType, pointScale] = lineStyle(kk, as(kk), pl); + % Axis labels + fprintf(fd, 'set xlabel "Time %s"\n', as(kk).xunits.char); + fprintf(fd, 'set ylabel "Amplitude %s"\n', fixUnits(as(kk).yunits.char)); + % Preamble + preamble = pl.find('preamble'); + writePreamble(fd, preamble); + % Write the plot line + fprintf(fd, 'plot "%s" using 1:2 with %s lt %s lw %d %s %s title "%s"\n', ... + tmpData{kk}, style, color, lwidth, pointType, pointScale, as(kk).name); + end + fclose(fd); + + % Run gnuplot + runcmd(gnuplotBin, tmpGnu); +end + +%-------------------------------------------------------------------------- +% Plots all time-series AOs on a single x-y plot. If the AOs have different +% yunits, then the label is set to [mixed]. +function fnames = write_single_timeseries_plot(terminal, terminalOpts, output, tmpGnu, tmpData, as, pl) + + fnames = {}; + gnuplotBin = pl.find('gnuplot'); + Na = numel(as); + + % Export data + for kk=1:Na + export(as(kk), tmpData{kk}, plist('complex format', 'absdeg')); + end + + % Process each AO + for kk=1:Na + + [path,name,ext] = fileparts(output); + ofile = fullfile(path,sprintf('%s_%02d%s',name,kk,ext)); + fnames = [fnames {ofile}]; + + % Open and write gnu file + fd = fopen(tmpGnu, 'w+'); + writeHeader(fd, terminal, terminalOpts, ofile); + + + % Line style + [color, lwidth, style, pointType, pointScale] = lineStyle(kk, as(kk), pl); + + % Axis labels + fprintf(fd, 'set xlabel "Time %s"\n', as(kk).xunits.char); + fprintf(fd, 'set ylabel "Amplitude %s"\n', fixUnits(as(kk).yunits.char)); + + % Preamble + preamble = pl.find('preamble'); + writePreamble(fd, preamble); + + % Write the plot line + fprintf(fd, 'plot "%s" using 1:2 with %s lt %s lw %d %s %s title "%s"\n', ... + tmpData{kk}, style, color, lwidth, pointType, pointScale, as(kk).name); + fclose(fd); + % Run gnuplot + runcmd(gnuplotBin, tmpGnu); + end + +end + + +%-------------------------------------------------------------------------- +% Functions for writing the GNUPLOT file. +% + +function writeHeader(fd, terminal, terminalOpts, output) + fprintf(fd, 'set terminal %s %s \n', terminal, terminalOpts); + if ~isempty(output) + fprintf(fd, 'set output "%s"\n', output); + end + fprintf(fd, 'set key outside\n'); + fprintf(fd, 'set grid xtics ytics\n'); + fprintf(fd, 'set key invert box\n'); + +end + +function writePreamble(fd, preamble) + + if ischar(preamble) + preamble = {preamble}; + end + for kk=1:numel(preamble) + fprintf(fd, '%s\n', preamble{kk}); + end + +end + + +function [color, lwidth, style, pointType, pointScale] = lineStyle(kk, as, pl) + + info = as.plotinfo; + if ~isempty(info) + color = info.find('color'); + lwidth = info.find('linewidth'); + marker = info.find('marker'); + else + color = []; + lwidth = []; + marker = []; + end + + % Color for this ao + color = mcol2gcol(kk, color); + + % line width + if isempty(lwidth) + lwidth = 2; + end + + % Marker + [style, pointType] = getMarker(marker, isempty(as.dy)); + pointScale = getPointScale(pl.find('markerscale'), pointType); +end + +function [style, pointType] = getMarker(marker, noErrors) + if noErrors + if isempty(marker) + style = 'l'; + pointType = ''; + else + style = 'lp'; + pointType = sprintf('pt %d', mmarkerTogmarker(marker)); + end + else + if isempty(marker) + style = 'errorlines'; + pointType = ''; + else + style = 'errorlines'; + pointType = sprintf('pt %d', mmarkerTogmarker(marker)); + end + end + +end + +function pointScale = getPointScale(size, pointType) + + pointScale = ''; + if pointType > 0 + if ~isempty(size) + pointScale = sprintf('ps %d', size); + end + end + +end + + +% Return a gnuplot point type based on the matlab marker. +% This is terminal dependent and so only works in some cases. +function pt = mmarkerTogmarker(mm) + + switch mm + case '+' + pt = 1; + case 'x' + pt = 2; + case 's' + pt = 4; + case 'd' + pt = 5; + case '^' + pt = 6; + otherwise + pt = 0; + end + +end + +% Prepare units for gnuplot +function str = fixUnits(str) + + str = strrep(strrep(str, '(', '{'), ')', '}'); + +end + + +% Returns an RGB color from a MATLAB string color +function col = mcol2gcol(kk, mcol) + + if isempty(mcol) + col = num2str(kk); + return + end + + if ischar(mcol) + str = mcol; + switch str + case 'r' + col = 'red'; + case 'g' + col = 'blue'; + case 'b' + col = 'blue'; + case 'c' + col = 'cyan'; + case 'm' + col = 'magenta'; + case 'y' + col = 'yellow'; + case 'k' + col = 'black'; + case 'w' + col = 'white'; + otherwise + col = str; + end + else + + % If we have a matlab rgb vector, we need to conver to a hex for + % gnuplot + + r = dec2hex(round(255*mcol(1))); + g = dec2hex(round(255*mcol(2))); + b = dec2hex(round(255*mcol(3))); + + col = ['#' r g b]; + + end + + col = sprintf('rgb "%s"', col); + +end + + + +%--------------------------------------------------------------------- +% This will run a shell command from within MATLAB using the given +% arguments. +% +% usage: runcmd(varargin) +% +% varargin - a series of strings to be concatenated together. +% +% +% e.g. >> runcmd('ls', '-l', dir); +% +% M Hewitson 16-07-04 +% +% $Id: gnuplot.m,v 1.12 2011/04/13 04:51:36 mauro Exp $ +% +function runcmd(varargin) + + fid = fopen('tmpcmd', 'w+'); + fprintf(fid, '#!/bin/bash\n'); + fprintf(fid, 'export PATH=$PATH:${HOME}/bin\n'); + for jj = 1:nargin + fprintf(fid, '%s ', varargin{jj}); + end + fprintf(fid, '\n'); + fclose(fid); + + !chmod +x tmpcmd + !./tmpcmd + !rm tmpcmd +end + +%-------------------------------------------------------------------------- +% Collect the AOs together by data class +% +function [timeAOs, freqAOs, yAOs, xyAOs] = collectAOs(as) + + timeAOs = []; + freqAOs = []; + yAOs = []; + xyAOs = []; + + for jj = 1:numel(as) + + switch class(as(jj).data) + case 'tsdata' + + timeAOs = [timeAOs as(jj)]; + + case 'fsdata' + + freqAOs = [freqAOs as(jj)]; + + case 'xydata' + + yAOs = [yAOs as(jj)]; + + case 'cdata' + + xyAOs = [xyAOs as(jj)]; + + otherwise + utils.helper.warn('Unsupported AO data type [%s]; skipping', class(as(jj).data)); + end % End switch on data type + end % End loop over AOs + +end + + +%-------------------------------------------------------------------------- +% Get Info Object +%-------------------------------------------------------------------------- +function ii = getInfo(varargin) + if nargin == 1 && strcmpi(varargin{1}, 'None') + sets = {}; + pl = []; + else + sets = {'Default'}; + pl = getDefaultPlist(); + end + % Build info object + ii = minfo(mfilename, 'ao', 'ltpda', utils.const.categories.output, '$Id: gnuplot.m,v 1.12 2011/04/13 04:51:36 mauro Exp $', sets, pl); +end + +%-------------------------------------------------------------------------- +% Get Default Plist +%-------------------------------------------------------------------------- +function plout = getDefaultPlist() + persistent pl; + if ~exist('pl', 'var') || isempty(pl) + pl = buildplist(); + end + plout = pl; +end + +function pl = buildplist() + + % General plist for Welch-based, linearly spaced spectral estimators + pl = plist(); + + % Binary + p = param({'gnuplot', ['The path to the gnuplot binary.']},... + paramValue.STRING_VALUE('/opt/local/bin/gnuplot')); + pl.append(p); + + % Output dir + p = param({'OutputDir', ['The output directory to be used in the case of writing output files.']},... + paramValue.STRING_VALUE('')); + pl.append(p); + + % Output file + p = param({'Output', ['The output filename for the given terminal type.\n'... + 'An empty output will result in the output being sent to the terminal.']},... + paramValue.STRING_VALUE('')); + pl.append(p); + + % Terminal type + p = param({'Terminal', 'Choose one of the gnuplot supported terminal types.'},... + paramValue.STRING_VALUE('pdf')); + pl.append(p); + + % Terminal Options + p = param({'Terminal Options', 'Additional terminal options.'},... + paramValue.STRING_VALUE('color enhanced fsize 14 size 24cm,16cm')); + pl.append(p); + + % Preamble + p = param({'Preamble', 'A cell-array of gnuplot commands which are inserted before the plotting but after the basic commands.'},... + paramValue.EMPTY_CELL); + pl.append(p); + + % Arrangement + p = param({'Arrangement', ['Chose how to plot multiple AOs:\n'... + '<ul><li> on one plot (stacked)</li><li>on separate plots (single)</li>'... + '<li>on subplots (subplots) </li></ul><br>In the case of ''single'', if you use an<br>'... + 'output file, then each file will be appended with a number, e.g., foo_1.pdf, foo_2.pdf.']},... + {1, {'stacked', 'single', 'subplots'}, paramValue.SINGLE}); + pl.append(p); + + % Marker scale + p = param({'MarkerScale', ['Scale the size of the markers by an integer amount.']},... + paramValue.DOUBLE_VALUE(1)); + pl.append(p); + + +end