在 gnuplot 中迭代生成数据块

Iteratively generate datablocks in gnuplot

是否可以迭代生成数据块,其中数据块的名称是在循环内建立的? 假设我有三个水果(实际上还有更多):

array namelist[3] = ['apple', 'banana', 'pineapple']

我想创建三个数据块,名称分别为 $apple_data$banana_data$pineapple_data,因此我尝试了以下操作:

do for [i=1:|namelist|] {
set table '$'.namelist[i]."_data"
plot ...
unset table
}

不幸的是,gnuplot 在工作目录中创建了具有这些名称的文件,而不是数据块。我猜 gnuplot 正在检查 set table 之后的第一个字符是否是 $?

我的第二次尝试是删除 $:

周围的撇号
set table $.namelist[i]."_data"

但这引发了奇怪的错误“预期的列号或数据块行”,指向 $.

之后的句点

关于如何实现这一点有什么想法吗? 这一切的原因是我读入了具有冗长路径的 banana/apple 数据文件,在 using 中应用了一些冗长的计算,并将这些重复用于许多连续的 stats 和 [=20] =] 命令。我想避免硬编码和复制粘贴相同的长路径和一遍又一遍地使用命令的麻烦。

不确定我是否完全理解您的详细意图。 如果您只想避免一次又一次地输入(或复制粘贴)冗长的路径,只需使用变量:

FILE1 = 'C:/Dir1/SubDir1/SubSubDir1/SubSubSubDir1/File1' 
FILE2 = 'C:/Dir2/SubDir2/SubSubDir2/SubSubSubDir2/File2'
plot FILE1 u 1:2, FILE2 u 1:2

无论如何,你要求动态生成的数据块。我想到的一种方法是使用 evaluate,检查 help evaluate。检查下面的示例作为起点,它可能会被简化。

代码:(由于@Eldrad 的评论而简化)

### dynamically generate some datablocks
reset session

myNames   = 'apple banana pineapple'
myName(i) = word(myNames,i)

N = words(myNames)
set samples 11

do for [i=1:N] {
    eval sprintf('set table $%s_data',myName(i))
        plot '+' u 1:(rand(0)) w table
    unset table
}

plot for [i=1:N] sprintf('$%s_data',myName(i)) w lp pt 7 ti myName(i)
### end of code

结果: