Creating “real” subplots in SimBiology using the Plot Type Library
The SimBiology Desktop offers a number of different plot types that can
be chosen in a task window. The default plot type in a simulation task,
for example, is the Time
plot, which plots states against the
simulation time:
Three items need to be configured for this plot type:
tobj
(which we will learn about later)y
(used to specify which states to plot)- and
plotStyle
, eitherone axes
,subplot
ortrellis
The subplot
option often confuses people – and I was one of them when
I started with SimBiology. Many (including myself) intuitively expect
this option to allow plotting of each state in its own plot axes, i.e.,
in its own subplot. However, this option is used to plot the results
of several simulations (from a scan or ensemble simulation) into
individual subplots. How could we plot each state in a separate
subplot?
A possible solution is to add a user-defined plot to the Plot Type
Library. This library can be accessed from the address bar:
In the Plot Types Library window, a list of the available Plot Types and
the associated code can be found. The easiest to get started is to
copy-paste one of the existing Plot Types and modify the copied code.
However, here I will start with a blank new Plot Type. Let’s add a new
Plot Type called State Subplot
:
Clicking on Add will automatically create a template that we can extend to create our own Plot Type:
function State_Subplot(tobj)
Let’s add a second argument containing the names of the states that we want to plot:
function State_Subplot(tobj, y)
Below the editor is a box where the arguments that should be passed into
this plotting function need to be defined. The second argument y
has
already been added to this table
These are the parameters that will later on need to be specified in the
task window. There’s a choice of six argument types, the most important
one for our purposes are Data Source
, Data Names
and Enumerations
.
Data Source
contains the results of the simulation in the form of a
SimData object
or a Dataset array
in the case of external data
(after these have been imported into the Data Tab). tobj
is already
predefined as a Data Source
; we will choose Data Names
as the
Argument Type for y
with the default value set to <all>
.
Enumerations
can be used to provide a drop-down list of string
alternatives. As an example for their use, the Time
plot type uses
enumerations to provide the PlotStyle
dialog to distinguish between
one axes
, subplot
and trellis
.
Now everything is set up and the remaining task is to code the subplot
itself.
First, we will extract the simulation data from the SimData object
tobj
% Get Data to be plotted
if strcmpi(y, '<all>')
[time, data, names] = getdata(tobj);
else
[time, data, names] = selectbyname(tobj, y);
end
We need to distinguish between the default option and a list of state
names. selectbyname()
can be used to extract simulation data for a
limited number of states; getdata()
can be used to separate all data
into double arrays and a cell array, so that they can be easily plotted
using the generic plot()
command.
In the next step we need to figure out the number of rows and columns for the subplot. First, we’ll calculate the square root of the number of states to be plotted
rootnplots = sqrt(numel(names));
and then – considering that monitors typically have a 4:3 or 16:9 aspect ratio – set up the number of rows and columns so that we have more columns than rows
nrows = round(rootnplots);
ncolumns = ceil(rootnplots);
Finally, the last remaining task is to create the actual plot
for(i = 1:numel(names))
subplot(nrows,ncolumns,i)
plot(time, data(:,i));
title(names(i),'Interpreter','none');
end
We step through each state using a for
loop, create a new subplot
axis, plot the state values against time and put the name of the state
as a title, switching off LaTeX interpretation of the title string so
that underscores, for example, are not interpreted in the LaTeX way as a
subscript. Axis labels and other things could also be set here. Done.
Last, you might want to share your newly created plot type
with one of
your colleagues. For this, click on the action button left of the
address bar
and either export the plot type or send it as an email attachment
directly from SimBiology. Your colleague can import the new plot type by
importing the .plottype
file from the same dialog. After this import,
the new plot type is available from the plot list in the task window
Any comments/questions? Send me an email.