petersohn
petersohn

Reputation: 11720

Multiple datasets in the same data file in gnuplot

I have a following kind of file:

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

I want to draw a scatter plot from the (x,y) values, having the different strings in the first column in different data sets, which will be drawn with different colors (I have many different x,y values but only a few different strings). I tried this:

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

Unfortunately, this one picks the first column for the first row and uses that as a title for all entries.

Upvotes: 3

Views: 636

Answers (2)

Joce
Joce

Reputation: 2332

You have just one plot, so just one title.

If you want to plot separately all datasets (separated by two consecutive blank lines), you (just) need to say so:

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

But the formatting of your datafile is not what gnuplot expects, and using title columnhead will also skip first line (assumed to contain headers only). The standard gnuplot format for this would be:

string1
x1_1 y1_1
x1_2 y1_2
...


string2
x2_1 y2_1
x2_2 y2_2
...

Upvotes: 1

Vinicius Placco
Vinicius Placco

Reputation: 1731

You could use awk to pick only rows where the first column matches your strings:

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

and so on. For a built-in gnuplot solution, you can do:

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

if you want to do something more automatic that would generate plots for every unique entry in column 1, this solution worked for me:

input file (test.dat - separated, otherwise need to change cut statement below):

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

the following line creates a plotting statement for gnuplot, and saves in a file:

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

and the contents are:

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),\

then you'd do:

gnuplot plot.gp

or add the line load "plot.gp" to your script.

I am pretty sure there must be a "gnuplot-only" solution, but that goes beyond my knowledge. Hope this helps.

Upvotes: 1

Related Questions