我在名为data
,folder1
,folder2
的不同文件夹中有几个具有相同名称folder3
的文件,我想绘制第1列和第2列一次将所有文件放在不同文件夹中。换句话说,从folder1..3
所在的根开始,我不想使用:
p'文件夹1 /数据'u 1:2,'文件夹1 /数据'u 1:3
和
p folder2 / data'u 1:2,'folder2 / data'u 1:3
再说一次,对于文件夹3和其他28个文件夹,我确实是这样。
Gnuplot中是否有for
命令或一些相关命令,我可以一次绘制出不同文件夹中的所有data
文件,最好在不同的窗口中?
答案 0 :(得分:0)
gnuplot
可以在单个命令中处理任意多个文件。
只需发出您的plot
命令,即可用逗号分隔每个文件和列的说明(就像您在上面所做的那样)
plot \
"folder1/data" using 1:2,
"folder1/data" using 1:3,
"folder2/data" using 1:2,
"folder2/data" using 1:3,
"folder3/data" using 1:2,
"folder3/data" using 1:3
通常,每个plot
命令都会在单独的窗口中产生输出(取决于gnuplot
的调用方式-是否在单独的进程中)。
从shell脚本中调用时,您可以在单独的窗口中生成单独的子shell来生成输出,或者在C程序中,您可以fork
出于相同的目的而单独使用进程。
您也可以使用multiplot
,请参见Multiplot – placing graphs next to each other « Gnuplotting
您可能还会在gnuplot : plotting data from multiple input files in a single graph
中找到部分问题基于评论进行编辑
好的,现在我了解到您想从当前目录下名为folderXX
(其中XX
可以是任何东西)的目录列表中自动构建绘图文件,并且在每个文件夹中是一个名为data
的文件,您要在其中将第2列和第3列分别绘制出来,然后可以通过遍历{{1 }}(您可以根据需要调整球状结构)并在使用简单重定向的同时输出plot命令。
例如,如下所示:
tmp.plt
(注意: folderXX
和#!/bin/bash
## truncate tmp.plt and set line style
echo -e "set style data lines\nplot \\" > tmp.plt
cnt=0 ## flag for adding ',' line ending
## loop over each file
for i in folder*/data; do
if ((cnt == 0)); then ## check flag (skips first iteration)
cnt=1 ## set flag to write ending comma
else
printf ",\n" >> tmp.plt ## write comma
fi
printf "\"$i\" using 1:2,\n" >> tmp.plt ## write using 1:2
printf "\"$i\" using 1:3" >> tmp.plt ## write using 1:3 (no ending)
done
echo "" >> tmp.plt ## write final newline
交替出现,以得到行继续所需要的逃逸行为)
在包含echo
的目录中运行时,每个目录都包含一个printf
文件,例如
folder1, folder2, folder3, folder4
它将生成一个data
绘图文件,然后可以使用$ tree
.
├── folder1
│ └── data
├── folder2
│ └── data
├── folder3
│ └── data
├── folder4
│ └── data
来调用它,例如
tmp.plt
这应该更接近您根据评论所要查找的内容。
答案 1 :(得分:0)
看看help for
,以了解gnuplot中的循环。好像是
plot for [i=1:3] "folder".i."/data" u 1:2, for [i=1:3] "folder".i."/data" u 1:3
可能就是您所需要的。
是否可以在不同窗口中为不同文件自动创建图可能取决于您选择的输出终端。对于x11
,您可能可以做类似的事情
do for [i=1:3] {
set term x11 i
plot "folder".i."/data" u 1:2, "" u 1:3
}
(未经测试)。