In gnuplot there is an operator "? :" which is ternary. It behaves as it does in C language. For example, "a?b:c" means if a is true then return 'b', otherwise return 'c'. Using this operator we can do some complex operation on input data. Let us see an example.
We have a data file as follows:
#x y1 y2
0.1 0.2 0.2
0.2 0.4 0.4
0.3 0.6 0.6
0.4 0.8 0.8
0.5 1 1
0.6 1.2 1.2
0.7 1.4 1.4
0.8 2.4 0.6
0.9 2.7 0.675
1 3 0.75
1.1 3.3 0.825
1.2 3.6 0.9
1.3 3.9 0.975
1.4 4.2 1.05
1.5 4.5 1.125
We want to plot the points y1=y2 with blue pints, and other points y1!=y2 (y1 not equals y2) with some other colors. To realize this goal, we can use ternary operator. According to the definition of ternary operator, expression "$2==$3?$2:1/0" will return the points satisfy $2=$3, and when $2!=$3 it returns undefied value(1/0 is an undefied value). So when we use command "plot 'data.dat' u 1:($2==$3?$2:1/0) w p", we plot the points with y1=y2. In a simillar manner, we can plot the points with y1!=y2. Now we come to our final plotting script.
reset
set term png font "Times,20"
set output "ternaty.png"
set xlabel "x"
set ylabel "y"
plot "data.dat" u 1:($2==$3?$2:1/0) w p lc rgb"blue" notitle,\
"data.dat" u 1:($2!=$3?$2:1/0) w p lc rgb"green" notitle,\
"data.dat" u 1:($2!=$3?$3:1/0) w p lc rgb"red" notitle
The picture comes out to be like follows.

Manipulate data using ternary operator in gnuplot 
No comments:
Post a Comment