【问题标题】:how to make several plots from the same standard input data in gnuplot?如何从 gnuplot 中的相同标准输入数据制作多个图?
【发布时间】:2011-02-12 23:21:02
【问题描述】:

我想要一个 .plt 文件同时存储数据和 gnuplot 命令。我的数据看起来像

# x1 y1 x2 y2
  1  2  3  4
  5  6  7  8

并对应两个图:(x1,y1) 和 (x2,y2)。

我知道我可以使用"-" 喜欢:

plot "-" using 1:2
# x1 y1 x2 y2
  1  2  3  4
  5  6  7  8
e

但这只会生成一个图,即 (x1,y1)。我正在尝试做类似的事情

plot "-" using 1:2, "-" using 3:4
# x1 y1 x2 y2
  1  2  3  4
  5  6  7  8
e

但显然这不起作用,因为 gnuplot 期望从标准输入中为第二个"-" 提供一组新数据。

注意事项:

  1. 我无法更改数据的样式。它分为四列。
  2. 看来我可以使用reread 来完成,但这需要两个文件。我真的只想要一个文件。

【问题讨论】:

    标签: gnuplot


    【解决方案1】:

    如果不修改输入数据的方式,就无法做到这一点。当通过标准输入提供 gnuplot 数据时,它期望多个数据集之间用两个空行分隔,或者在连续行上交错。选项有:

    • 将两个数据集输入到不同的 完全绘制命令。

    • 更改 文件格式,以便数据集具有 它们之间的空行,然后 用 index 引用它们。

    • 更改文件格式,以便 交替的线代表不同的 数据集,然后全部引用 每个

    • 将数据合二为一 文件,绘图脚本到 另一个,然后引用数据 多次提交不同的文件 每次都使用子句。

    How do I plot several data sets in a single file 开始的everyindex 命令有介绍吗?这些是 gnuplot 中为此类事情内置的唯一设施,也不完全符合您的要求。很高兴您已经修改了数据格式,因为这不会像您最初希望的那样工作。

    【讨论】:

    • 谢谢。很高兴知道什么可以做,什么不能做(但我希望可以做到)。尽管我更改了文件,但不知何故 C++ 代码会更快地生成原始格式,我更喜欢它。无论如何,只是一个简单的问题:显然我不能将"-"every 结合起来,对吧?
    • 您能举个例子吗?无论我做什么,gnuplot 都会读取(在进行第一个绘图时)到最后。
    【解决方案2】:

    我不确定你可以编辑多少文件,但最简洁的方法可能是将整个内容放在 shell 脚本/批处理脚本中(你是在 linux 上还是 windows 上?)

    在linux上我做这样的事情

    #!/bin/bash
    
    #put my data in a file
    echo "
    # x1 y1 x2 y2
      1  2  3  4
      5  6  7  8
    " > my_dat.dat
    
    #launch gnuplot
    gnuplot<<EOF
    #gnuplot commands here
    set output "test.ps"
    set term postscript
    
    plot "my_dat.dat" u 1:2, \
         "my_dat.dat" u 3:4
    
    set term pop
    set output
    
    EOF
    
    # cleanup
    rm my_dat.dat
    

    然后我 chmod +wrx 将上述命令放入的文件并运行。

    注意:这个问题似乎也有相似之处:

    gnuplot stdin, how to plot two lines?

    所以你可能也想看看那里

    【讨论】:

    • 谢谢。是的,我在 Linux 上。实际上,我设法通过修改生成数据的 C++ 代码来改变数据的格式化方式。所以我的问题现在消失了。但是我仍然很好奇如何做到这一点,这样我就可以看到带有上述格式的单个 file.plt 的情节并发出$ gnuplot file.plt
    • @Mahdiyar 是的,我也很好奇。我认为使用带有脚本的 gnuplot 是通常的方式(你也可以从 shell 调用你的 c++ 程序,从而使整个事情只用 1 行即可),请参阅 - t16web.lanl.gov/Kawano/gnuplot/intro/working-e.html 了解更多信息。
    • 我喜欢这种 shell 脚本方法,因为我只想让我的应用程序生成一个可绘制的文件。要保持文件系统干净,请使用 bash tempfile 命令:tmpFile=`tempfile`,然后在您的绘图命令中使用 plot "$tmpFile" 1:2 ...
    • @Rian,谢谢,我以前没见过那个 bash 命令——非常方便!
    【解决方案3】:

    自 gp5.0 以来的新选项(另请参阅 help inline data):

    $dataset << EOD
    1 2 3 4 
    5 6 7 8
    EOD
    
    plot $dataset using 1:2, $dataset using 3:4
    

    【讨论】:

      【解决方案4】:

      我知道这是一篇旧帖子,但我想指出另一种策略,以防其他人仍然在这个问题上苦苦挣扎:

      您也可以使用绘图命令并输入两次数据,例如:

      plot "-" using 1:2, "-" using 3:4
      # 1  2  3  4
        5  6  7  8
        e
        1  2  3  4
        5  6  7  8
        e
      

      在这种情况下,Gnuplot 实际上会等待两个块。当我不想更改命令以及通过管道输入 Gnuplot 时,我发现这非常有用。在实时场景中(取决于数据大小),这很可能仍然比缓冲到硬盘驱动器上的文件要快。

      根据我的经验,在您的脚本中缓冲数据所需的代码量(需要多次管道传输)非常少。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-20
        • 2013-09-16
        相关资源
        最近更新 更多