Library: customisation of the generated Gnuplot diagram

This commit is contained in:
Fischlurch 2024-04-03 19:31:00 +02:00
parent 96202f845a
commit 55f8f229f1
5 changed files with 225 additions and 122 deletions

View file

@ -30,7 +30,42 @@
** without much structure or preconceptions and written in a way to encourage adding ** without much structure or preconceptions and written in a way to encourage adding
** more use-cases by copy-and-paste. Following this pragmatic approach, generalisations ** more use-cases by copy-and-paste. Following this pragmatic approach, generalisations
** and common schemes will emerge eventually. ** and common schemes will emerge eventually.
** @todo WIP-WIP 4/2024 first usage as part of Scheduler stress testing. **
** # Script generation
** The resulting Gnuplot script is combined from several building blocks, and
** passed through the lib::TextTemplate engine to substitute the data and further
** configuration parameters at designated places into the code. Notably, the script
** performs further evaluations at run time, especially in reaction to the number
** of given data rows (relying on the `stats` command of Gnuplot). Data input is
** configured to CSV format and data is pasted as »here document« into a
** _data block variable_ `$RunData`
**
** \par simple plot
** By default, the `points` plotting style is used; this can be overridden
** through the placeholder #KEY_DiagramKind. All given data rows are combined
** into a single plot, using a common x and y axis, and assigning consecutive
** line drawing styles to each data row (from blue to green, yellow, red).
** A maximum of 9 line styles is prepared for drawing. The x/y-ranges and
** custom labels can be added.
**
** \par scatter plot with regression line
** Typically this is used for measurement data, assuming linear relation.
** The data is visualised as (x,y) points, overlaying a linear regression line
** plotted in red. Possibly further data rows can be given, which are then
** plotted into a secondary diagram, arranged below the main measurement data
** and using the same x-axis layout. This additional display is featured only
** when more than 2 columns are present in the data; the number of columns is
** picked up from the _second data row_ (since the first row provides the
** key names used for the legend). In further rows, some data points can be
** omitted. The 3rd data column will be shown as »impulse diagram«, while all
** further data columns will be displayed as points, using the _secondary_
** Y-axis. All axis ranges and labels can be customised. By default, the
** **linear regression model** is calculated by Gnuplot, based on the
** data in columns 1 and 2 (the main measurement data), yet an
** alternative regression line can be defined by parameters.
**
** @todo WIP 4/2024 first usage as part of Scheduler stress testing.
** @see GnuplotGen_test
*/ */
@ -83,9 +118,12 @@ set arrow 11 from graph 0,0 to graph 0,1.08 size screen 0.025,15,60 filled ls 10
# GNUPLOT - data plot from Lumiera # GNUPLOT - data plot from Lumiera
# #
${if Term}set term ${Term} ${ ${if Term
if TermSizeSpec}size ${TermSizeSpec}${endif}${ }set term ${Term} ${
endif Term} if TermSize}size ${TermSize}${endif}
${else}${if TermSize
}set term wxt size ${TermSize}
${endif}${endif Term}
set datafile separator ",;" set datafile separator ",;"
@ -98,19 +136,20 @@ _End_of_Data_
${CommonStyleDef} ${CommonStyleDef}
${AxisGridSetup} ${AxisGridSetup}
${if XLabel ${if Xlabel
}set xlabel '${XLabel}' }set xlabel '${Xlabel}'
${else ${else
}stats $RunData using (abscissaName=strcol(1)) every ::0::0 nooutput }stats $RunData using (abscissaName=strcol(1)) every ::0::0 nooutput
set xlabel abscissaName set xlabel abscissaName
${end if XLabel ${end if Xlabel
}${if YLabel }${if Ylabel
}set ylabel '${YLabel}' ${end if YLabel }set ylabel '${Ylabel}' ${end if Ylabel
} }
${if Yrange} ${if Xrange}
set yrange [${Yrange}] set xrange [${Xrange}] ${endif
${endif }${if Yrange}
set yrange [${Yrange}] ${endif
} }
set key autotitle columnheader tmargin set key autotitle columnheader tmargin
@ -124,17 +163,23 @@ plot for [i=2:*] $RunData using 1:i with ${DiagramKind} linestyle i-1
const string GNUPLOT_SCATTER_REGRESSION = R"~(# const string GNUPLOT_SCATTER_REGRESSION = R"~(#
#
####---------Scatter-Regression-Plot-------------
#
stats $RunData using 1:2 nooutput stats $RunData using 1:2 nooutput
# draw regression line as arrow ${if RegrSlope
}# regression line function (given as parameter)
regLine(x) = ${RegrSlope} * x + ${RegrSocket}
${else
}# regression line function derived from data
regLine(x) = STATS_slope * x + STATS_intercept regLine(x) = STATS_slope * x + STATS_intercept
set arrow 1 from graph 0, first regLine(STATS_min_x) \ ${end if
to graph 1, first regLine(STATS_max_x) \ }
nohead linestyle 9 ${if Xtics
}set xtics ${Xtics}
${else}${if Xrange}${else
}set xrange [0:*]
set xtics 1
${end if}${end if Xtics
}
plots = STATS_columns - 1 plots = STATS_columns - 1
# Adjust layout based on number of data sequences; # Adjust layout based on number of data sequences;
# additional sequences placed into secondary diagram # additional sequences placed into secondary diagram
@ -144,21 +189,22 @@ if (plots > 1) {
set lmargin at screen 0.12 # fixed margins to align diagrams set lmargin at screen 0.12 # fixed margins to align diagrams
set rmargin at screen 0.88 set rmargin at screen 0.88
} }
####------------------------------- #
plot $RunData using 1:2 with points linestyle 1 #
####---------Scatter-Regression-Plot-------------
plot $RunData using 1:2 with points linestyle 1, \
regLine(x) with line linestyle 9
if (plots > 1) { if (plots > 1) {
# switch off decorations for secondary diagram # switch off decorations for secondary diagram
unset arrow 1
unset arrow 10 unset arrow 10
unset arrow 11 unset arrow 11
set border 2+8 set border 2+8
set key bmargin set key bmargin
${if Y2range} ${if Y2range}
set yrange [${Y2range}] set yrange [${Y2range}]
${endif ${endif}
} unset xlabel unset xlabel
set format x "" set format x ""
${if Y2label ${if Y2label
} set ylabel '${Y2label}' ${endif } set ylabel '${Y2label}' ${endif
@ -171,11 +217,13 @@ ${if Y2label
# more than one additional data sequence # more than one additional data sequence
# #
${if Y3range ${if Y3range
} set y2range [${Y3range}] ${endif } set y2range [${Y3range}]
${endif
} set y2tics } set y2tics
${if Y3label ${if Y3label
} set y2label '${Y3label}' offset -1 ${endif } set y2label '${Y3label}' offset -1.5
} ${endif}
####--------------------------------------------- ####---------------------------------------------
plot $RunData using 1:3 with impulses linestyle 3, \ plot $RunData using 1:3 with impulses linestyle 3, \
for [i=4:*] $RunData using 1:i with points linestyle 5+(i-4) axes x1y2 for [i=4:*] $RunData using 1:i with points linestyle 5+(i-4) axes x1y2
@ -188,6 +236,8 @@ ${if Y3label
/** /**
* @remark each column of the given data is featured as sequence * @remark each column of the given data is featured as sequence
* over the first column interpreted as common abscissa. The name * over the first column interpreted as common abscissa. The name
@ -208,6 +258,16 @@ ${if Y3label
} }
/**
* @remark the layout of this diagram differs, based on the given
* number of data columns. The main measurement data is expected in
* columns `[1:2]` and showed in the primary display, adding a
* regression line. When further columns are given, a `multiplot`
* layout is established, showing those additional related series
* in a second diagram below. It may be necessary to define a larger
* canvas with different aspect ratio, which is possibly using the
* placeholder #KEY_TermSize
*/
string string
scatterRegression (ParamRecord params) scatterRegression (ParamRecord params)
{ {

View file

@ -25,17 +25,19 @@
** The visualisation tool [gnuplot] allows for simple data visualisation ** The visualisation tool [gnuplot] allows for simple data visualisation
** in various formats, integrated into a *NIX commandline work environment. ** in various formats, integrated into a *NIX commandline work environment.
** **
** The namespace lib::gnuplot_gen provides .... ** The namespace lib::gnuplot_gen allows to generate diagrams relying on
** some common layout schemes, which can be customised. Data is passed in
** as CSV string; the generated Gnuplot script adapts dynamically to the
** number of data columns given, where the first column always holds
** the common x-axis values. Additional parameters can be added to
** the _data binding_ used for script generation; this binding
** is comprised of key = value settings in a `Rec<GenNode>`
** (Lumiera's »ETD« format for structural data)
** **
** @todo 3/2024 this is an initial draft, shaped by the immediate need to visualise ** @todo 3/2024 this is an initial draft, shaped by the immediate need to visualise
** [measurement data](\ref vault::gear::test::SchedulerStress_test) collected ** [measurement data](\ref vault::gear::test::SchedulerStress_test) collected
** while testing the new [Scheduler](\ref scheduler.hpp) implementation. ** while testing the new [Scheduler](\ref scheduler.hpp) implementation.
** **
** ## Usage
** TBW
** - blah
** - blubb
**
** @see GnuplotGen_test ** @see GnuplotGen_test
** @see SchedulerStress_test ** @see SchedulerStress_test
** @see text-template.hpp ** @see text-template.hpp
@ -67,13 +69,21 @@ namespace gnuplot_gen { ///< preconfigured setup for Gnuplot data visualisation
const string KEY_CSVData = "CSVData"; const string KEY_CSVData = "CSVData";
const string KEY_DiagramKind = "DiagramKind"; const string KEY_DiagramKind = "DiagramKind";
const string KEY_Term = "Term";
const string KEY_TermSize = "TermSize";
const string KEY_Xtics = "Xtics";
const string KEY_Xrange = "Xrange";
const string KEY_Yrange = "Yrange"; const string KEY_Yrange = "Yrange";
const string KEY_Y2range = "Y2range"; const string KEY_Y2range = "Y2range";
const string KEY_Y3range = "Y3range"; const string KEY_Y3range = "Y3range";
const string KEY_Xlabel = "Xlabel"; const string KEY_Xlabel = "Xlabel";
const string KEY_Ylabel = "Ylabel"; const string KEY_Ylabel = "Ylabel";
const string KEY_Y2label = "Y2label"; const string KEY_Y2label = "Y2label";
const string KEY_Y3label = "Y2label"; const string KEY_Y3label = "Y3label";
const string KEY_RegrSocket = "RegrSocket";
const string KEY_RegrSlope = "RegrSlope";

View file

@ -414,7 +414,7 @@ return: 0
END END
PLANNED "generate a Gnuplot diagram" GnuplotGen_test <<END TEST "generate a Gnuplot diagram" GnuplotGen_test <<END
return: 0 return: 0
END END

View file

@ -27,11 +27,10 @@
#include "lib/test/run.hpp" #include "lib/test/run.hpp"
#include "lib/test/test-helper.hpp"///////////////////////TODO
#include "lib/gnuplot-gen.hpp" #include "lib/gnuplot-gen.hpp"
#include "lib/iter-explorer.hpp" #include "lib/iter-explorer.hpp"
#include "lib/format-cout.hpp"///////////////////////TODO #include "lib/format-cout.hpp"
#include "lib/test/diagnostic-output.hpp"///////////////////////TODO #include "lib/util.hpp"
using lib::stat::CSVData; using lib::stat::CSVData;
using util::contains; using util::contains;
@ -56,18 +55,11 @@ namespace test{
{ {
simpeUsage(); simpeUsage();
plot_scatter_regression(); plot_scatter_regression();
verify_keySubstituton(); verify_customisation();
verify_conditional();
verify_iteration();
verify_Map_binding();
verify_ETD_binding();
} }
/** @test Create simple (x,y) data point visualisation /** @test Create simple (x,y) data point visualisation */
* @todo WIP 4/24 ✔ define ⟶ ✔ implement
*/
void void
simpeUsage() simpeUsage()
{ {
@ -97,9 +89,7 @@ namespace test{
/** @test Create a (x,y) scatter plot with regression line /** @test Create a (x,y) scatter plot with regression line
* - in the simple case, there is only one diagram * - in the simple case, there is only one diagram
* - use the `stats` command to let Gnuplot calculate the linear regression * - use the `stats` command to let Gnuplot calculate the linear regression
* - draw a regrsssion line using the `arrow` command * - draw a regression line as function representing the regression model
* and a function representing the linear regression model
* @todo WIP 4/24 🔁 define ⟶ ✔ implement
*/ */
void void
plot_scatter_regression() plot_scatter_regression()
@ -120,7 +110,6 @@ namespace test{
CHECK (contains (gnuplot, "\"step\",\"fib\"")); CHECK (contains (gnuplot, "\"step\",\"fib\""));
CHECK (contains (gnuplot, "7,21.55")); CHECK (contains (gnuplot, "7,21.55"));
CHECK (contains (gnuplot, "regLine(x) = STATS_slope * x + STATS_intercept")); CHECK (contains (gnuplot, "regLine(x) = STATS_slope * x + STATS_intercept"));
CHECK (contains (gnuplot, "set arrow 1 from graph 0, first regLine(STATS_min_x)"));
CHECK (contains (gnuplot, "plot $RunData using 1:2 with points")); CHECK (contains (gnuplot, "plot $RunData using 1:2 with points"));
@ -135,7 +124,7 @@ namespace test{
,{6,13, 1.3, 110 } ,{6,13, 1.3, 110 }
,{7,21, 1.4, 100 } ,{7,21, 1.4, 100 }
}}); }});
cout << gnuplot <<endl; // cout << gnuplot <<endl;
// more than one data row given => using multiplot layout // more than one data row given => using multiplot layout
CHECK (contains (gnuplot, "set multiplot")); CHECK (contains (gnuplot, "set multiplot"));
@ -144,49 +133,54 @@ namespace test{
} }
/** @test TODO /** @test various customisations through additional parameters
* @todo WIP 4/24 🔁 define ⟶ implement * - a custom defined regression line
* - use a specific output »term« and specify canvas size
* - define the common horizontal data range and x-tic spacing
* - define display ranges for 3 different Y-axis
* - define custom labels for all axes
* @note when using additional parameters, csv data
* must also be given explicitly as `KEY_CSVData`
*/ */
void void
verify_keySubstituton() verify_customisation()
{
UNIMPLEMENTED ("nebbich");
}
/** @test TODO
* @todo WIP 4/24 🔁 define ⟶ implement
*/
void
verify_conditional()
{
}
/** @test TODO
* @todo WIP 4/24 🔁 define ⟶ implement
*/
void
verify_iteration()
{
}
/** @test TODO
* @todo WIP 4/24 🔁 define ⟶ implement
*/
void
verify_Map_binding()
{
}
/** @test TODO
* @todo WIP 4/24 🔁 define ⟶ implement
*/
void
verify_ETD_binding()
{ {
string csv =
CSVData{{"abscissa","points","e1","e2","e3"}
,{{1,1 , 1.1,"" ,210}
,{2,2 , 1.2,150,220}
,{3,5 , 5.5,140}
}};
using namespace gnuplot_gen;
string gnuplot = scatterRegression(
ParamRecord()
.set(KEY_CSVData , csv)
.set(KEY_RegrSocket, 3)
.set(KEY_RegrSlope, -1.5)
.set(KEY_Xtics , 2)
.set(KEY_Xrange , "-1:5.5")
.set(KEY_Yrange , "0:6")
.set(KEY_Y2range, "1.1:1.5")
.set(KEY_Y3range, "100:*")
.set(KEY_Xlabel , "common axis")
.set(KEY_Ylabel , "measurement")
.set(KEY_Y2label, "auxiliary-1")
.set(KEY_Y3label, "auxiliary-2")
.set(KEY_TermSize, "500,800")
);
// cout << gnuplot <<endl;
CHECK (contains (gnuplot, "set term wxt size 500,800"));
CHECK (contains (gnuplot, "\"abscissa\",\"points\",\"e1\",\"e2\",\"e3\""));
CHECK (contains (gnuplot, "regLine(x) = -1.5 * x + 3"));
CHECK (contains (gnuplot, "set xlabel 'common axis'"));
CHECK (contains (gnuplot, "set ylabel 'measurement'"));
CHECK (contains (gnuplot, "set xrange [-1:5.5]"));
CHECK (contains (gnuplot, "set yrange [0:6]"));
CHECK (contains (gnuplot, "set yrange [1.1:1.5]"));
CHECK (contains (gnuplot, "set ylabel 'auxiliary-1'"));
CHECK (contains (gnuplot, "set y2range [100:*]"));
CHECK (contains (gnuplot, "set y2label 'auxiliary-2'"));
} }
}; };

View file

@ -112386,13 +112386,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node> </node>
</node> </node>
</node> </node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1710079820663" ID="ID_346209836" MODIFIED="1712107106974" TEXT="ein gnuplot-Skript generieren"> <node COLOR="#338800" CREATED="1710079820663" ID="ID_346209836" MODIFIED="1712165155677" TEXT="ein Gnuplot-Skript generieren">
<icon BUILTIN="pencil"/> <icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710633755833" ID="ID_395770848" MODIFIED="1710633858137" TEXT="Grundlagen Gnuplot lernen"> <node BACKGROUND_COLOR="#b6c3c8" COLOR="#2a44ae" CREATED="1710633755833" ID="ID_395770848" MODIFIED="1712165207008" TEXT="Grundlagen Gnuplot lernen">
<arrowlink COLOR="#425fc8" DESTINATION="ID_1898552649" ENDARROW="Default" ENDINCLINATION="-1042;110;" ID="Arrow_ID_1130805562" STARTARROW="None" STARTINCLINATION="-1030;94;"/> <arrowlink COLOR="#425fc8" DESTINATION="ID_1898552649" ENDARROW="Default" ENDINCLINATION="-1042;110;" ID="Arrow_ID_1130805562" STARTARROW="None" STARTINCLINATION="-1030;94;"/>
<icon BUILTIN="info"/> <icon BUILTIN="info"/>
</node> </node>
<node COLOR="#338800" CREATED="1710079859600" ID="ID_1865864348" MODIFIED="1711767335018" TEXT="Skript aufbauen"> <node COLOR="#338800" CREATED="1710079859600" FOLDED="true" ID="ID_1865864348" MODIFIED="1711767335018" TEXT="Skript aufbauen">
<icon BUILTIN="button_ok"/> <icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1710079895431" ID="ID_129580336" MODIFIED="1711767148348" TEXT="inline-CSV lesen"> <node COLOR="#338800" CREATED="1710079895431" ID="ID_129580336" MODIFIED="1711767148348" TEXT="inline-CSV lesen">
<icon BUILTIN="button_ok"/> <icon BUILTIN="button_ok"/>
@ -112406,8 +112406,25 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node> </node>
<node COLOR="#338800" CREATED="1711740556574" ID="ID_539287826" MODIFIED="1711767325444" TEXT="Regressionslinie"> <node COLOR="#338800" CREATED="1711740556574" ID="ID_539287826" MODIFIED="1711767325444" TEXT="Regressionslinie">
<icon BUILTIN="button_ok"/> <icon BUILTIN="button_ok"/>
<node CREATED="1711767163798" ID="ID_1994488422" MODIFIED="1711767172498" TEXT="entweder eine Kurven-Funktion definieren"/> <node CREATED="1711767163798" ID="ID_1994488422" MODIFIED="1712158862171" TEXT="entweder eine Kurven-Funktion definieren">
<node CREATED="1711671270918" ID="ID_945426768" LINK="http://gnuplot.info/docs_5.5/loc9771.html" MODIFIED="1711767205997" TEXT="oder einen &#xbb;Arrow&#xab; verwenden und Koordinaten ausrechnen"/> <icon BUILTIN="forward"/>
</node>
<node COLOR="#5b280f" CREATED="1711671270918" ID="ID_945426768" LINK="http://gnuplot.info/docs_5.5/loc9771.html" MODIFIED="1712158772924" TEXT="oder einen &#xbb;Arrow&#xab; verwenden und Koordinaten ausrechnen">
<icon BUILTIN="button_cancel"/>
<node CREATED="1712158776473" ID="ID_616853093" MODIFIED="1712158927050" TEXT="ist letztlich keine gute Idee">
<linktarget COLOR="#913855" DESTINATION="ID_616853093" ENDARROW="Default" ENDINCLINATION="224;23;" ID="Arrow_ID_376194184" SOURCE="ID_651930519" STARTARROW="None" STARTINCLINATION="430;-45;"/>
</node>
<node CREATED="1712158783773" ID="ID_1132746832" MODIFIED="1712158847988" TEXT="weil man die Anfangs / Endpunkte explizit ausrechnen mu&#xdf;">
<richcontent TYPE="NOTE"><html>
<head/>
<body>
<p>
...was nicht m&#246;glich ist, sofern man Gnuplot irgendwie den xrange automatisch bestimmen l&#228;&#223;t (dann ist der xrange n&#228;mlich erst <i>nach</i>&#160; dem Plotten bekannt)
</p>
</body>
</html></richcontent>
</node>
</node>
</node> </node>
<node COLOR="#338800" CREATED="1710079916553" ID="ID_1466798395" MODIFIED="1711767279959" TEXT="Legende hinzuf&#xfc;gen"> <node COLOR="#338800" CREATED="1710079916553" ID="ID_1466798395" MODIFIED="1711767279959" TEXT="Legende hinzuf&#xfc;gen">
<icon BUILTIN="button_ok"/> <icon BUILTIN="button_ok"/>
@ -114334,8 +114351,8 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</node> </node>
</node> </node>
</node> </node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1711767367983" ID="ID_447481681" MODIFIED="1711904772361" TEXT="geignet in Templating &#xfc;bersetzen"> <node COLOR="#338800" CREATED="1711767367983" ID="ID_447481681" MODIFIED="1712165061379" TEXT="geignet in Templating &#xfc;bersetzen">
<icon BUILTIN="pencil"/> <icon BUILTIN="button_ok"/>
<node CREATED="1711815238130" ID="ID_644083123" MODIFIED="1711815256928" TEXT="Grundidee: Bausteine + externe Steuer-Mechanik"> <node CREATED="1711815238130" ID="ID_644083123" MODIFIED="1711815256928" TEXT="Grundidee: Bausteine + externe Steuer-Mechanik">
<icon BUILTIN="idea"/> <icon BUILTIN="idea"/>
<node CREATED="1711815907291" ID="ID_530652307" MODIFIED="1711815930539" TEXT="Templates relativ &#xbb;dumm&#xab; halten"/> <node CREATED="1711815907291" ID="ID_530652307" MODIFIED="1711815930539" TEXT="Templates relativ &#xbb;dumm&#xab; halten"/>
@ -114352,7 +114369,7 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<node CREATED="1711816185232" ID="ID_301292459" MODIFIED="1711816215559" TEXT="Range-Grenzen und Namen der Achsenbeschriftungen"/> <node CREATED="1711816185232" ID="ID_301292459" MODIFIED="1711816215559" TEXT="Range-Grenzen und Namen der Achsenbeschriftungen"/>
<node CREATED="1711816271564" ID="ID_1862603482" MODIFIED="1711816277255" TEXT="Parameter der Regressionslinie"/> <node CREATED="1711816271564" ID="ID_1862603482" MODIFIED="1711816277255" TEXT="Parameter der Regressionslinie"/>
</node> </node>
<node COLOR="#338800" CREATED="1711816316013" ID="ID_1527861975" MODIFIED="1711904757510" TEXT="Rahmen schaffen"> <node COLOR="#338800" CREATED="1711816316013" FOLDED="true" ID="ID_1527861975" MODIFIED="1711904757510" TEXT="Rahmen schaffen">
<icon BUILTIN="button_ok"/> <icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1711816320800" ID="ID_310548089" MODIFIED="1711845412382" TEXT="separate Translation-Unit"> <node COLOR="#338800" CREATED="1711816320800" ID="ID_310548089" MODIFIED="1711845412382" TEXT="separate Translation-Unit">
<icon BUILTIN="button_ok"/> <icon BUILTIN="button_ok"/>
@ -114377,10 +114394,10 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<icon BUILTIN="button_ok"/> <icon BUILTIN="button_ok"/>
</node> </node>
</node> </node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1711816503707" ID="ID_1610562996" MODIFIED="1711816512171" TEXT="Hilfsmittel zur Aufbereitung"> <node COLOR="#338800" CREATED="1711816503707" ID="ID_1610562996" MODIFIED="1712163894228" TEXT="Hilfsmittel zur Aufbereitung">
<icon BUILTIN="flag-yellow"/> <icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1711816605957" ID="ID_1301642198" MODIFIED="1711816625887" TEXT="Notation f&#xfc;r Parmeter-Konfiguration"> <node COLOR="#338800" CREATED="1711816605957" ID="ID_1301642198" MODIFIED="1712163895261" TEXT="Notation f&#xfc;r Parmeter-Konfiguration">
<icon BUILTIN="flag-yellow"/> <icon BUILTIN="button_ok"/>
<node CREATED="1711816632267" ID="ID_243539327" MODIFIED="1711816646604" TEXT="auf ETD / MakeRec() aufbauen"/> <node CREATED="1711816632267" ID="ID_243539327" MODIFIED="1711816646604" TEXT="auf ETD / MakeRec() aufbauen"/>
<node CREATED="1711816648544" ID="ID_1216726530" MODIFIED="1711816663402" TEXT="damit ist auch die String-Konvertierung schon gew&#xe4;hrleistet"/> <node CREATED="1711816648544" ID="ID_1216726530" MODIFIED="1711816663402" TEXT="damit ist auch die String-Konvertierung schon gew&#xe4;hrleistet"/>
</node> </node>
@ -114449,8 +114466,8 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<node CREATED="1711900361616" ID="ID_1245877883" MODIFIED="1711900371643" TEXT="dann gibt es zus&#xe4;tzliche Builder, die schon Teile vorbereiten"/> <node CREATED="1711900361616" ID="ID_1245877883" MODIFIED="1711900371643" TEXT="dann gibt es zus&#xe4;tzliche Builder, die schon Teile vorbereiten"/>
</node> </node>
</node> </node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1711820846814" ID="ID_131434294" MODIFIED="1712107103288" TEXT="Template-Bausteine"> <node COLOR="#338800" CREATED="1711820846814" ID="ID_131434294" MODIFIED="1712165063590" TEXT="Template-Bausteine">
<icon BUILTIN="pencil"/> <icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1711820852404" ID="ID_1098550176" MODIFIED="1711904777126" TEXT="einfacher Daten-Plot"> <node COLOR="#338800" CREATED="1711820852404" ID="ID_1098550176" MODIFIED="1711904777126" TEXT="einfacher Daten-Plot">
<icon BUILTIN="button_ok"/> <icon BUILTIN="button_ok"/>
<node CREATED="1711820876736" ID="ID_1449855332" MODIFIED="1711820912379" TEXT="gemeinsame Abszisse + 1...9 Datenreihen"/> <node CREATED="1711820876736" ID="ID_1449855332" MODIFIED="1711820912379" TEXT="gemeinsame Abszisse + 1...9 Datenreihen"/>
@ -114550,8 +114567,8 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</node> </node>
<node COLOR="#338800" CREATED="1712101781128" ID="ID_304832758" MODIFIED="1712105281865" TEXT="Regrssions-Parameter"> <node COLOR="#338800" CREATED="1712101781128" ID="ID_304832758" MODIFIED="1712105281865" TEXT="Regrssions-Parameter">
<icon BUILTIN="button_ok"/> <icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1712101788544" ID="ID_703744386" MODIFIED="1712105228379" TEXT="kann man entweder vom User durchgeben lassen"> <node COLOR="#338800" CREATED="1712101788544" ID="ID_703744386" MODIFIED="1712165123948" TEXT="kann man entweder vom User durchgeben lassen">
<icon BUILTIN="flag-yellow"/> <icon BUILTIN="button_ok"/>
</node> </node>
<node COLOR="#338800" CREATED="1712101798926" ID="ID_259712004" MODIFIED="1712105225760" TEXT="...oder von Gnuplot selber bestimmen"> <node COLOR="#338800" CREATED="1712101798926" ID="ID_259712004" MODIFIED="1712105225760" TEXT="...oder von Gnuplot selber bestimmen">
<icon BUILTIN="button_ok"/> <icon BUILTIN="button_ok"/>
@ -114562,9 +114579,15 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<node COLOR="#338800" CREATED="1712105236313" ID="ID_445047208" MODIFIED="1712105251309" TEXT="Hierf&#xfc;r Funktion regLine(x) in gnuplot definieren"> <node COLOR="#338800" CREATED="1712105236313" ID="ID_445047208" MODIFIED="1712105251309" TEXT="Hierf&#xfc;r Funktion regLine(x) in gnuplot definieren">
<icon BUILTIN="button_ok"/> <icon BUILTIN="button_ok"/>
</node> </node>
<node COLOR="#338800" CREATED="1712105256166" ID="ID_411655467" MODIFIED="1712105278628" TEXT="&#x27f9; diese dann verwenden f&#xfc;r arrow-command"> <node COLOR="#5b280f" CREATED="1712105256166" ID="ID_411655467" MODIFIED="1712158873748" TEXT="&#x27f9; diese dann verwenden f&#xfc;r arrow-command">
<icon BUILTIN="button_ok"/> <icon BUILTIN="button_cancel"/>
<node CREATED="1712158876637" ID="ID_651930519" MODIFIED="1712158927049" TEXT="das ist problematisch">
<arrowlink COLOR="#913855" DESTINATION="ID_616853093" ENDARROW="Default" ENDINCLINATION="224;23;" ID="Arrow_ID_376194184" STARTARROW="None" STARTINCLINATION="430;-45;"/>
<icon BUILTIN="stop-sign"/>
</node> </node>
<node CREATED="1712158885400" ID="ID_595958717" MODIFIED="1712158893497" TEXT="und unn&#xf6;tig, wenn wir schon die Funktion haben"/>
</node>
<node CREATED="1712159156179" ID="ID_986549444" MODIFIED="1712159169384" TEXT="stattdessen regLine(x) direkt mit plotten"/>
</node> </node>
</node> </node>
</node> </node>
@ -114590,9 +114613,9 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</node> </node>
</node> </node>
</node> </node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1711820647889" ID="ID_149856563" MODIFIED="1711845599165" TEXT="GnuplotGen_test"> <node COLOR="#338800" CREATED="1711820647889" ID="ID_149856563" MODIFIED="1712165118129" TEXT="GnuplotGen_test">
<icon BUILTIN="pencil"/> <icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1711820662341" ID="ID_1728359549" MODIFIED="1712107237930" TEXT="einfachster Testfall: ein Daten-Punkt-Plot"> <node COLOR="#338800" CREATED="1711820662341" FOLDED="true" ID="ID_1728359549" MODIFIED="1712165149775" TEXT="einfachster Testfall: ein Daten-Punkt-Plot">
<icon BUILTIN="button_ok"/> <icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1711845516384" ID="ID_1778551442" MODIFIED="1711845526641" TEXT="kann einfaches Diagramm generieren"> <node COLOR="#338800" CREATED="1711845516384" ID="ID_1778551442" MODIFIED="1711845526641" TEXT="kann einfaches Diagramm generieren">
<icon BUILTIN="button_ok"/> <icon BUILTIN="button_ok"/>
@ -114610,23 +114633,20 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
<icon BUILTIN="button_ok"/> <icon BUILTIN="button_ok"/>
</node> </node>
</node> </node>
<node COLOR="#338800" CREATED="1712107249502" ID="ID_758586411" MODIFIED="1712107251833" TEXT="plot_scatter_regression"> <node COLOR="#338800" CREATED="1712107249502" FOLDED="true" ID="ID_758586411" MODIFIED="1712165147408" TEXT="plot_scatter_regression">
<icon BUILTIN="button_ok"/> <icon BUILTIN="button_ok"/>
<node COLOR="#5b280f" CREATED="1712107263609" ID="ID_1696889047" MODIFIED="1712107278412" TEXT="Verifikation hat ihre Grenzen"> <node COLOR="#5b280f" CREATED="1712107263609" ID="ID_1696889047" MODIFIED="1712107278412" TEXT="Verifikation hat ihre Grenzen">
<icon BUILTIN="yes"/> <icon BUILTIN="yes"/>
<icon BUILTIN="stop-sign"/> <icon BUILTIN="stop-sign"/>
<node CREATED="1712107282261" ID="ID_848988536" MODIFIED="1712107365616" TEXT="bedingt durch die Logik im Gnuplot-Skript"> <node CREATED="1712107282261" ID="ID_848988536" MODIFIED="1712107365616" TEXT="bedingt durch die Logik im Gnuplot-Skript">
<richcontent TYPE="NOTE"><html> <richcontent TYPE="NOTE"><html>
<head> <head/>
</head>
<body> <body>
<p> <p>
man kann hier eigentlich nur stichprobenartig verifizieren, da&#223; das jeweilige Template zum Einsatz kam, und da&#223; einige markante Werte per Text-Templating eingebaut wurden. Also z.B. die Datenheader, oder eine Achsenbeschriftung. man kann hier eigentlich nur stichprobenartig verifizieren, da&#223; das jeweilige Template zum Einsatz kam, und da&#223; einige markante Werte per Text-Templating eingebaut wurden. Also z.B. die Datenheader, oder eine Achsenbeschriftung.
</p> </p>
</body> </body>
</html> </html></richcontent>
</richcontent>
</node> </node>
<node COLOR="#5b280f" CREATED="1712107290460" ID="ID_352326813" MODIFIED="1712107309763" TEXT="wir k&#xf6;nnen / wollen nicht Gnuplot in der Testsuite aufrufen"> <node COLOR="#5b280f" CREATED="1712107290460" ID="ID_352326813" MODIFIED="1712107309763" TEXT="wir k&#xf6;nnen / wollen nicht Gnuplot in der Testsuite aufrufen">
<icon BUILTIN="closed"/> <icon BUILTIN="closed"/>
@ -114639,7 +114659,26 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</node> </node>
</node> </node>
</node> </node>
<node COLOR="#338800" CREATED="1712157571036" FOLDED="true" ID="ID_594850034" MODIFIED="1712165148496" TEXT="verify_customisation">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1712157579419" ID="ID_862141948" MODIFIED="1712165115431" TEXT="durch manuelle Inspektion pr&#xfc;fen">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1712157601048" ID="ID_1356431130" MODIFIED="1712165112964" TEXT="kommen alle gesetzten Einstellungen im Skript an?"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1712157633183" ID="ID_182422803" MODIFIED="1712165112964" TEXT="sind die Bereiche korrekt gesetzt?"/>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1712157642106" ID="ID_1203874444" MODIFIED="1712165112964" TEXT="stimmt die Regressionsline auch mit xrange?">
<node CREATED="1712158732758" ID="ID_1254764279" MODIFIED="1712158748896" TEXT="zeigt sich: ist so nicht realisierbar"/>
<node CREATED="1712165090926" ID="ID_1866837123" MODIFIED="1712165099841" TEXT="stattdessen : Funktion verwenden"/>
</node> </node>
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1712165101021" ID="ID_1355216021" MODIFIED="1712165112964" TEXT="Fall-back wenn keine x-range gegeben"/>
</node>
<node COLOR="#338800" CREATED="1712165069402" ID="ID_1643060238" MODIFIED="1712165081801" TEXT="enige Verifikationen f&#xfc;r durchgereichte Konfiguration">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1712165247528" ID="ID_1095964212" MODIFIED="1712165254925" TEXT="Regression berechnen und visualisieren">
<icon BUILTIN="flag-yellow"/>
</node> </node>
</node> </node>
</node> </node>