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
** more use-cases by copy-and-paste. Following this pragmatic approach, generalisations
** 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
#
${if Term}set term ${Term} ${
if TermSizeSpec}size ${TermSizeSpec}${endif}${
endif Term}
${if Term
}set term ${Term} ${
if TermSize}size ${TermSize}${endif}
${else}${if TermSize
}set term wxt size ${TermSize}
${endif}${endif Term}
set datafile separator ",;"
@ -98,19 +136,20 @@ _End_of_Data_
${CommonStyleDef}
${AxisGridSetup}
${if XLabel
}set xlabel '${XLabel}'
${if Xlabel
}set xlabel '${Xlabel}'
${else
}stats $RunData using (abscissaName=strcol(1)) every ::0::0 nooutput
set xlabel abscissaName
${end if XLabel
}${if YLabel
}set ylabel '${YLabel}' ${end if YLabel
${end if Xlabel
}${if Ylabel
}set ylabel '${Ylabel}' ${end if Ylabel
}
${if Yrange}
set yrange [${Yrange}]
${endif
${if Xrange}
set xrange [${Xrange}] ${endif
}${if Yrange}
set yrange [${Yrange}] ${endif
}
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"~(#
#
####---------Scatter-Regression-Plot-------------
#
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
set arrow 1 from graph 0, first regLine(STATS_min_x) \
to graph 1, first regLine(STATS_max_x) \
nohead linestyle 9
${end if
}
${if Xtics
}set xtics ${Xtics}
${else}${if Xrange}${else
}set xrange [0:*]
set xtics 1
${end if}${end if Xtics
}
plots = STATS_columns - 1
# Adjust layout based on number of data sequences;
# 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 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) {
# switch off decorations for secondary diagram
unset arrow 1
unset arrow 10
unset arrow 11
set border 2+8
set key bmargin
${if Y2range}
set yrange [${Y2range}]
${endif
} unset xlabel
${endif}
unset xlabel
set format x ""
${if Y2label
} set ylabel '${Y2label}' ${endif
@ -171,11 +217,13 @@ ${if Y2label
# more than one additional data sequence
#
${if Y3range
} set y2range [${Y3range}] ${endif
} set y2range [${Y3range}]
${endif
} set y2tics
${if Y3label
} set y2label '${Y3label}' offset -1 ${endif
}
} set y2label '${Y3label}' offset -1.5
${endif}
####---------------------------------------------
plot $RunData using 1:3 with impulses linestyle 3, \
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
* 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
scatterRegression (ParamRecord params)
{

View file

@ -25,17 +25,19 @@
** The visualisation tool [gnuplot] allows for simple data visualisation
** 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
** [measurement data](\ref vault::gear::test::SchedulerStress_test) collected
** while testing the new [Scheduler](\ref scheduler.hpp) implementation.
**
** ## Usage
** TBW
** - blah
** - blubb
**
** @see GnuplotGen_test
** @see SchedulerStress_test
** @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_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_Y2range = "Y2range";
const string KEY_Y3range = "Y3range";
const string KEY_Xlabel = "Xlabel";
const string KEY_Ylabel = "Ylabel";
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
PLANNED "generate a Gnuplot diagram" GnuplotGen_test <<END
TEST "generate a Gnuplot diagram" GnuplotGen_test <<END
return: 0
END

View file

@ -27,11 +27,10 @@
#include "lib/test/run.hpp"
#include "lib/test/test-helper.hpp"///////////////////////TODO
#include "lib/gnuplot-gen.hpp"
#include "lib/iter-explorer.hpp"
#include "lib/format-cout.hpp"///////////////////////TODO
#include "lib/test/diagnostic-output.hpp"///////////////////////TODO
#include "lib/format-cout.hpp"
#include "lib/util.hpp"
using lib::stat::CSVData;
using util::contains;
@ -56,18 +55,11 @@ namespace test{
{
simpeUsage();
plot_scatter_regression();
verify_keySubstituton();
verify_conditional();
verify_iteration();
verify_Map_binding();
verify_ETD_binding();
verify_customisation();
}
/** @test Create simple (x,y) data point visualisation
* @todo WIP 4/24 define implement
*/
/** @test Create simple (x,y) data point visualisation */
void
simpeUsage()
{
@ -97,9 +89,7 @@ namespace test{
/** @test Create a (x,y) scatter plot with regression line
* - in the simple case, there is only one diagram
* - use the `stats` command to let Gnuplot calculate the linear regression
* - draw a regrsssion line using the `arrow` command
* and a function representing the linear regression model
* @todo WIP 4/24 🔁 define implement
* - draw a regression line as function representing the regression model
*/
void
plot_scatter_regression()
@ -120,7 +110,6 @@ namespace test{
CHECK (contains (gnuplot, "\"step\",\"fib\""));
CHECK (contains (gnuplot, "7,21.55"));
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"));
@ -135,7 +124,7 @@ namespace test{
,{6,13, 1.3, 110 }
,{7,21, 1.4, 100 }
}});
cout << gnuplot <<endl;
// cout << gnuplot <<endl;
// more than one data row given => using multiplot layout
CHECK (contains (gnuplot, "set multiplot"));
@ -144,49 +133,54 @@ namespace test{
}
/** @test TODO
* @todo WIP 4/24 🔁 define implement
/** @test various customisations through additional parameters
* - 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
verify_keySubstituton()
{
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()
verify_customisation()
{
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 BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1710079820663" ID="ID_346209836" MODIFIED="1712107106974" TEXT="ein gnuplot-Skript generieren">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1710633755833" ID="ID_395770848" MODIFIED="1710633858137" TEXT="Grundlagen Gnuplot lernen">
<node COLOR="#338800" CREATED="1710079820663" ID="ID_346209836" MODIFIED="1712165155677" TEXT="ein Gnuplot-Skript generieren">
<icon BUILTIN="button_ok"/>
<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;"/>
<icon BUILTIN="info"/>
</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"/>
<node COLOR="#338800" CREATED="1710079895431" ID="ID_129580336" MODIFIED="1711767148348" TEXT="inline-CSV lesen">
<icon BUILTIN="button_ok"/>
@ -112406,8 +112406,25 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node COLOR="#338800" CREATED="1711740556574" ID="ID_539287826" MODIFIED="1711767325444" TEXT="Regressionslinie">
<icon BUILTIN="button_ok"/>
<node CREATED="1711767163798" ID="ID_1994488422" MODIFIED="1711767172498" 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"/>
<node CREATED="1711767163798" ID="ID_1994488422" MODIFIED="1712158862171" TEXT="entweder eine Kurven-Funktion definieren">
<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 COLOR="#338800" CREATED="1710079916553" ID="ID_1466798395" MODIFIED="1711767279959" TEXT="Legende hinzuf&#xfc;gen">
<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 BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1711767367983" ID="ID_447481681" MODIFIED="1711904772361" TEXT="geignet in Templating &#xfc;bersetzen">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1711767367983" ID="ID_447481681" MODIFIED="1712165061379" TEXT="geignet in Templating &#xfc;bersetzen">
<icon BUILTIN="button_ok"/>
<node CREATED="1711815238130" ID="ID_644083123" MODIFIED="1711815256928" TEXT="Grundidee: Bausteine + externe Steuer-Mechanik">
<icon BUILTIN="idea"/>
<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="1711816271564" ID="ID_1862603482" MODIFIED="1711816277255" TEXT="Parameter der Regressionslinie"/>
</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"/>
<node COLOR="#338800" CREATED="1711816320800" ID="ID_310548089" MODIFIED="1711845412382" TEXT="separate Translation-Unit">
<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"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1711816503707" ID="ID_1610562996" MODIFIED="1711816512171" TEXT="Hilfsmittel zur Aufbereitung">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1711816605957" ID="ID_1301642198" MODIFIED="1711816625887" TEXT="Notation f&#xfc;r Parmeter-Konfiguration">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1711816503707" ID="ID_1610562996" MODIFIED="1712163894228" TEXT="Hilfsmittel zur Aufbereitung">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1711816605957" ID="ID_1301642198" MODIFIED="1712163895261" TEXT="Notation f&#xfc;r Parmeter-Konfiguration">
<icon BUILTIN="button_ok"/>
<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>
@ -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>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1711820846814" ID="ID_131434294" MODIFIED="1712107103288" TEXT="Template-Bausteine">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1711820846814" ID="ID_131434294" MODIFIED="1712165063590" TEXT="Template-Bausteine">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1711820852404" ID="ID_1098550176" MODIFIED="1711904777126" TEXT="einfacher Daten-Plot">
<icon BUILTIN="button_ok"/>
<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 COLOR="#338800" CREATED="1712101781128" ID="ID_304832758" MODIFIED="1712105281865" TEXT="Regrssions-Parameter">
<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">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#338800" CREATED="1712101788544" ID="ID_703744386" MODIFIED="1712165123948" TEXT="kann man entweder vom User durchgeben lassen">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1712101798926" ID="ID_259712004" MODIFIED="1712105225760" TEXT="...oder von Gnuplot selber bestimmen">
<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">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1712105256166" ID="ID_411655467" MODIFIED="1712105278628" TEXT="&#x27f9; diese dann verwenden f&#xfc;r arrow-command">
<icon BUILTIN="button_ok"/>
<node COLOR="#5b280f" CREATED="1712105256166" ID="ID_411655467" MODIFIED="1712158873748" TEXT="&#x27f9; diese dann verwenden f&#xfc;r arrow-command">
<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 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>
@ -114590,9 +114613,9 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1711820647889" ID="ID_149856563" MODIFIED="1711845599165" TEXT="GnuplotGen_test">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1711820662341" ID="ID_1728359549" MODIFIED="1712107237930" TEXT="einfachster Testfall: ein Daten-Punkt-Plot">
<node COLOR="#338800" CREATED="1711820647889" ID="ID_149856563" MODIFIED="1712165118129" TEXT="GnuplotGen_test">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1711820662341" FOLDED="true" ID="ID_1728359549" MODIFIED="1712165149775" TEXT="einfachster Testfall: ein Daten-Punkt-Plot">
<icon BUILTIN="button_ok"/>
<node COLOR="#338800" CREATED="1711845516384" ID="ID_1778551442" MODIFIED="1711845526641" TEXT="kann einfaches Diagramm generieren">
<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"/>
</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"/>
<node COLOR="#5b280f" CREATED="1712107263609" ID="ID_1696889047" MODIFIED="1712107278412" TEXT="Verifikation hat ihre Grenzen">
<icon BUILTIN="yes"/>
<icon BUILTIN="stop-sign"/>
<node CREATED="1712107282261" ID="ID_848988536" MODIFIED="1712107365616" TEXT="bedingt durch die Logik im Gnuplot-Skript">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<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.
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<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"/>
@ -114639,7 +114659,26 @@ std::cout &lt;&lt; tmpl.render({&quot;what&quot;, &quot;World&quot;}) &lt;&lt; s
</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 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>