Change box colour depending on value

Change box colour depending on value

Post by Farre » Sat, 24 Oct 2009 08:36:16

Is there an easy way to change the colour of a box in a box plot
depending if the y-value is aboe or below a certain threshold?

If required I can specify the colour in a column in the data file but
it would be a lot easier to just specify the threshold to a plot

Change box colour depending on value

Post by Christoph » Sat, 24 Oct 2009 16:46:37

Farrel schrieb:

Try this:

set palette defined (-1 "red", 0 "red", 0 "green", 1 "green")
threshold = 0.2 # put here your threshold
plot 'file.dat' u 1:2:(0.1):($2 > threshold ? 1 : -1) w boxes palette

Another way is to use 'rgbcolor variable':

rgb(r,g,b) = 65536 * int(r) + 256 * int(g) + int(b)
threshold = 0.2
color(th) = th > threshold ? rgb(0, 255, 0) : rgb(255, 0, 0)
plot 'file.dat' u 1:2:(0.1):(color($2)) w boxes lc rgb variable

However, in both cases the fourth column is taken as color argument, the
third specifies the box width. I do not know if its possible to use the
color column and at the same time retain automatic box width adjustment.
In my examples the box width must be set explicitely.



Change box colour depending on value

Post by Zolta » Sat, 24 Oct 2009 17:15:56

This is probably not the most elegant solution, but what the heck, it
works. I guess, by box plot you meant a histogram. If so, do the
th=1.0 # This is our threshold
lv=-100.0 # This is just some value, outside the yrange
set yrange [0:*]
p newhistogram, 'something.dat' u (f($1)) lc rgb red, newhistogram at
0, 'something.dat' u (g($1)) lc rgb green

Basically, you plot your data twice, first setting all values that are
above your threshold to 'lv', and then plotting over the same graph
those values that are below your threshold. The only inconvenience is
that you have to set your yrange in advance, but if, for some reason,
you can't do that, you can use the gnuplot variable GPVAL_DATA_Y_MAX
after a dummy plot. You can read on how to make this work here:

Change box colour depending on value

Post by Zolta » Sat, 24 Oct 2009 17:48:47

PS: I think, I have misunderstood your question, but the scheme should
work for boxes, too.

Change box colour depending on value

Post by sfea » Sun, 25 Oct 2009 00:50:19

The following command is the intended way to do this, but unfortunately
in version 4.2.x it doesn't work for all plot types, and "with boxes"
is one of the plot types it doesn't work for. This oversight is fixed
in current CVS and will be in 4.4

plot "foo" using 1:2:($2 > LIMIT ? ls1 : ls2) with boxes lc variable

(where ls1 and ls2 are linestyle or linetype indices).

As Zoltan points out, version 4.2 does allow a similar command
using 24-bit rgb color info rather than linestyle indices, and with
the restriction that the boxes must be of fixed width

rgb1 = 0x00ff00
rgb2 = 0xff00ff
set boxwidth <width> abs
plot "foo" using 1:2:($2 > LIMIT ? rgb1 : rgb2) with boxes lc rgb variable