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.

4.90476
23 Ratings

90 Downloads

Updated

View License

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

Params:
     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

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:

barLabels={'column1name','column2name',etc...};

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

    % Bar Labeling
    for j=1:NumGroupsPerAxis
        
    text(groupDrawPos(j),sum(Y(j,:),2),...
        barLabel{i},'VerticalAlignment','bottom',...
        'HorizontalAlignment','center');
    
    end

ys chen

Thanks, very handy function!

Eunice Li

ruffntuff

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...

Data
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
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

Hi

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

Suehee Huh

Thanks!!!!

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

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)

Elizabeth

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));
bar(C(1:end-1,:),'stacked')

ADITHYAN

Works very well. Thanks a lot evan.

Daniel Paiva

Very good.

Jenny

Jenny (view profile)

Vera

Vera (view profile)

Ricardo

Very useful function!, thank you!

Tim

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,1),'facecolor','y','edgecolor','k');
set(h(i,2),'facecolor','r','edgecolor','k');
set(h(i,3),'facecolor','c','edgecolor','k');
set(h(i,4),'facecolor','g','edgecolor','k');

...so 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

Ben (view profile)

Berk

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

Berk (view profile)

grega

grega (view profile)

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

Evan

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(gca,'FontSize',18)
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)
Acknowledgements

Inspired: Machine Learning with MATLAB

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

» Watch video