How to make a pie chart using custom image
i = Import@"http://i.stack.imgur.com/8I3B1.jpg";
f[{{tmin_, tmax_}, {rmin_, rmax_}}, ___] :=
Module[{l = Join[{{0, 0}}, Table[{Cos@t, Sin@t}, {t, tmin, tmax, (tmax-tmin)/100}]]},
{Texture[i], EdgeForm[],
Polygon[l, VertexTextureCoordinates -> 1/2 Transpose[Transpose[l] + {1, 1}]]}]
Framed@PieChart[{1, 2, 3, 4, 5, 6}, ChartElementFunction -> f]
Edit
You may also want to get a better visual feedback:
Module[{cd = ColorData[3, "ColorList"]},
f[{{tmin_, tmax_}, {rmin_, rmax_}}, ___] :=
Module[{l = Join[{{0, 0}}, Table[{Cos@t, Sin@t}, {t, tmin, tmax, (tmax - tmin)/100}]]},
cd = RotateLeft@cd;
{Texture[ImageCompose[i, {Graphics[{cd[[1]], Disk[]}], 0.5}]], EdgeForm[],
Polygon[l, VertexTextureCoordinates -> 1/2 Transpose[Transpose[l] + {1, 1}]]}]
]
Framed@PieChart[{1, 2, 3, 4, 5, 6}, ChartElementFunction -> f]
Combinining @belisarius's cool solution for the key challenge with some built-in ChartElementDataFunction
s you can do a number of tricks:
onecent=Import["http://i.stack.imgur.com/8I3B1.jpg"];
ClearAll[cEDF];
cEDF[datafunc_: ChartElementDataFunction["NoiseSector",
"AngularFrequency" -> 13, "RadialAmplitude" -> 0.1]][texture_:
ExampleData[{"TestImage", "Mandrill"}]][{{t0_, t1_}, {r0_, r1_}}, y_, z___] :=
(datafunc[{{t0, t1}, {r0, r1}}, y , z] /.
Polygon[a_, b___] :> Sequence[Texture[texture],
Polygon[a, VertexTextureCoordinates ->
1/2 Transpose[Transpose[a/(r1 + 2 ("RadialAmplitude" /. Options[datafunc]))] + {1,1}]]]);
noiseF = ChartElementDataFunction["NoiseSector",
"AngularFrequency" -> 13, "RadialAmplitude" -> 0.1];
oscltngF = ChartElementDataFunction["OscillatingSector",
"AngularFrequency" -> 6, "RadialAmplitude" -> 0.21`];
sqrwvF = ChartElementDataFunction["SquareWaveSector",
"AngularFrequency" -> 50, "RadialAmplitude" -> 0.1`];
trnglwvF = ChartElementDataFunction["TriangleWaveSector",
"AngularFrequency" -> 18, "RadialAmplitude" -> 0.1`];
Row[PieChart[{{2, 2, 3, 4}}, ChartElementFunction -> cEDF[#][onecent],
SectorOrigin -> {Automatic, .5}, ImageSize -> 300] & /@
{noiseF, oscltngF, sqrwvF, trnglwvF}, Spacer[5]]
Row[PieChart[{{2, 2, 3, 4}}, ChartElementFunction -> cEDF[#][],
SectorOrigin -> {Automatic, .5}, ImageSize -> 300] & /@
{noiseF, oscltngF, sqrwvF, trnglwvF}, Spacer[5]]
Update: Combining with ChartStyle
colors:
cEDF2[datafunc_: ChartElementDataFunction["NoiseSector",
"AngularFrequency" -> 13, "RadialAmplitude" -> 0.1]][texture_:
ExampleData[{"TestImage", "Mandrill"}]][{{t0_, t1_}, {r0_, r1_}}, y_, z___] :=
(datafunc[{{t0, t1}, {r0, r1}}, y, z] /. Polygon[a_, b___] :>
Sequence[Dynamic@Texture[ImageMultiply[texture, CurrentValue["Color"]]],
Polygon[a, VertexTextureCoordinates -> 1/2
Transpose[Transpose[a/(r1 + 2 ("RadialAmplitude" /. Options[datafunc]))] + {1,1}]]]);
Row[PieChart[{{2, 2, 3, 4}}, ChartElementFunction -> cEDF2[#][onecent],
SectorOrigin -> {Automatic, .2},ImageSize -> 300,
ChartStyle -> (Directive[Opacity[.9], #] & /@Rest[ColorData[3, "ColorList"]])] & /@
{noiseF,
oscltngF /.HoldPattern["AngularFrequency" -> _] :> "AngularFrequency" -> 9,
sqrwvF /.HoldPattern["AngularFrequency" -> _] :> "AngularFrequency" -> 15,
trnglwvF}, Spacer[5]]
Here is a simple 3d version modified from belisarius's answer, by just stacking many layers of polygons together.
i = Import@"http://i.stack.imgur.com/8I3B1.jpg";
f3d[{{tmin_, tmax_}, {rmin_, rmax_}, {hmin_, hmax_}}, ___] :=
Module[{l = Join[{{0, 0}}, Table[{Cos@t, Sin@t}, {t, tmin, tmax, (tmax - tmin)/100}]]},
Table[{Texture[i], EdgeForm[], Polygon[Append[#, n] & /@ l,
VertexTextureCoordinates -> 1/2 Transpose[Transpose[Append[#, n] & /@ l] + {1, 1, 1}]]},
{n,0., 1.0, 0.05}]]
PieChart3D[{1, 2, 3}, ChartElementFunction -> f3d]