3
$\begingroup$

I have been looking through numerous stack posts to answer 1-4 below. I am trying to generate a pie chart with several very small slices that have long labels.

  1. when I do the callouts how can I eliminate the dots that point to the slices of the pie? I'm really confused because on the examples on the PieChart function on the Mathematica website the labels don't work out.
  2. how do I get the labels not to overlap? I tried both "RadialCallout" and "VerticalCallout" but the labels themselves are so small
  3. how can I get the sides of the plot not get chopped off while still using "VerticalCallout"? I tried playing with the padding parameter but my labels still get chopped
  4. how can I get the pie chart title closer to the plot?

Here's a working example of my code:

    dat  = {0.001, 0.001, 0.001, 1, 2, 3, 4};
    labels = {"bbbbbbbbbbbbbb", "ccccccccccccccccccccc", 
       "aaaaaaaaaaaaaaaaaaaaaaa", "aasdadasfsafasfsafasfa", 
       "afsafasfasfasfasfsafsab", "casfasfafsafsafsafsa", 
       "gwegwgwhhtrwhtrjrjwtud"};
    labeledDat = 
     Labeled[dat [[#]], labels[[#]], "VerticalCallout"] & /@ 
      Range[Length[dat]]
    
    PieChart[labeledDat, SectorOrigin -> {Automatic, 1}, 
     PlotLabel -> "Donut Plot", ColorFunction -> "Rainbow"]

$\endgroup$
4
  • 1
    $\begingroup$ For your labels, you could use labels = Callout[dat[[#]], labels[[#]]] & /@ Range[Length[dat]] instead which solves problems 1 and 2, but I couldn't figure out how to stop the clipping though. $\endgroup$
    – flinty
    Jul 24, 2020 at 20:08
  • $\begingroup$ can you indicate where to put this? I put it right after calling labels the first time (e.g. before making labeledDat) Im still seeing the dots from problem 1 and the overlapping run problem 2 $\endgroup$ Jul 24, 2020 at 20:45
  • $\begingroup$ ah, you put "labels" as the argument for PieChart $\endgroup$ Jul 24, 2020 at 20:55
  • 1
    $\begingroup$ try ImagePadding -> {{120, 60}, {0, 0}} to eliminate clipping of labels. $\endgroup$
    – kglr
    Jul 25, 2020 at 9:43

1 Answer 1

1
$\begingroup$

I am not sure, but I am afraid that your four questions can only be answered by writing code yourself so that you can fully handle the labeling. I post two figures. First, code is given to make a grid that may help you to put labels in their exact positions; therefore just 'uncomment/comment' the ", grids" in the code for the figure.

grids = {
   Table[{Thick, Line[{{-5, i}, {5, i}}]}, {i, -2, 2, 1}],
   Table[{Thin, Line[{{-5, i}, {5, i}}]}, {i, -2, 2, 0.1}],
   Table[{Thick, Line[{{i, -5}, {i, 5}}]}, {i, -5, 5, 1}],
   Table[{Thin, Line[{{i, -5}, {i, 5}}]}, {i, -5, 5, 0.1}],
   Table[Text[
     Style[ToString[i], 16, Background -> White], {3.5, i}, {0, 
      0}], {i, -2, 2, 1}],
   Table[Text[
     Style[ToString[i], 16, Background -> White], {i, 2.1}, {0, 
      0}], {i, -5, 5, 1}]
};

In the first figure I restrict the code by using the call outs of MMA. The pie chart title is now close to the plot. I took the liberty to make three of the long labels even longer by showing the rounded percentage of the whole (0.001/10.003 times 100).

dat = {0.001, 0.001, 0.001, 1, 2, 3, 4};
labels = Table[" ", {Length@dat}];
labeledDat = Labeled[dat[[#]], labels[[#]], "RadialCallout"] & /@ Range[Length[dat]];
fig1 = Framed[PieChart[
   labeledDat, SectorOrigin -> {Automatic, 1}, PlotLabel -> None, 
   ColorFunction -> "Rainbow",
   ImagePadding -> {{160, 100}, {0, 0}},
   Epilog ->
    {
     Text[Style["Donut Plot", Black, Bold, 24], {0.0, 2.25}, {0, 0}],
     
     Text[
      Style["bbbbbbbbbbbbbb (0.1%)\nccccccccccccccccccccc (0.1%)\n\
aaaaaaaaaaaaaaaaaaaaaaa (0.1%)", 13, 
       FontFamily -> "CourierNew"], {-4.6, -0.}, {-1, 0}],
     
     Text[
      Style["aasdadasfsafasfsafasfa", 13, 
       FontFamily -> "CourierNew"], {-2.35, 0.72}, {1, 0}],
     Text[
      Style["afsafasfasfasfasfsafsab", 13, 
       FontFamily -> "CourierNew"], {-0.9, 2.12}, {1, 0}],
     Text[
      Style["casfasfafsafsafsafsa", 13, 
       FontFamily -> "CourierNew"], {2.35, 0.67}, {-1, 0}],
     Text[
      Style["gwegwgwhhtrwhtrjrjwtud", 13, 
       FontFamily -> "CourierNew"], {-0.92, -2.1}, {1, 0}]
     (*, grids*)
     },
   ImageSize -> 800], RoundingRadius -> 15]

Figure 1. Donut Plot with call outs

In the second figure I also use arrows. Using the code given you can adjust whatever you want. Only as a suggestion, I changed the very small slices (0.001) in something bigger (0.005). This results in a thicker line so that one may recognize that some very small slices are present.

datAlt = {0.005, 0.005, 0.005, 1, 2, 3, 4};
fig2 = Framed[PieChart[
   datAlt, SectorOrigin -> {Automatic, 1}, 
   ColorFunction -> "Rainbow",
   ImagePadding -> {{200, 200}, {20, 20}},
   Epilog ->
    {
     Text[Style["Donut Plot", Black, Bold, 24], {0, 2.2}, {0, 0}],
     (*============================*)
     Text[Style[
       "bbbbbbbbbbbbbb\nccccccccccccccccccccc\n\
aaaaaaaaaaaaaaaaaaaaaaa", 13, 
       FontFamily -> "CourierNew"], {-4.4, -0.}, {-1, 0}],
     Arrowheads[.02], Arrow[{{-2.85, 0.21}, {-2.1, 0.07}}],
     Arrow[{{-2.6, 0.0}, {-2.0, 0.0}}],
     Arrow[{{-2.56, -0.22}, {-2.1, -0.05}}],
     (*============================*)
     Text[Style["aasdadasfsafasfsafasfa", 13, 
       FontFamily -> "CourierNew"], {-2.4, 0.8}, {1, 0}],
     Arrowheads[.03], Arrow[{{-2.35, 0.8}, {-1.9, 0.6}}],
     (*============================*)
     Text[Style["afsafasfasfasfasfsafsab", 13, 
       FontFamily -> "CourierNew"], {-1.7, 1.8}, {1, 0}],
     Arrow[{{-1.65, 1.8}, {-1.2, 1.6}}],
     (*============================*)
     Text[Style["casfasfafsafsafsafsa", 13, 
       FontFamily -> "CourierNew"], {2.3, 0.7}, {-1, 0}],
     Arrow[{{2.25, 0.65}, {1.95, 0.5}}],
     (*============================*)
     Text[Style["gwegwgwhhtrwhtrjrjwtud", 13, 
       FontFamily -> "CourierNew"], {-1.7, -2.1}, {0, 0}],
     Arrow[{{-1.7, -2.}, {-1.3, -1.5}}]
     (*============================*)
     (*, grids*)
     },
   ImageSize -> 800], RoundingRadius -> 15]

Fig. 2. Donut plot with labels and arrows.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.