Mathematica Stack Exchange is a question and answer site for users of Mathematica. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I am trying to create a pareto chart for some non technical folks and having the hardest time formatting it correctly…

Here’s my sample code:

(*Some dynamically generated data *)

mydata = {0.9436, 2.20725333345, 2.1402, 1.8729, 4.9436, 0.4819};
mylabels = {"l1", "l2", "l3", "l4", "some really long label", "another really long label", "l7"};

(*lets riffle and sort the data *)

a =  Sort[ Partition[Riffle[mylabels, mydata], 2], #1[[2]] > #2[[2]] & ];

BarChart[a , BarOrigin -> Left, BarSpacing -> -1, LabelingFunction -> (Placed[#, After] &), Axes -> None, Frame -> True, FrameTicks -> None, FrameLabel -> "Some Title", GridLines -> None, AspectRatio -> 0.3, ImageSize -> Full, ChartStyle -> "Pastel"]

A few questions:

  • What is the best way to truncate to 2 digits in the labels, I tried using NumberForm in the Sort function but doesn’t work since Numberform is a wrapper.

  • Labeling works reasonably well when labels are short but I seem to run into placement issues with long labels… Any ideas on better ways to handle this?

  • Frame produced by Mathematica seems to overlap with the labels…

Any suggestions gladly appreciated!

share|improve this question
You are aware of the ParetoPlot function? – Sjoerd C. de Vries Apr 1 '13 at 16:58
Yes… same issues apply to Pareto as well.. I thought asking a question about BarCharts may garner more responses…. – Pam Apr 1 '13 at 17:02
up vote 4 down vote accepted

Here's one approach.

mydata = N[Round[{0.9436, 2.20725333345, 2.1402, 1.8729, 4.9436, 0.4819}*100]/100];

This will make the data appear with only 2 decimal places of accuracy. If you are willing to rearrange things a bit, it's pretty easy to remove the overlap...

BarChart[Labeled[#2, #1, Before] & @@@ a, BarSpacing -> 0, 
  LabelingFunction -> (Placed[#, After] &), BarOrigin -> Left, 
  PlotLabel -> "Some Title"]

This gives:

enter image description here

share|improve this answer
That works… why doesn’t N[mydata,2] work? – Pam Apr 1 '13 at 17:26
Because the numbers you have are floating point... this would work if the argument were rational. For example, if you had expressed mydata as {47/50, 221/100, 107/50, 187/100, 247/50, 12/25}, then N[mydata,{4,3}] would do what you want. – bill s Apr 1 '13 at 17:56
Makes sense… thanks – Pam Apr 1 '13 at 18:18

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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