## Saturday, 12 September 2009

### The slice of the pie

I have already shown various ways of making a pie chart in gnuplot. We will brush off one of the methods, and see how we can move one of the slices a bit. At the end of the day, we will have the following graph

For the sake of simplicity, I will demonstrate the method for four data points, which we will call
`A=0.2*2*pi; B=0.3*2*pi; C=0.4*2*pi; D=0.1*2*pi;`

In this particular case, they add up to 2 pi(e);) Once we see what and how to do, we can drop this condition, and use any data. But first, let us see the script
`resetb=0.5; a=0.5; r=1.0; s=0.1; m=1.5c(u,v)=cos(u)*r*v+BB*cos(A/2); s(u,v)=sin(u)*r*v+BB*sin(A/2)C(u) = cos(u)*r+BB*cos(A/2); S(u) = sin(u)*r+BB*sin(A/2)z = s+a; Z(v) = s+a*vA=0.2*2*pi; B=0.3*2*pi; C=0.4*2*pi; D=0.1*2*pi;set view 30, 20; set parametricunset border; unset tics; unset key; unset colorboxset ticslevel 0set vr [0:1]; set xr [-1.8:1.8]; set yr [-1.8:1.8]; set zr [0:2]set multiplotset ur [0:1]; set pal mo RGB func 0.8, 0.8, 0.8splot 3.6*u-1.8, 3.6*v-1.8, 0 w pm3dBB=bset ur [0:r]; set pal mo RGB func 1/m, 0, 0splot BB*cos(A/2)+cos(A)*u, BB*sin(A/2)+sin(A)*u, Z(v) w pm3dsplot BB*cos(A/2)+u, BB*sin(A/2), Z(v) w pm3dset ur [0:A]; set pal mo RGB func 1/m, 0, 0splot C(u), S(u), Z(v) w pm3dset ur [A:A+B]; set pal mo RGB func 0, 1/m, 0; BB=0.0; repset ur [A+B:A+B+C]; set pal mo RGB func 0, 0, 1/m; repset ur [A+B+C:A+B+C+D]; set pal mo RGB func 1/m, 1/m, 0; repset ur [0:r]; set pal mo RGB func 0, 1/m, 0splot cos(A)*u, sin(A)*u, v*a+s w pm3dBB=bset ur [0:A]; set pal mo RGB func 1, 0, 0splot c(u,v), s(u,v), z w pm3dset ur [A:A+B]; set pal mo RGB func 0, 1, 0; BB=0.0; repset ur [A+B:A+B+C]; set pal mo RGB func 0, 0, 1; repset ur [A+B+C:A+B+C+D]; set pal mo RGB func 1, 1, 0; repunset multiplot`

At the beginning, we define several plot-related constants, such as, 'b', which gives the displacement of the red slice, a, which is the height of the pie, r, which is the radius or the arcs, s, which determines by how much the pie is lifted from ground, and m, which we will use in the colouring: the sides of the slices will be m times darker, than the top, so as to give the impression that the top is lit, while the sides are in the shadow.

Then we define 6 functions, which are just helpers, so that the rest of the code will look tidier. These are basically the parametrisation of the sides and the tops. Having done this, we define A, B, C, and D, our data points, then we set a couple of things on the figure, and in the multiplot, plot the "ground".

Once we have the ground on which to build, we plot the sides of the pie. Note that since we have two cuts, we would, in principle, need 4 new surfaces. However, one can never be seen, so we can just drop that altogether. Then we plot the cylinder, each segment in a different colour. Since those plots are actually the same, except for the range that we re-set every time, we can simply replot everything. This makes the code a bit cleaner, I believe. Also note that the colours are divided by m, which we defined at the beginning. Finally, we put on the cap, in a brighter colour. Adding the labels, if needed, should be quite straightforward. You can look up the details in my other pie chart posts.

The only trick that we used here was that we shifted the cut-out slice by such an amount that only one surface was partially covered by the rest of the pie. In general, it is quite hard to determine which surface will cover which, if we let the cut-out closer, so I cheated here a bit.