Paradise
Paradise

Reputation: 1468

Plotting using multiple variables in gnuplot

I have a datafile with multiple columns, the first two indicating the position and the others indicating other properties (such as number of items sent from this point). eg:

1  1  1  57.11
2  1  2  62.40
3  4  1  31.92

What I want to do is plot the points at the positions, but use values from the other columns to vary point type and size (for example). However I can't seem to find a way to reference columns in the plot. I know of the use of "variable", but I cant find a way to use multiple variables.

What I want is something like the following:

plot "mydata" using 1:2 notitle with points pt ($3) ps ($4/10)

so that pt and ps use the value for each point taken from the third and fourth columns respectively.

Is this even possible in gnuplot? Is there some sort of work-around?

Upvotes: 3

Views: 9894

Answers (1)

mgilson
mgilson

Reputation: 309841

You should be able to use the keyword variable to do something like this:

plot 'datafile' using 1:2:3:4 w points ps variable lc variable

Or possibly mapping the value to a palette:

plot 'datafile' using 1:2:3:4 w points ps variable lc palette

The keyword variable and/or palette causes gnuplot to read the properties from the file and they both require an extra column to be read via using. Of course all the usual stuff with using applies -- You can apply transforms to the data, etc:

plot 'datafile' using 1:2:3:($4+32.) w points ps variable lc palette

I don't remember off the top of my head whether the 3rd column will be the pointsize or the color here, and I don't have time right now to play around with it to figure it out. You can do the experimenting and post a comment, or I'll come back to this when I have time and add an update.


Some of the other properties (e.g. pointtype) can't be changed quite to easily using variable. The easiest way to do this is to use filters with the gnuplot ternary operator.

First, write a function that returns a pointtype based on the data from 1 column of the datafile:

my_point_type(x) = x   

Here I use a simple identity function, but it could be anything. Now, you can loop over the pointtypes you want (here 1-10) making a plot for each:

plot [for PT=1:10] 'datafile' u 1:((my_point_type($3) == PT) ? $2:NaN) with points pt PT

This assumes that the column with pointtype information is the 3rd column and that the second column holds the position information. This can also be combine with the stuff that I demonstrated above.

Upvotes: 5

Related Questions