gnuplot stdin,如何绘制两条线?

时间:2011-01-03 15:33:17

标签: gnuplot

我正在尝试使用从stdin获取的数据生成两行的图。我有一个文件“test.csv”:

0,1.1,2
1,2,3
2,6,4
4,4.6,5
5,5,6

我一直在尝试使用像

这样的命令来绘制它
$ cat test | gnuplot -p -e "set datafile separator \",\"; plot '-' using 1:2 with lines, '' using 1:3 with lines;"

但不管我尝试得到什么,

line 5: warning: Skipping data file with no valid points

我认为这是因为对于第二行,stdin已经用尽了。有没有办法让gnuplot从stdin的每一列中获取不同图的数据?

感谢。

9 个答案:

答案 0 :(得分:14)

“ - ”用于指定数据遵循plot命令。因此,如果您使用它,您将需要执行以下操作:

echo "set datafile separator \",\"; plot '-' using 1:2 with lines, '' using 1:3 with lines;" | cat - datafile.dat | gnuplot -p

(上面的引言可能需要转义)。

你在寻找的是:

plot '< cat -'

现在,你可以这样做:

cat test | sed ... | gnuplot -p "plot '< cat -' using ..."

请注意,如果您使用带有绘图的选项,则可能需要多次通过stdin输入输入数据,如下所示:

cat testfile testfile | gnuplot -p "plot '< cat -' using 1, '' using 2"

在上述情况下,testfile必须以一行中包含唯一字符“e”的行结束。

Manual reference

答案 1 :(得分:10)

我设法通过两次发送数据来解决这个问题,在每个块之后通过它自己的行“e”终止。 所以你的输入看起来应该是

set datafile separator ","; plot '-' using 1:2 with lines, '' using 1:3 with lines
0,1.1,2
1,2,3
2,6,4
4,4.6,5
5,5,6
e
0,1.1,2
1,2,3
2,6,4
4,4.6,5
5,5,6
e

答案 2 :(得分:7)

Gnuplot可以从stdin读取,但是对于每个plot语句,都需要一个新的数据集。以下工作正常:

cat test.csv | gnuplot -p -e "set datafile separator ','; plot '-' using 1:2 w l"

只要您使用, '' using 1:3附加第二个绘图命令,就会出现错误。为此,您需要再次发送数据,因为第一个数据集不是为了重用而存储的。因此,对于两个绘图命令,以下代码段工作正常:

echo 'e' | cat test.csv - test.csv | gnuplot -p -e "set datafile separator ','; plot '-' using 1:2 w l, '' using 1:3 w l"

将数据文件写入两次,用e分隔,表示第一个绘图命令的数据结束。

答案 3 :(得分:2)

我尝试将csv文件转换为空格分隔(假设没有记录跨越多行),通过管道sed而不是设置分隔符:

cat test | sed 's/,/ /g' | gnuplot -p -e "plot '-' using ..."

答案 4 :(得分:1)

也许这是一个老问题,但我找到了一个基于其他答案的有趣解决方案:

cat filename | awk -- '{print $0} END{print "e"}' | tee -i -a - -

输出结果为:

"contents of filename"
e
"contents of filename"
e
"contents of filename"
e

现在catawk正常工作,另一方面,实用程序tee允许我们将上一个命令管道传输的标准输出复制到文件中,但此文件可以是 stdin 本身所以我们可以通过在-之后指定 n -a来制作它的许多副本。

选项-i阻止它在复制期间被信号中断,-a告诉它将输入附加到标准输入而不覆盖,然后将整个内容写入 stdout

如需参考,请查看Tee Utility

答案 5 :(得分:0)

对我而言,当我这样做时,这是有效的:

set datafile separator ','
plot "test.csv" using 1:2 with lines

似乎你使用“,”代替','

的数据文件分隔符

答案 6 :(得分:0)

gnuplot似乎需要随机访问(即不是标准输入),所以我认为你已经坚持

# explicitly open "test" file
$ gnuplot -p -e "set datafile separator \",\"; plot 'test' using 1:2 with lines, '' using 1:3 with lines;"

答案 7 :(得分:0)

你试过chart吗?您的案例将如此简单:

cat test | chart line ','

并且会给你:

line chart

答案 8 :(得分:0)

我必须执行以下操作,因为添加' - '对我来说不起作用:

 cat filename | awk -- '{print $0} END{print "e"}' | tee -i -a /dev/stdout /dev/stdout