Gnuplot如何从文件中绘制数据直到某一行?

48

我有一些数据存储在文本文件中,大约有10000行和2列。我知道可以使用 plot "filename.txt" using 1:2 with lines 命令容易地绘制它。但是我只想绘制从第1000行到第2000行或其他合理范围内的数据,是否有简单的方法可以实现呢?非常感谢!


也许这个对你有帮助: https://dev59.com/z2w15IYBdhLWcg3whMA1 - Thiago Neves
5个回答

101

看起来 gnuplot中的"every"命令 就是你要找的:

plot "filename.txt" every ::1000::2000 using 1:2 with lines

或者,预处理文件以选择您感兴趣的行。例如,使用awk:

awk "NR>=1000 && NR<=2000" filename.txt > processed.txt

然后在现有的gnuplot命令/脚本中使用生成的 "processed.txt"。


如果您使用的是Linux或Mac OSX,您应该已经安装了awk(它是标准*nix工具集的一部分,就像sed和grep一样)。我建议在启动gnuplot之前将上述命令作为预处理步骤运行,这将创建一个新的数据文件“processed.txt”,同时保留您现有的文件不受影响。然后,您应该在绘图命令中使用“processed.txt”代替“filename.txt”。awk的手册可以在这里找到:http://www.gnu.org/software/gawk/manual/gawk.html - Stuart Lange

36

更简单:

plot "<(sed -n '1000,2000p' filename.txt)" using 1:2 with lines

2
有没有一些不错的在线资源,可以学习这种小而精妙的技巧。顺便感谢您的回复。 - jkt
2
以下答案是一个更好的选择! - SKPS

9

使用伪列0,您可能可以削减对外部实用程序的依赖(例如,如果您的系统没有安装它们)。

请参阅help plot datafile using pseudocolumn

尝试类似以下内容:

LINEMIN=1000
LINEMAX=2000

#create a function that accepts linenumber as first arg
#an returns second arg if linenumber in the given range.
InRange(x,y)=((x>=LINEMIN) ? ((x<=LINEMAX) ? y:1/0) : 1/0)

plot "filename.txt" using (InRange($0,$1)):2 with lines

(在Linux上测试过Gnuplot 4.4.2)


1
Gnuplot忽略NaN值。对于我来说,这适用于指定范围的x坐标。不确定如何指定行范围。
cutoff(c1,c2,xmin,xmax) = (c1>=xmin)*(c1<=xmax) ? c2 : NaN
plot "data.txt" u 1:(cutoff(($1),($2),1000,2000))

1

我建议使用一些命令行工具,例如sedgrepbash。在你的例子中

head -n 2000 ./file.data > temp.data

并且

tail -n 1000 temp.data > temp2.data

可能会起作用。但是还没有测试过这样大的数字是否与头部和尾部兼容。


这个结合第一个答案帮了我:plot "<(tail -n 90 filename.txt)" ... 读取数据集中最近的90行。 - JGC

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