====== Plotting the absorbed light in a chart ======
//Open the file {{ :tutorials:lightchart.gsz |lightchart.gsz}}.// We now want to see model output as a chart (as you might know from R). The total light intercepted by all leaves is output into a chart, and this at every step of the simulation.
For this, we have to declare a kind of data table in which the output is stored:
//insert a table here for the output:
const DatasetRef lightdata = new DatasetRef("Light intercepted by canopy");
We then have to initiate the chart in the ''init()'' method. For this, we will use the new method ''initChart()'' that will be defined later:
protected void init()
[
//the chart is initialized here:
{
initChart();
}
Axiom ==> [Plane().(setShader(WHITE))]
Bud(1, PHYLLOCHRON, 1);
==>> ^ M(50) RU(180) MyLight;
]
Note that if you want to declare imperative code in a method that also contains rules (like the present ''init()'' method), then you have to put it into a pair of curly braces, ''{ }''. Also, we want to update the chart at every step, so we add a new line to the ''grow()'' method:
public void grow ()
{
run();
lm.compute();
absorb();
//update the chart here
updateChart();
}
The latter is another new method, ''updateChart()'', that we still need to define.
The two new methods are defined, first ''initChart()'':
//definition of the method initChart():
protected void initChart()
{
lightdata.clear();
chart(lightdata, XY_PLOT);
}
This method does something with the data table ''lightdata'', in fact it empties it at each new run, using the method ''clear()''(L. 112). The ''chart'' command does the actual plotting: It creates an XY plot with the data table, using as x the time (simulation steps) and as y the sum of light absorbed by all leaves. The table is filled up with data by the ''updateChart()'' method:
//definition of the method updateChart():
protected void updateChart()
{
lightdata.addRow().set(0, sum((* Leaf *)[al]));
}
The ''addRow()'' method of ''DatasetRef'' does the actual job, more specifically its sub-method ''set()'', which adds the data into the 0th column of the table: The data are produced by the ''sum'' method, which searches for all leaves ''(* Leaf *)'' that are already produced and then sums up their parameter ''al''. Searching for objects in the graph is a very powerful option in GroIMP. You can also do this at any time of the simulation by typing search commands in the XL Console, for instance the following command:
{{tutorials:console.png}}
will search for all objects ''Leaf'' in the scene/graph (you have to write ''“Example1.Leaf”'' to indicate that the module was defined within the class ''“Example1.rgg”'') the value of the parameter ''al'' and calculate the sum of it. If you omit ''Example1'', the module ''Leaf'' cannot be found and you get an error message instead:
{{tutorials:consoleerror.png}}
You can also have a look at the data table itself:
//Main Menu: Panels -> Explorers -> Datasets//
{{tutorials:panelsdatasets.png}}
This will give you a new window:
{{tutorials:datasetslight.png}}
When you double-click on the //Dataset “- Light intercepted…”// you get the actual table, with two columns, ''#'' and ''A'', where the first column contains the steps, the second the sum of light intercepted by the leaves:
{{tutorials:datasetslighttable.png}}