Gnuplot:从一个文件中绘制数据集

时间:2014-11-14 19:10:12

标签: indexing dataset gnuplot

我有一个包含多个数据集的文件,如下所示:

#   Isochrone   Z = 0.00800     Age =   1.000e+07 yr
#   Mu  Mb  Mv  Mr  Mi  Mj  Mh  Mk  Flum
    14.982  13.538  12.020  11.076  10.083  9.024   8.401   8.172   -9.59274740
    13.741  12.481  11.074  10.195  9.366   8.378   7.710   7.510   -6.50542581
...
#   Isochrone   Z = 0.00800     Age =   1.122e+07 yr
#   Mu  Mb  Mv  Mr  Mi  Mj  Mh  Mk  Flum
    14.982  13.538  12.020  11.076  10.083  9.024   8.401   8.172   -9.59274740
    13.741  12.481  11.074  10.195  9.366   8.378   7.710   7.510   -6.50542581
...

我需要能够使用索引功能,如下所示:

plot 'file' index n u 1:2

所以我可以绘制第n个数据集或一系列数据集(index a:b),但是我得到x range is invalid错误。可能是因为注释行不被视为两个空行。这可以解决吗?

此外,是否可以在图表的标题中包含年龄值?

1 个答案:

答案 0 :(得分:1)

从gnuplot帮助:"数据集由成对的空白记录分开"。我猜你没有使用空行作为数据集分隔符。如果您的文件如下所示:

#   Isochrone   Z = 0.00800     Age =   1.000e+07 yr
#   Mu  Mb  Mv  Mr  Mi  Mj  Mh  Mk  Flum
    14.982  13.538  12.020  11.076  10.083  9.024   8.401   8.172   -9.59274740
    13.741  12.481  11.074  10.195  9.366   8.378   7.710   7.510   -6.50542581
#   Isochrone   Z = 0.00800     Age =   1.122e+07 yr
#   Mu  Mb  Mv  Mr  Mi  Mj  Mh  Mk  Flum
    14.982  13.538  12.020  11.076  10.083  9.024   8.401   8.172   -9.59274740
    13.741  12.481  11.074  10.195  9.366   8.378   7.710   7.510   -6.50542581

然后以下bash命令可以添加空白行而无需手动编辑文件的内容:

user@machine:~$ sed 's/#   Isochrone/\n\n#   Isochrone/g' file


#   Isochrone   Z = 0.00800     Age =   1.000e+07 yr
#   Mu  Mb  Mv  Mr  Mi  Mj  Mh  Mk  Flum
    14.982  13.538  12.020  11.076  10.083  9.024   8.401   8.172   -9.59274740
    13.741  12.481  11.074  10.195  9.366   8.378   7.710   7.510   -6.50542581


#   Isochrone   Z = 0.00800     Age =   1.122e+07 yr
#   Mu  Mb  Mv  Mr  Mi  Mj  Mh  Mk  Flum
    14.982  13.538  12.020  11.076  10.083  9.024   8.401   8.172   -9.59274740
    13.741  12.481  11.074  10.195  9.366   8.378   7.710   7.510   -6.50542581

上面的命令每次在# Isochrone之前插入两个空行。现在你可以使用gnuplot中的命令:

plot "< sed 's/#   Isochrone/\\n\\n#   Isochrone/g' file" index 0 u 1:2

注意你需要在gnuplot中转义反斜杠。要获得年龄,您可以在gnuplot中使用类似的方法进行系统调用:

n = 1 # First record
age_1 = system("awk '/Age/{i++}i==" . n . "{print $(NF-1); exit}' file")
print age_1
 1.000e+07

或者同时获取所有这些并将它们存储在一个字符串中:

age = ""
do for [n = 1:2] {
age = age . " " . system("awk '/Age/{i++}i==" . n . "{print $(NF-1); exit}' file")
}
print age
 1.000e+07 1.122e+07

现在,您可以方便地使用index的相同索引和标题:

plot for [i=1:2] "< sed 's/#   Isochrone/\\n\\n#   Isochrone/g' file" \
index (i-1) u 1:2 title "Age = " . word(age,i) . " years"

enter image description here

你在研究恒星中的磁通量吗?