gnuplot中同一数据文件中的多个数据集

时间:2016-07-29 09:16:11

标签: gnuplot

我有以下类型的文件:

<string1> <x1> <y1>
<string2> <x2> <y2>
...

我想从(x,y)值绘制一个散点图,在不同数据集的第一列中有不同的字符串,这些字符串将使用不同的颜色绘制(我有许多不同的x,y值,但只有一些不同的字符串)。我试过这个:

plot "DATAFILE" using 2:3 title column(1)

不幸的是,这个选择了第一行的第一列,并将其用作所有条目的标题。

2 个答案:

答案 0 :(得分:0)

您可以使用awk仅选择第一列与您的字符串匹配的行:

plot "<awk '$1~/string1/' DATAFILE" using 2:3 title column(1),\
     "<awk '$1~/string2/' DATAFILE" using 2:3 title column(1)

等等。对于内置的gnuplot解决方案,您可以执行以下操作:

plot "DATAFILE" u 2:(stringcolumn(1) eq "string1" ? $3:1/0),\
     "DATAFILE" u 2:(stringcolumn(1) eq "string2" ? $3:1/0)

如果你想做更自动的事情,为第1列中的每个唯一条目生成图,这个解决方案对我有用:

输入文件(test.dat - 分隔,否则需要更改下面的cut语句):

one 1   3
two 2   4
ten 3   5
ten 4   3
two 5   4
one 6   5
one 7   3
ten 8   4
two 9   5
ten 10  3
two 11  4
one 12  5

以下行为gnuplot创建一个绘图语句,并保存在一个文件中:

cut -f1 test.dat | sort -u | awk '
BEGIN {print "plot\\"}
{print "\"test.dat\" u 2:(stringcolumn(1) eq \""$1"\" ?\$3:1/0),\\"}' > plot.gp

,内容如下:

plot\
"test.dat" u 2:(stringcolumn(1) eq "one" ?$3:1/0),\
"test.dat" u 2:(stringcolumn(1) eq "ten" ?$3:1/0),\
"test.dat" u 2:(stringcolumn(1) eq "two" ?$3:1/0),\

然后你会这样做:

gnuplot plot.gp

或将行load "plot.gp"添加到您的脚本中。

我很确定必须有一个“仅限gnuplot”的解决方案,但这超出了我的知识范围。希望这会有所帮助。

答案 1 :(得分:0)

你只有一个情节,所以只有一个标题。

如果你想分别绘制所有数据集(由两个连续的空行分隔),你(只需)这样说:

N_datasets=3
plot for [i=0:N_datasets-1] "file.dat" using 2:3 index i with title columnhead(1)

但是数据文件的格式不是gnuplot所期望的,使用title columnhead也会跳过第一行(假设只包含头文件)。标准的gnuplot格式为:

string1
x1_1 y1_1
x1_2 y1_2
...


string2
x2_1 y2_1
x2_2 y2_2
...