First, here is our data file (it could be anything, really)
1 1 Dolphins 2 1 Whales 2 0 Sharks 3 0 Penguins 4 1 Kiwis 5 0 Tux
and here is our script
reset unset key; set border 0; unset tics; unset colorbox; set size 0.6,1 set urange [0:1] set vrange [0:2*pi] set macro sum = 0.0 ssum = 0.0 n = 0 PLOT = "splot 0, 0, 1/0 with pm3d" count(x) = (ssum = ssum + $1, 1) g(x,y,n) = \ sprintf(", \ u*cos((%.2f+%.2f*v)/ssum), \ u*sin((%.2f+%.2f*v)/ssum), \ %d @PL", x, y, x, y, n) f(x) = (PLOT = PLOT.g(2*pi*sum, x, n), sum = sum+x, n = n + 1, x) plot 'new_pie.dat' u 1:(count($1)), '' u 1:(f($1)) PL = "with pm3d" set parametric; set pm3d map; eval(PLOT)
There is really nothing that we haven't discussed before: we set a couple of things at the beginning, but most importantly, the macro, and sum, ssum, and n. Then we define a string, PLOT, and two functions. One is to sum the values in our file (we need this, so that we can scale the full range of angles to two pi), and another one, that writes our PLOT command for later use. Note that the first plot in PLOT is actually empty, we plot 1/0. This seems a bit silly, doesn't it? Well, it does, but there is a good reason: successive plots must be separated by a comma, and if we have an empty plot at the very beginning, then we can put the commas before the plots, not after, and in this way, we needn't keep track of which plot we are actually processing. Remember, yesterday we used a separate counter, and an if statement, to determine, whether we need the comma, or not. This we can avoid here.
Next we call the two dummy plots, and finally, we evaluate our PLOT string. Oh, no! At the very end, we marvel in awe at the figure that we produced.
So far, so good, but what if we wanted to add labels, e.g., the value of the slice? That is really easy. All we have to do is to define a function that produces the label. Here is our updated script
reset unset key; set border 0; unset tics; unset colorbox; set size 0.6,1 set urange [0:1] set vrange [0:2*pi] set macro sum = 0.0 ssum = 0.0 n = 0 PLOT = "splot 0, 0, 1/0 with pm3d" LABEL = "" count(x) = (ssum = ssum + $1, 1) g(x,y,n) = \ sprintf(", \ u*cos((%.2f+%.2f*v)/ssum), \ u*sin((%.2f+%.2f*v)/ssum), \ %d @PL", x, y, x, y, n) lab(alpha, x) = sprintf("set label \"%s\" at %.2f, %.2f; ", \ x, 1.2*cos(alpha), 1.2*sin(alpha)) f(x) = (PLOT = PLOT.g(2*pi*sum, x, n), \ LABEL = LABEL.lab(2*pi*sum/ssum+pi*x/ssum, sprintf("%2.f", x)), \ sum = sum+x, n = n + 1, x) plot 'new_pie.dat' u 1:(count($1)), '' u 1:(f($1)) PL = "with pm3d" set parametric; set pm3d map; set border 0; unset tics; unset colorbox; set size 0.6,1 eval(LABEL) eval(PLOT)We have an addition string, LABEL, which we initialise with the value "". Then we define a function that prints "set label ..." with the proper positions, and finally, we insert this function in the definition of f(x). Of course, once we called f(x) in the plot, we have to evaluate the string LABEL. So, this is what we get
This script can trivially be modified to print strings that are stored in our file. Watch just the following two lines
... lab(alpha, x) = sprintf("set label \"%s\" at %.2f, %.2f centre; ", \ x, 1.2*cos(alpha), 1.2*sin(alpha)) f(x) = (PLOT = PLOT.g(2*pi*sum, x, n), \ LABEL = LABEL.lab(2*pi*sum/ssum+pi*x/ssum, stringcolumn($3)), \ sum = sum+x, n = n + 1, x) ...and we are done. Here is the new pie
Now, you might wonder why we had three columns in our data file, if we didn't want to use it. Well, perhaps, we wanted, just haven't got time till now. So, what could we do with those ones and zeros in the second column? We will make the pie explode! It is really simple, we have to modify two lines in our last script
... g(x,y,n,dx,dy) = \ sprintf(", \ %.2f+u*cos((%.2f+%.2f*v)/ssum), \ %.2f+u*sin((%.2f+%.2f*v)/ssum), \ %d @PL", 0.2*dx, x, y, 0.2*dy, x, y, n) lab(alpha, x, r) = sprintf("set label \"%s\" at %.2f, %.2f centre; ", \ x, (1.25+0.2*r)*cos(alpha), (1.25+0.2*r)*sin(alpha)) f(x) = (PLOT = PLOT.g(2*pi*sum, x, n, \ $2*cos(2*pi*sum/ssum+pi*x/ssum), \ $2*sin(2*pi*sum/ssum+pi*x/ssum)), \ LABEL = LABEL.lab(2*pi*sum/ssum+pi*x/ssum, stringcolumn($3), $2), \ sum = sum+x, n = n + 1, x) ...And here is the pie, when exploded
I should mention here that if you are not happy with the colours, it is really easy to help it: all we have to do is to modify the colour palette, using whatever colour combinations. We have covered a lot of material today. Till next time,
Gnuplotter
No comments:
Post a Comment