gnuplot中每行的绘制方式

时间:2017-03-14 22:53:03

标签: matrix gnuplot rows

我有一个这种格式的文件

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)。

每行的情节怎么样?不是每列

2 个答案:

答案 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+0w的字符串值显式转换为数字。

答案 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