我有一个包含多列数据的文件(列数N可能非常大)。我想将所有列绘制为第一个列的函数(即 plot' Data.txt'使用1:2,' Data.txt'使用1: 3,...,' Data.txt'使用1:N )。问题是,当我不知道列数时,我想要这个命令工作。这可能吗?
答案 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
为当前图像添加了图。
答案 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)