version 1.3.0.0 (1.77 KB) by
Venn Ravichandran

This code plots bars with errorbars, as simple as that.

As of now (2009-Jul-13), MATLAB doesn't have a built-in function to plot bars with with error bars on top of them. This function solves that problem.

To a beginning user, this provides a very simple way of plotting bar with errorbars with a simple command:

errorbarbar(y,e); % where y is the height of the bars and e is the limit to plot as error bars (of length 2*e, about y).

For an intermediate user, this function provides the handles to the BAR and ERRORBAR lines for further modification.

[b,e] = errorbarbar(y,e); % or ...

[b,e] = errorbarbar(x,y,e); % where x is center location of the group of bars

For an advanced user, this function also provides ways to modify any and all of the bar and line series properties while plotting it in the first place.

Example:

barSettings = {'facealpha',0.5,'edgecolor',[0.5 0.5 0.5]};

lineSettings = {'linestyle','--','linewidth',2};

[b,e] = errorbarbar(x,y,e,barSettings,lineSettings);

set(b,'facecolor',[0 0.5 0]); % set all bars to color green

Hint: You can use the lineSettings variable to use distinct upper and lower limits.

What it DOESN'T do:

1. Plot horizontal bar graphs

2. Work with bar(y,e,barSettings,lineSettings). Instead, use:

bar(x,y,e,barSettings,lineSettings).

Venn Ravichandran (2021). Bar with errorbars (https://www.mathworks.com/matlabcentral/fileexchange/24718-bar-with-errorbars), MATLAB Central File Exchange. Retrieved .

Created with
R2007b

Compatible with any release

**Inspired:**
superbar

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!Create scripts with code, output, and formatted text in a single executable document.

DangDang LangIoannis AgriomallosUpdate to the previous code, since it worked only for stacked bars correctly. Now it should work for grouped as well.

%% get the xdata to plot the error plots

c = b;

ydata = zeros(size(E));

a = c.BarLayout;

if strcmp(a,'stacked')

for i = 1:length(c)

xdata(:,i) = get(c(i),'XData');

for j = 1:i

ydata(:,i) = ydata(:,i) + get(c(j),'YData')';

end

end

else

for i = 1:length(c)

xdata(:,i) = get(c(i),'XData') + get(c(i),'XOffset');

ydata(:,i) = get(c(i),'YData')';

end

end

Ioannis AgriomallosIn answer of Mohamed Salim and justin murphy:

Matlab R2014b and later versions stopped using the 'Children' attribute as stated here: https://www.mathworks.com/help/matlab/graphics_transition/why-is-the-children-property-empty-for-some-objects.html

I changed the code and worked for me on R2016b, so i share just in case it's of help for anyone. You should simply replace the corresponding cell only:

%% get the xdata to plot the error plots

c = b;

ydata = zeros(size(E));

for i = 1:length(c)

xdata(:,i) = get(c(i),'XData');

for j = 1:i

ydata(:,i) = ydata(:,i) + get(c(j),'YData')';

end

end

Mohamed SalimI have the same issue as Justin

justin murphyI seem to get the following error no matter which input I put in:

Index exceeds matrix dimensions.

Error in errorbarbar (line 56)

ydata = mean(tempYData(2:3,:))';

Why might this be?? Any suggestions?

Thanks

Alexander KurzIs it possible to plot a grouped stacked bar plot with error bars with this code?

Bianca Elena IvanofHey all,

I'm using r2012a and just downloaded the .zip folder attached thinking the it'll contain a file which, once activated, would incorporate the errorbarbar function into MATLAB for me to use it as any other function. I know how to plot a bar graph using errorbarbar, done that before - but the way I've been shown how to do it doesn't require such a lengthy code. Maybe I'm missing something, but is there a way I can activate the errorbarbar option in MATLAB (without designing my bar graph using the code above)?

David J. MackReplace the third cell by the following code and it will work:

%% get the xdata to plot the error plots

drawnow();

c = get(b,'Children');

if iscell(c) && all(~cellfun(@isempty,c))

for i = 1:length(c)

xdata(:,i) = mean(get(c{i},'xdata'));

tempYData = get(c{i},'ydata');

ydata(:,i) = mean(tempYData(2:3,:))';

end

elseif length(b) > 1

for i = 1:length(b)

xdata(:,i) = b(i).XData+b(i).XOffset;

ydata(:,i) = b(i).YData;

end

else

xdata = mean(get(c,'xdata'));

tempYData = get(c,'ydata');

ydata = mean(tempYData(2:3,:))';

end

David J. MackWorks perfectly with previous ML builds. However, since the plotting change in R2013(?), BAR is not implemented as a patch object anymore and thus there are no children for the computation of the mean X position. This causes the error for grouped bars.

Wenxin XuI have the same question with Naman... Thx!

Naman Deep SinghNaman Deep SinghSay i have a data matrix (d) of 3X4, and associated error matrix (e) of 3X4 . I want to make a stacked bars of all rows with error bars given in the error matrix. I would very obliged if you could illustrate the very case using an example.

Thanks ! :)

aRight GrievousReally good piece of code. However, is it possible to colour one of the bars differently to the others (i.e as you would do using (set(h(1),'FaceColor','r') on a normal Matlab bar plot?

I have tried but it just colours them all the same...

Min LiuExcellent tool. Thx!

Xiaohui LiuOther error bars I find cannot deal with asymmetric error bounds. This one works like a charm.

ShatrughanVenn Ravichandranx = 1:10; % x-axis

y = rand(10,2); % bar-heights

L = rand(10,2)*0.01; % Lower limit

U = rand(10,2)*0.03; % Upper limit

barSettings = {};

lineSettings = {U, 'linestyle', 'none'};

errorbarbar(x, y, L, barSettings, lineSettings);

sinoTrinity Liu"Hint: You can use the lineSettings variable to use distinct upper and lower limits."

Can you give me an example? I need to draw asymmetric error bounds. Thanks.

ShatrughanThanks a lot !!

Venn Ravichandran@Shatrughan: errorbarbar(1:5, rand(5,2)*10, rand(5,2),{'stacked'});

ShatrughanIt is not as simple as you said. Would you mind putting up an illustrative example (especially for stacked bar plot). I would really appreciated it.

Thanks,

Shatrughan