3
votes

I previously asked this question. This is a related question.

Using the test.txt file :

-0.1  0  0  JANE
1  1  1  BILL
2  2  1  BILL
1  3  1  BILL
6  4  0  JANE
35 5  0  JANE
9  6  1  BILL
4  7  1  BILL
24 8  1  BILL
28 9  1  BILL
9  10  0  JANE
16 11  1  BILL
4  12  0  JANE
45 13  1  BILL

and the Gnuplot script :

file='test.txt'
binwidth=10
bin(x,width)=width*floor(x/width)

set table "data_table"

plot file using (bin($1,binwidth)):(1.0) smooth freq,\
file using (1+(bin($2,binwidth))):(1.0) smooth freq

unset table

set boxwidth 1
set logscale y
set yrange[0.01:15]

plot "data_table" index 0 using ($1):($2 == 0 ? 1/0 : $2) with boxes,\
"data_table" index 1 using ($1):($2 == 0 ? 1/0 : $2) with boxes

I get the data_table :

# Curve 0 of 2, 7 points
# Curve title: "file using (bin($1,binwidth)):(1.0)"
# x y type
-10  1  i
 0  8  i
 10  1  i
 20  2  i
 30  1  i
 40  1  i
 0  1  u


# Curve 1 of 2, 3 points
# Curve title: "file using (1+(bin($2,binwidth))):(1.0)"
# x y type
 1  10  i
 11  4  i
 1  1  u

Per "help set table" in the Gnuplot shell : ". . . character R takes on one of three values: "i" if the point is in the active range, "o" if it is out-of-range, or "u" if it is undefined."

Question 1 : Why is the last line of each index group in data_table have a value of u and why does it's x value seem to be out of order?

Question 2 : The plot that is generated looks very similar to Miguel's second plot. If you look at the bins at (x=0, y=1), you'll notice a bar in the middle of the histogram box. What is it and how do I get rid of it?

1

1 Answers

4
votes
  1. The superfluous points, marked as undefined by the u, are due to a bug, see bug #1274.

  2. Gnuplot itself doesn't automatically respect the values in the third column. So, although the last points in each block are marked as being undefined, gnuplot plots them which causes the additional bars at y=1.

    To get rid of them you must explicitely skip those points which have an u in their third column by checking for strcol(3) eq "u":

file='test.txt'
binwidth=10
bin(x,width)=width*floor(x/width)

set table "data_table"

plot file using (bin($1,binwidth)):(1.0) smooth freq,\
file using (1+(bin($2,binwidth))):(1.0) smooth freq

unset table

set boxwidth 1
set logscale y
set yrange[0.01:15]
unset key

plot "data_table" index 0 using ($1):($2 == 0 || strcol(3) eq "u" ? 1/0 : $2) with boxes,\
"data_table" index 1 using ($1):($2 == 0 || strcol(3) eq "u" ? 1/0 : $2) with boxes

enter image description here