避免 gnuplot 脚本中的代码重复

Avoiding code duplication in gnuplot script

情况:

我有一个相当复杂但通用的 gnuplot 脚本来可视化多个测量值。但是,对于我想要避免的实际绘图命令,仍然存在大量代码重复。

最小的例子(省略了许多变量和选项)可能如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define variables here
folder="folder/"
algo="Version1 Version2"

#label:start
#plot first specific e.g. runtime of a program
set output folder."/Runtime".fileext
plot for[i=1:words(algo)] \\
   folder.word(algo,i).".data" using 1:2 .....

#plot antoher specific e.g. Cache Misses
set output folder."/CacheMisses".fileext
plot for[i=1:words(algo)] \\
   folder.word(algo,i).".data" using 1:3 .....

#label:end

#change some variables e.g.
algo="Version3 Version4"

#repeat everything between label:start and label:end

在我的真实脚本中,一个块中有大约 20 个图(在 label:startlabel:end 之间)和大量块(具有不同的变量)。

问题:

有没有一种简单的方法可以用通用或文本替换方法替换 gnuplot"代码"块以避免重复?

我想要的脚本如下所示:

1
2
3
4
5
6
7
8
9
10
#define variables here
folder="folder/"
algo="Version1 Version2"

magical_command(...)

#change some variables e.g.
algo="Version3 Version4"

magical_command(...)

我已经知道了:

  • gnuplot macros 不支持内部可变参数文本(即变量)。
  • 函数需要绘图命令;仅减少部分重复
  • 目前我最好的猜测是调用命令行(例如使用 cmd)来调用另一个 gnuplot-script 并参数化所需的变量(虽然不确定选项)

我想最简单的方法是使用一些参数调用 gnuplot 脚本:

1
gnuplot -e"algo='Version1 Version2'" yourgnuplotscript.gp

其中 yourgnuplotscript.gp 包含 label:startlabel:end 之间的所有内容。

如果您需要为许多 algo 变量调用它,您可以使用带有 for 循环的 bash 脚本来运行这些变量。