【问题标题】:Gnuplot: Plot several in files in different foldersGnuplot:在不同文件夹中的文件中绘制几个
【发布时间】:2018-07-05 23:44:40
【问题描述】:

我有几个同名的文件,data,位于名为folder1folder2folder3 的不同文件夹中,我想一次绘制不同文件夹中所有文件的第 1 列和第 2 列.换句话说,从folder1..3 所在的根目录我不想使用:

p 'folder1/data' u 1:2, 'folder1/data' u 1:3

p folder2/data' u 1:2, 'folder2/data' u 1:3

对于 folder3 和其他 28 个文件夹,我在真实情况下也有。 Gnuplot 中是否有 for 命令或一些相关命令,我可以一次绘制来自不同文件夹的所有 data 文件,最好是在不同的窗口中?

【问题讨论】:

    标签: bash gnuplot


    【解决方案1】:

    查看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
    }
    

    (未测试)。

    【讨论】:

      【解决方案2】:

      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 列中分别绘制第一个,然后您可以通过循环遍历 folderXX 列表来构建一个临时绘图文件(例如 tmp.plt)(您可以将 globbing 调整为您的需要)并使用简单的重定向输出绘图命令。

      例如,如下所示:

      #!/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
      

      注意: echoprintf 交替使用以获得行继续所需的转义行为)

      在包含folder1, folder2, folder3, folder4 的目录中运行时,每个目录都包含一个data 文件,例如

      $ tree
      .
      ├── folder1
      │   └── data
      ├── folder2
      │   └── data
      ├── folder3
      │   └── data
      ├── folder4
      │   └── data
      

      它会生成一个tmp.plt 绘图文件,然后可以使用gnuplot -p tmp.plt 调用该绘图文件,例如

      $ cat tmp.plt
      set style data lines
      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,
      "folder4/data" using 1:2,
      "folder4/data" using 1:3
      

      根据您的评论,这应该更接近您正在寻找的内容。

      【讨论】:

      • 我想避免写 56 次(28 个文件夹 x 2 列每个),这就是为什么我想知道是否有某种循环,因为文件的名称是相同的,并且目录名字有编号。
      • 哦——现在很清楚了......你可以动态地构建 gnuplot 命令,或者你可以将你的 plot 命令写入一个文件然后执行它。等一下,我会看一个例子。 你的文件夹是如何排序的?一个目录下的所有文件夹是否都包含data文件?
      猜你喜欢
      • 2023-02-25
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多