File Exchange

image thumbnail

Plot Groups of Stacked Bars

version 1.0 (1.69 KB) by

Generate a bar plot with multiple stacks grouped together.

23 Ratings



View License

Plot a set of stacked bars, but group them according to labels provided.

     stackData is a 3D matrix (i.e., stackData(i, j, k) => (Group, Stack, StackElement))
     groupLabels is a CELL type (i.e., { 'a', 1 , 20, 'foo' };)

Comments and Ratings (28)


Kumush (view profile)

Thanks Evan! This is great ;-) I was wondering if there is a way to have log-scale on the y-axis? My groups are super heterogeneous, and I would like to plot them as logs (with base 10) against powes of 10 on the vertical. Many thanks.

Very useful function!

Figured out a solution for the labelling of individual columns:

Add as an input a cell array of strings:


Then, on line 36, just before the 'end' of the for loop add the following lines:

    % Bar Labeling
    for j=1:NumGroupsPerAxis

ys chen

Thanks, very handy function!

Eunice Li


Hi, trying to add legend. Plot working as expected otherwise.

Looking at Beckah Rieck's post on 12 July '16, first step is to create a handle but...

Z(:,:,1) = [EnCol'*2, EnAddDiurn'];
Z(:,:,2) = [zeros(12,1), EnAddSeas'];
(all variables are 12x1 doubles as you can see form zeros value)

Cmd to create handle
b = plotBarStackGroups(Z, months);

Error using plotBarStackGroups
Too many output arguments.

Do you see what I'm doing wrong here?
Thanks in advance!

Thanks for this Evan! Finally I would like to plot groups of stacked bars with error bars. Anyone already did it before?

regaieg rym


I want to produce the stackData matrix by my own values. Any ideas ?

Suehee Huh


Beckah Rieck

Thanks Evan!

Emma- if you are talking about x-labels for what each bar means, just add a legend:
b = plotBarStackGroups(stackData, Month);
legend([b(1,1), b(2,1), b(2,2)], 'Total Added', 'Closed- Non Quick Hits', 'Closed- Quick Hits');

If you mean Y data labels on the bars, use text:
text(b(1,1).XData', zeros(size(b(1,1).XData')), labelsAddedtoQ);

(that places them at the base).

Ashrar Matin

Thanks for the script. I would also like to add x-labels for each bar within the groups, anyone who can help me achieve that? Explaining from the example: above the label 'Test', I would like to add labels on the bars, e.g. 'a' 'b' 'c', and so on.


Samy (view profile)

thanks for the script, if you don't like the border of the plot being messed up just remove the 'hold on;' in line 20 and add 'if i == 1, hold on; end' after 'h(i,:) = bar(Y, 'stacked');'!

tan yu

tan yu (view profile)


Oleg Komarov

Oleg Komarov (view profile)

If you have a 3D array A, then reshaping your array and interleaving groups with a row of NaNs will produce the same result:

sz = size(A);
B = [A, NaN(sz(1),1,sz(3))];
B = reshape(permute(B, [2,1,3]),sz(1)*(sz(2)+1),sz(3));


Works very well. Thanks a lot evan.

Daniel Paiva

Very good.


Jenny (view profile)


Vera (view profile)


Very useful function!, thank you!


Tim (view profile)

Berk, I had the same desire and found it was pretty simple to customize.

After this...
h(i,:) = bar(Y, 'stacked');
I added this...
set(h(i,4),'facecolor','g','edgecolor','k'); that the base of each bar is always yellow, etc.

Doubt you'll need this 1 year later, but for the next rookie like myself, could be useful.

Thanks for the elegant and useful function, Evan.


Ben (view profile)


Berk (view profile)

Thanks, very handy function!

Could you please tell whether we can assign different colors to different stacks?
Currently, all the stack elements have the same color/type. However, I am wonering whether it would be possible to differentiate the different stacks?


Berk (view profile)


grega (view profile)

Nice one! Works! Example makes it clear! Thank you!


Evan (view profile)

Example usage:

NumStacksPerGroup = 3;
NumGroupsPerAxis = 6;
NumStackElements = 4;

% labels to use on tick marks for groups
groupLabels = { 'Test'; 2; 4; 6; 8; -1; };
stackData = rand(NumGroupsPerAxis,NumStacksPerGroup,NumStackElements);

plotBarStackGroups(stackData, groupLabels);
set(gcf,'Position',[100 100 720 650])
grid on
set(gca,'Layer','top') % put grid lines on top of stacks

MATLAB Release
MATLAB 7.7 (R2008b)

Inspired: Machine Learning with MATLAB

Download apps, toolboxes, and other File Exchange content using Add-On Explorer in MATLAB.

» Watch video