自动绘制所有列

时间:2014-07-03 20:43:33

标签: gnuplot

我有一个包含多列数据的文件(列数N可能非常大)。我想将所有列绘制为第一个列的函数(即 plot' Data.txt'使用1:2,' Data.txt'使用1: 3,...,' Data.txt'使用1:N )。问题是,当我不知道列数时,我想要这个命令工作。这可能吗?

4 个答案:

答案 0 :(得分:9)

您可以使用awk计算文件中的列数,然后执行循环绘图。可能有一个函数来获取已经在gnuplot中实现的数据文件中的列数,但我不知道。你可以试试这个:

N=`awk 'NR==1 {print NF}' Data.txt`
plot for [i=2:N] "Data.txt" u 1:i

如果您的第一行包含评论(以#开头),请将NR==更改为相应的值。如果您有不同行的列数可变,那么您可能希望使awk命令复杂化。

答案 1 :(得分:1)

您需要两个脚本文件:

==== main.plt ====
set <whatever>
N=1
load "loop.plt"

==== loop.plt ====
replot "data.dat" u 0:(column(N))
N+=N+1
if(N<4) reread

函数reread导致gp读取的下一行将为loop.plt:1。现在,您将绘制data.dat的前三列。函数replot为当前图像添加了图。

或参见:how to convert integer to string in gnuplot?

答案 2 :(得分:1)

看到这个问题已经很久了,我仍然认为值得再次讨论,因为您现在(版本5.2)可以访问文件中的列数,而无需依赖外部工具。

DATA = 'path/to/datafile.txt'
stats DATA

(除其他外)将列数存储在变量STATS_columns中,因此现在您可以执行以下操作:

N=STATS_columns
plot for [i=2:N] DATA using 1:i title DATA.' '.i with lines

它将绘制所有列(假设第一列用于x轴),其中图例条目与文件名加列号匹配。

PS:不确定何时引入此功能,但现在就可以使用。 :)

答案 3 :(得分:1)

@Paul给出了正确的答案,但更简单的变体也是可能的。您可以使用开放式迭代,当其用完列时会停止:

plot for [n=1:*] "data.dat" using 1:n title sprintf("Column %d",n)