【问题标题】:Loop structure inside gnuplot?gnuplot内部的循环结构?
【发布时间】:2013-02-03 11:41:51
【问题描述】:

有什么方法可以迭代地从多个文件中检索数据并将它们绘制在 gnuplot 中的同一张图上。假设我有 data1.txt、data2.txt......data1000.txt 之类的文件;每个具有相同数量的列。现在我可以写一些类似的东西了-

plot "data1.txt" using 1:2 title "Flow 1", \
     "data2.txt" using 1:2 title "Flow 2", \
      .
      .
      .
     "data1000.txt"  using 1:2 title "Flow 6"

但这真的很不方便。我想知道是否有办法遍历 gnuplot 中的 plot 部分。

【问题讨论】:

标签: gnuplot


【解决方案1】:

肯定有(在 gnuplot 4.4+ 中):

plot for [i=1:1000] 'data'.i.'.txt' using 1:2 title 'Flow '.i

变量i 可以解释为变量或字符串,因此您可以执行类似的操作

plot for [i=1:1000] 'data'.i.'.txt' using 1:($2+i) title 'Flow '.i

如果你想让线条相互偏移。

在 gnuplot 命令行中输入 help iteration 以获取更多信息。

还请务必查看@DarioP 对do for 语法的回答;这让您更接近于传统的 for 循环。

【讨论】:

  • 感谢您的解决方案“使用 1:2 标题 'Flow '.i”为 [i=1:1000] 'data'.i.'.txt' 绘制的图对我有用。我正在使用在 Windows 上使用 C++ 的 gnuplot 5.2....
  • 但是我还有另一个问题,我正在编写一个程序,它通过 fream K 在硬盘上写入 K 个文件,K 是一个全局变量,所以我想在我的图表上绘制 K 个文件使用gnuplot 我试过 for[i = 1:K] 但它给出了未定义变量的错误。我在 gnuplot 外面尝试了 for 循环,但这也不起作用。
  • 我在 C++ 中为 gnuplot 编写了一个函数,它与 for[i = 1:5] 一起使用,但是当我使用 for[i = 1:K] 时,它给出了错误...
  • @MasoodUrRehman 听起来您可能正在尝试在 gnuplot 脚本中使用 C++ 代码中的变量;确保在向 gnuplot 发送命令时打印变量 K 的值。 Gnuplot 说的是“未定义的变量”,因为 C++ 知道 K 是什么,但 gnuplot 不知道。如果您仍然遇到问题,最好将您的问题作为单独的 C++ 问题发布。
【解决方案2】:

还可以查看自 gnuplot 4.6 以来的 do { ... } 命令,因为它非常强大:

do for [t=0:50] {
  outfile = sprintf('animation/bessel%03.0f.png',t)
  set output outfile
  splot u*sin(v),u*cos(v),bessel(u,t/50.0) w pm3d ls 1
}

http://www.gnuplotting.org/gnuplot-4-6-do/

【讨论】:

  • 我还可以使用迭代器 t 来引用文件名或颜色等数组中的索引吗?
  • 我从未尝试过,但我认为这没有任何问题。最终,另一种可能性是直接在方括号中指定数组的项目(颜色、名称或其他),如help do 所示。
  • 我在这里stackoverflow.com/questions/18591986/loop-over-array-in-gnuplot 提出了一个新问题,因为这对我来说并不明显,如何实现。
【解决方案3】:

我有脚本 all.p

set ...
...
list=system('ls -1B *.dat')
plot for [file in list] file w l u 1:2 t file

这里最后两行是字面的,不是启发式的。然后我运行

$ gnuplot -p all.p

*.dat 更改为您拥有的文件类型,或添加文件类型。

下一步:添加到~/.bashrc这一行

alias p='gnuplot -p ~/./all.p'

并将您的文件all.p 放入您的主目录,瞧。您可以通过键入 p 并回车来绘制任何目录中的所有文件。

EDIT 我更改了命令,因为它不起作用。以前它包含list(i)=word(system(ls -1B *.dat),i)

【讨论】:

  • 对我来说,您的代码不起作用。我不得不写list=system(ls -1B *.dat)
  • 嗯,好的。我在 Linux 上使用的是 4.6 版。
  • 所以我又试了一次,正如你所说,它不起作用。我必须在系统调用中使用广告单引号才能使您的命令起作用:list=system('ls -1B *.dat')
  • 它对我不起作用。带或不带引号。为什么?
  • @samira 我不知道。
【解决方案4】:

如果您要在图表中绘制离散列,请使用以下内容

do for [indx in "2 3 7 8"] {
  column = indx + 0
  plot ifile using 1:column ;  
}

【讨论】:

  • 此处仅提供一个示例,说明如何遍历非连续数字。
【解决方案5】:

我想使用通配符来绘制通常放置在不同目录中的多个文件,同时从任何目录工作。我找到的解决方案是在~/.bashrc 中创建以下函数

plo () {
local arg="w l"
local str="set term wxt size 900,500 title 'wild plotting'
set format y '%g'
set logs
plot"
while [ $# -gt 0 ]
        do str="$str '$1' $arg,"
        shift
done
echo "$str" | gnuplot -persist
}

并使用它,例如像plo *.dat ../../dir2/*.out,绘制当前目录中的所有.dat 文件和恰好是一个级别并称为dir2 的目录中的所有.out 文件。

【讨论】:

  • 您可以添加plo() { [[ $# -eq 0 ]] && echo "Usage plo file1 file2 ..." || { .... } }以避免在没有文件的情况下调用gnuplot
【解决方案6】:

这里是替代命令:

gnuplot -p -e 'plot for [file in system("find . -name \\*.txt -depth 1")] file using 1:2 title file with lines'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    相关资源
    最近更新 更多