Gnuplot:在不同文件夹中的文件中绘制多个

时间:2018-07-05 23:44:41

标签: bash gnuplot

我在名为datafolder1folder2的不同文件夹中有几个具有相同名称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文件,最好在不同的窗口中?

2 个答案:

答案 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
}

(未经测试)。