我有一个这种格式的文件
0 R1 R2 R3 R4
w1 I1 I2 I3 I4
w2 I1 I2 I3 I4
w3 I1 I2 I3 I4
在许多波长w中具有半径R和强度I的值。我想用2D绘图,x轴的行1(半径)和y轴的行3(选择w2)。
每行的情节怎么样?不是每列
答案 0 :(得分:0)
它可能不是最优雅的解决方案,但您可以先过滤两条线(包含x值的标题和与感兴趣的波长相对应的线),并排打印它们,最后使用这些辅助数据绘制gnuplot的。
为此,策略是在您想要执行Gnuplot的目录中创建一个名为filter.awk
的脚本,其中包含以下内容:
NR==1{
N = NF-1;
for(i=1;i<=N;i++) x[i] = $(i+1);
next;
}
$1==w{
printf "#%f\n", $1;
for(i=1;i<=N;i++) print x[i], $(i+1);
printf "\n";
}
这会记住第一行的x值并将它们存储在数组x
中。波长通过变量w
作为命令行参数传递(见下文)。如果数据中的第一列等于w
,则脚本会生成两列:第一列中的x值,第二列中的y值(取自当前行)。
在Gnuplot中,您可以将其用作:
plot \
'<gawk -v w=100 -f filter.awk data.dat' w l
其中data.dat
是您的输入数据,100
的值表示应该过滤的波长。
为了概括这一点,例如可以:
cmd(w)=sprintf('<gawk -v w=%f -f filter.awk test.dat', w);
plot for [w in "100 200"] cmd(w+0) w l t sprintf('wave length of %.1f', w+0)
这里,绘图命令是通过cmd
函数生成的,该函数接受一个表示波长的参数。然后,plot命令循环遍历波长的“列表”,并使用自定义标题单独绘制它们。此处使用语句w+0
将w
的字符串值显式转换为数字。
答案 1 :(得分:0)
一种解决方案是使用正确的格式(列中的数据)创建新文件。 首先创建一个函数来读取文件中的数据(参见主题&#34;将数据集值读入gnuplot变量(X系列的开头)&#34;):
at(file, row, col) = system( sprintf("awk -v row=%d -v col=%d 'NR == row {print $col}' %s", row, col, file) )
file="myFile"
这样构建你的新文件并绘制它:
do for [j=1:5] { # 5 = number of your columns
x = at(file,1,j) # x axis in your example
y = at(file,3,j) # y axis
set print "newFile.txt" append
print x," ",y
set print
}
plot "newFile.txt"
每次执行此过程时,请务必删除newFile.txt
。