I was looking for a way to make a stacked bar chart, where a bar shows the forecast and the real quantity as the part of the forecast. So, if the forecasted quantity is 10 and the real quantity is 5, then the bar height should be 10. Instead, it makes it 15, so adds up one quantity to another. Is there a way to proceed other than making additional calculations (such as calculating forecasted quantity minus real quantity and using the results instead of initial forecasted quantity?).

  • 1
    $\begingroup$ You could use the ChartLayout option "Overlapped" rather than "Stacked" but the larger one will obscure the smaller one if the data isn't properly ordered. $\endgroup$ – Mark R Jun 23 '19 at 18:48
  • $\begingroup$ Interestingly, if you use Associations for the data, Overlapped doesn't obscure the smaller. Such as this: BarChart[{Association@{"forecast" -> 10, "actual" -> 5}, Association@{"forecast" -> 30, "actual" -> 10}}, ChartLayout -> "Overlapped"] $\endgroup$ – Mark R Jun 23 '19 at 18:53
  • $\begingroup$ Thanks you very much $\endgroup$ – Liza Belyaeva Jun 23 '19 at 20:00
  • $\begingroup$ I used data from @kglr and my statement about using an association to make the data visible is wrong. Use the method below to make it work. $\endgroup$ – Mark R Jun 24 '19 at 0:22

If we use the option setting ChartLayout -> "Overlapped", some bars may become invisible:

data = {{10, 5}, {5, 10}, {15, 8}, {8, 12}};
colors = {Blue, Yellow};
legendlabels = {"actual", "forecast"};

 ChartLayout -> "Overlapped", 
 ChartStyle -> colors,
 ChartLegends -> legendlabels]

enter image description here

To make all bars visible we can use the approach in this answer to define a function to pre-process input data into a form so that all bars are visible in BarChart output:

reArrange[dat_, cols_] := Map[SortBy[-First @ # &]]@
   Transpose @ MapThread[Thread @* Style, {Transpose @ dat, cols}];

datamodified = reArrange[data, colors];
 ChartLayout -> "Overlapped", 
 ChartLegends -> SwatchLegend[colors, legendlabels]]

enter image description here


  • 1
    $\begingroup$ I like this solution but the color overlap seems slightly confusing. Perhaps using opacity for color helps make this more obvious. Such as this: colors = {Opacity[.5, Blue], Opacity[.5, Yellow]}; But this is just an opinion. $\endgroup$ – Mark R Jun 24 '19 at 0:20
  • $\begingroup$ @MarkR, using opacity is a good idea. $\endgroup$ – kglr Jun 24 '19 at 1:20

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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