将图形输出到 Gnuplot 中的特定文件夹

Output figures to specific folder in Gnuplot

我在 Linux 中使用 gnuplot 绘制残差。我将所有输入文件命名为 (in1, in2, ...)Folder1 中,我想保存所有输出数据命名为 (in1.png, in2.png, ...)Folder2.

这是我的代码:

# reaed inputs
FILES = system("ls ./Folder1/in*")

# create output folder
system "mkdir Folder2"
myOutput(s) = sprintf("%s.png",s)

# loop
do for [FILE in FILES] {
    set output myOutput(FILE) 
    plot "< awk '/for p/ {print }' ".FILE with lines
}

我尝试修改命令 set output myOutput(FILE),如 set output './Folder2/myOutput(FILE)',但输出文件将命名为 myOutput(FILE)。我也尝试 './Folder2'.myOutput(FILE) 但它生成错误 cannot open file; output not changed.

谁能帮我解决这个问题?谢谢!

正如 Eldrad 在评论中指出的那样,您当然可以使用多种工具来解决您的问题。

但是,您仍然可以使用 gnuplot 以独立于平台(但相当麻烦)的方式来完成它。您需要将文件名与完整路径名分开。也许还有我目前不知道的更简单的 gnuplot 方法。检查下面的示例。

代码:

### create new output path+filename
reset session

# FILES = system("ls ./Folder1/in*")    # system command for Linux
# example result
FILES = "'./Folder1/in1' './Folder1/in2' './Folder1/in3' './Folder1/in4'"

# return position of the last occurrence of a character. If not found: length+1
PosLastChar(s,c) = (_a=strlen(s)+1, sum [_i=1:strlen(s)] (s[_i:_i] eq c ? _a=_i : _a), _a )

# create new filename
NewFile(p,s) = sprintf("%s/%s.png",p, s[PosLastChar(s,'/')+1:strlen(s)])

do for [FILE in FILES] {
    print NewFile('./Folder2',FILE)
}
### end of code

结果:

./Folder2/in1.png
./Folder2/in2.png
./Folder2/in3.png
./Folder2/in4.png

加法:

仅作记录,在 gnuplot 中有一种更好、更短的从路径中拆分文件名的方法。您需要将下面的示例集成到新文件路径的生成中。 它使用递归函数,因此,它被限制为大约 250 个子目录,然而,这对于大多数情况应该足够了。 对于 Linux 使用 /,对于 Windows 使用 \ 作为路径分离器。

代码:

### split filename from full path
reset session

SplitFileName(s) = (_idx=strstrt(s,'/')) ? SplitFileName(s[_idx+1:]) : s

FILES = "'./Folder1/File1.dat' 'C:/MainFolder/Subfolder1/File2.txt' '../Sub1/Sub2/Sub3/File3.log' 'File4.exe'"

do for [FILE in FILES] {
    print SplitFileName(FILE)
}
### end of code

结果:

File1.dat
File2.txt
File3.log
File4.exe

假设您使用的是Linux,您可以使用命令basename从路径名中仅提取最后一个“in1”。 /Folder1/in1".

% basename ./Folder1/in1
in1

如果你允许使用这个命令,你的代码可以修改如下。

# reaed inputs
FILES = system("ls ./Folder1/in*")

# create output folder
system "mkdir -p Folder2"
myOutput(s) = sprintf("./Folder2/%s.png",s)

# loop
do for [FILE in FILES] {
    BASENAME = system("basename ".FILE)
    set output myOutput(BASENAME) 
    plot "< awk '/for p/ {print }' ".FILE with lines
}