## Friday, 26 February 2010

### Phong on histograms with a one-liner (almost:-)

We have seen in the last couple of posts that with the new concept of functions, quite a few interesting effects can be achieved. Today I would like to show a trick that solves a problem that I discussed some time ago, when we made shiny histograms using a for loop in gnuplot. We will do the same thing here, but in two lines only. It is quick, and the results are just as good as in that case.

So, here is my data file
```1
3
4
2
3
5
2
```
which I will just name as 'bar.dat', and here is our script
```reset
unset key
set style fill solid 1.0
set yrange [0:6]

colour = "#080000"
f(x,n) = (colour = sprintf("#%02X%02X%02X", 128+n/2, n, n), x)
w(n) = 0.8*cos(n/230.0*pi/2.0)

plot for [n=1:230:2] 'bar.dat' u 0:(f(\$1,n)):(w(n)) with boxes lc rgbcolor colour
```
Simple enough, let us see what it does! The first four lines are just the usual settings, although, the yrange is really irrelevant. I set it only for aesthetic reasons (otherwise, gnuplot would set the yrange automatically to [1:5] for the data file above, and we wouldn't see one of the columns). Then we define a variable called 'colour'm which we will eventually overwrite in our function definition of f(x,n). f(x,n) returns x, thus, in this regard it would be absolutely useless, but when doing so, it actually prints a string to 'colour'. The next function is w(n), which will determine in what fashion our colour will converge to white.
Finally, we plot the data file some 115 times, each time with a smaller, and shinier box. At the end, we get something like this

We can very easily change the direction of the light. All we have to do is define a new function that shifts the bars as we progress with our for loop. So, the new script could be something like this
```reset
unset key
set style fill solid 1.0
set yrange [0:6]

colour = "#080000"
f(x,n) = (colour = sprintf("#%02X%02X%02X", 128+n/2, n, n), x)
w(n) = 0.8*cos(n/230.0*pi/2.0)
shift(x,n) = x-0.8*n/850.0

plot for [n=1:230:2] 'bar.dat' u (shift(\$0,n)):(f(\$1,n)):(w(n)) with boxes lc rgbcolor colour
```
with a result as in this graph
It should be really easy to modify the script to accommodate more data sets. Well, this is for now. I don't actually know what I will write about next time, but I am sure that there will be something!
Cheers,
Zoltán

1. TAHNKS FOR YOUR SHARING~~~VERY NICE ........................................

2. Dar, Sir.
I think there are two errors in your first script:
f(x,n) = (colour = sprintf("#%02X%02X%02X", 128+n/2, n, n), x)

The above gives me this error:
')' expected -> it is pointing towards the "=" after the word "colour"

The second error is:
plot for [n=1:230:2] 'bar.dat' u 0:(f(\$1,n)):(w(n)) with boxes lc rgbcolor colour

The above gives me this error:
':' expected -> it is pointing towards "=" in "[n=1:230:2]"

3. 