将图形输出到 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
}
我在 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
}