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
reset b=0.5; a=0.5; r=1.0; s=0.1; m=1.5 c(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*v A=0.2*2*pi; B=0.3*2*pi; C=0.4*2*pi; D=0.1*2*pi; set view 30, 20; set parametric unset border; unset tics; unset key; unset colorbox set ticslevel 0 set vr [0:1]; set xr [-1.8:1.8]; set yr [-1.8:1.8]; set zr [0:2] set multiplot set ur [0:1]; set pal mo RGB func 0.8, 0.8, 0.8 splot 3.6*u-1.8, 3.6*v-1.8, 0 w pm3d BB=b set ur [0:r]; set pal mo RGB func 1/m, 0, 0 splot BB*cos(A/2)+cos(A)*u, BB*sin(A/2)+sin(A)*u, Z(v) w pm3d splot BB*cos(A/2)+u, BB*sin(A/2), Z(v) w pm3d set ur [0:A]; set pal mo RGB func 1/m, 0, 0 splot C(u), S(u), Z(v) w pm3d set ur [A:A+B]; set pal mo RGB func 0, 1/m, 0; BB=0.0; rep set ur [A+B:A+B+C]; set pal mo RGB func 0, 0, 1/m; rep set ur [A+B+C:A+B+C+D]; set pal mo RGB func 1/m, 1/m, 0; rep set ur [0:r]; set pal mo RGB func 0, 1/m, 0 splot cos(A)*u, sin(A)*u, v*a+s w pm3d BB=b set ur [0:A]; set pal mo RGB func 1, 0, 0 splot c(u,v), s(u,v), z w pm3d set ur [A:A+B]; set pal mo RGB func 0, 1, 0; BB=0.0; rep set ur [A+B:A+B+C]; set pal mo RGB func 0, 0, 1; rep set ur [A+B+C:A+B+C+D]; set pal mo RGB func 1, 1, 0; rep unset 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.
No comments:
Post a Comment