如何在gnuplot中使用相同的标准输入数据来绘制多个图形?

12

我想要一个单一的 .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 完成,但那需要两个文件。我真正想要的只有一个文件。
4个回答

7
您如果不修改数据输入的方式,是无法完成此操作的。当通过标准输入将数据传送给gnuplot时,它期望多个数据集之间用两个空行分隔,或交错在连续的行上。以下是选项:
  • 将两个数据集分别输入到不同的plot命令中。

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

  • 更改文件格式,使交替的行表示不同的数据集,然后使用every引用它们。

  • 将数据放入一个文件中,将绘图脚本放入另一个文件中,然后使用不同的using子句多次引用数据文件。

关于everyindex命令的介绍,请参见如何在单个文件中绘制多个数据集?这些是gnuplot为此类问题内置的唯一工具,但都不能完全满足您最初的期望。很好您已经修改了数据格式,因为原来的方法是行不通的。

谢谢。知道哪些可以做,哪些不可以做很好(虽然我希望这个可以实现)。虽然我已经更改了我的文件,但是C++代码以某种方式会更快地生成原始格式,我更喜欢它。无论如何,只有一个快速的问题:显然我不能结合“-”和“every”,对吗? - Mahdiyar
请问您能否给一个示例来说明如何做到这一点?无论我怎么做,gnuplot在读取(第一次绘图时)时都会一直读到结尾。 - flying sheep

4
我不确定您可以编辑多少文件,但最整洁的方法可能是将整个内容放在一个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++代码成功改变了数据格式。所以我的问题现在解决了。但我仍然好奇如何做到只使用一个文件.plt并发出$ gnuplot file.plt命令就能看到绘图。 - Mahdiyar
@Mahdiyar 是的,我也很好奇。我认为使用脚本编写的 gnuplot 是通常的方式(你也可以从 shell 调用你的 c++ 程序,使整个过程只需一行即可运行),请参见 http://t16web.lanl.gov/Kawano/gnuplot/intro/working-e.html 以获取更多信息。 - Tom
2
我喜欢这个shell脚本方法,因为我只想让我的应用程序生成一个可绘制的单个文件。为了保持文件系统的清洁,使用bash临时文件命令:tmpFile=\tempfile`,然后在您的绘图命令中使用plot "$tmpFile" 1:2 ...`。 - Rian Sanderson
@Rian,谢谢,我之前没见过那个bash命令 - 非常方便! - Tom

4

gp5.0新增了一个选项(请参见帮助内联数据):

$dataset << EOD
1 2 3 4 
5 6 7 8
EOD

plot $dataset using 1:2, $dataset using 3:4

2

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

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

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时,我发现这非常有用。在实时场景中(取决于数据大小),这很可能比缓冲到硬盘上的文件仍然要快。

根据我的经验,在脚本中缓冲数据以便多次使用所需的代码量非常低。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接