File Exchange

image thumbnail

barweb (BARgraph With Error Bars)

version 1.2 (2.78 KB) by

Plots a fully customizable grouped bar graph with error bars

75 Ratings



View License

barweb.m calls the BAR and ERRORBAR MATLAB functions to produce bar graphs with error bars. The resultant graph is fully customizable, from group naming to legend inclusion to colormap setting. It assumes an m-by-n y-input matrix and plots m groups of n bars. The errorbar matrix must be setup the same way as the barvalues matrix (i.e. same dimensionality, matched values must have same indexes)

barweb(barvalues, errors, width, groupnames, bw_title, bw_xlabel, bw_ylabel, bw_colormap, gridstatus, bw_legend)

Comments and Ratings (101)

Fan Zhang

For the error "Index exceeds matrix dimensions. Error in barweb (line 152) x = mean(x([1 3],:)); "

Replace Lines 151 and 152 with following would work. It worked well for me using Matlab 2015a.

% x =get(get(handles.bars(i),'children'), 'xdata');
% x = mean(x([1 3],:));
x = handles.bars(i).XData + handles.bars(i).XOffset;

I am also getting the error "Index exceeds matrix dimensions. Error in barweb (line 152) x = mean(x([1 3],:)); " using identically sized data and error matrices

Jacob Pope

Great code, but is there anyway to change the code so that asymmetric error bars are used?


Jasper Cools



handec (view profile)

Excellent! Very useful app.

Evyatar Cohen

Hi all,
Dose anyone know why the one side error option doesn't work? It show only a line Parallel to the column. Also it is not in the right value (that the std spouse to be).


Hi, that function seems useful! I get an error though trying to use it. My data and error matrices are both 9 x 2. I get this error :

Index exceeds matrix dimensions.

Error in barweb (line 152)
x = mean(x([1 3],:));

Evyatar Cohen

Hi all

How can i plot multi groups on one graph, like in the example image?

Evyatar Cohen

Hi all

First this function is very useful.

How can i plot multi groups on one graph, like in the example image?


imu931 (view profile)

Very useful!


Hi there,

I have stipulated to plot only one error bar (+ve) and it does this; however, when I save it as .fig, .eps or .png the image plots with 2 error bars (+ve & -ve). I have deleted and re-drawn the plots a million times, to different formats and keep having the same problem. Am I missing something?

Kiran Karra

sara shaheen

This is a very nice function, and I want something exactly like figure 1, though I seem unavailable to get my legends on each bar to work. I'm new in Matlab and if someone could help me how the inputs are given to the function barweb to achieve figure 1 It would be a great help. Thanks in advance.


David (view profile)

Works great with the change Flo provided. Thanks.


Flo (view profile)

To get the code back working with R2015a (, the plot errors loop has to be changed to:

for i = 1:numbars
x = bsxfun(@plus, handles.bars(i).XData, [handles.bars(i).XOffset]');
handles.errors(i) = errorbar(x, barvalues(:,i), errors(:,i), 'k', 'linestyle', 'none', 'linewidth', 1);
ymax = max([ymax; barvalues(:,i)+errors(:,i)]);


Flo (view profile)


cmo (view profile)

Oleg Komarov

Oleg Komarov (view profile)

Since R2012b you can use errorbar:

x = pi/10:2*pi;
y = sin(x);
e = std(y)*ones(size(x));

hold on


Rainer (view profile)

Oh no, doesnt work with 2014b anymore.


Greg (view profile)

@Jaroslav Hlinka. Fixed this bug. Changed the plot errors loop to this. Set 'error_sides' to 3.

% Plot erros
for i = 1:numbars
x = get(get(handles.bars(i),'children'), 'xdata');
x = mean(x([1 3],:));

if error_sides == 3
pValues = barvalues;
nValues = barvalues;
handles.posErrors(i) = errorbar(x, pValues(:,i), zeros(size(errors(:,i))), errors(:,i), 'k', 'linestyle', 'none', 'linewidth', 2);
handles.negErrors(i) = errorbar(x, nValues(:,i), errors(:,i), zeros(size(errors(:,i))), 'k', 'linestyle', 'none', 'linewidth', 2);
handles.errors(i) = errorbar(x, barvalues(:,i), errors(:,i), 'k', 'linestyle', 'none', 'linewidth', 2);
ymax = max([ymax; barvalues(:,i)+errors(:,i)]);

Aaron Pancost


Li (view profile)

It is working,thank you very much!


Shuvra (view profile)



Wonderful function, very useful. Just a quick question, my error value of choice at the moment is SEM; when I input my SEM matrix (1 standard error of the mean) as my "errors" values, does this function plot 1 SEM above and below the mean (showing 2 SEM in total), or does it split 1 SEM in half and shows the upper and lower half, above and below the mean respectively (showing 1 SEM in total) ?

Thanks a bunch for the feedback!


Hey Plamen..what is your data..I may help you as have been using this great script since long for plotting..let me know about your data..


Plamen (view profile)

How do you group up different data on one plot? In the example image there are 3 groups with 'type1 type2 type3 type4' but I cannot figure out how.

Nolan Conaway



Diane (view profile)

This is a really great program. One additional feature that would be great is making it so you can make a break in the y-axis (e.g. if you have a break from 100 to 1000) when plotting data of different magnitudes.


john (view profile)

Works well.Great

I have the same problem as the previous two comments here. The groupnames input only displays 1 string on the x axis, and I have a 6x1 cell variable = groupnames. Appears to be a common problem with other users. Please Advise how to fix!


how to plot with secondary axis means values of two bars on two different y axis


David (view profile)

I seem to have run into a bug. I want to have a single bar for several groups and I set the groupnames variable to the names I want. But I end up with one group and multiple bars. I've tried inputing an mx1 vector and 1xm vector to see if that's the problem but both times I get the same results. Commenting out lines 120 and 121 fixed it. Any ideas?


Hong (view profile)

good job



Yi YIN (view profile)

amit Singh


dani din

Nice file. I recommend you to look at this post ( regarding variable inputs for functions.

Keep up the good work ;-)


musi (view profile)

(The above statement is to put samples values associated with each bar in the x-axis)


musi (view profile)

Pretty great:

it is working

% groupnames
{'1000', '2000', '5000', '10000', '15000', '20000', '25730'},


Pearl (view profile)

Thank you!


Rachel (view profile)

what are the options to set the gridstatus input to?

Casey Ta

Thanks, this was very helpful!

Casey Ta


Karen (view profile)

It would be nice if we could set different upper and lower error values... Otherwise quite cool

Ali Ali

Thanks a lot

Juan Carlos



Erin (view profile)

to plot bars horizontal
view(90, -90)

or view(-90, 90)

Patrick A.


C G (view profile)

Great. Thanks!

Jeff Chen

Works GREAT!


Ross (view profile)

This is really nice. If using values in only one group (monthly rain data, for example), is there any way to add labels to the x-axis?


James (view profile)

Thanks Bolu! This is what I was looking for.


Pearl (view profile)

Jesse Brown

Handy function. One problem: when I save a figure with one-sided bars to .png or .tif, two-sides bars show up.

Really nice and easy. But I have got a problem. I can't plot the 'X-tick' like type1, type2... written in the example figure. I have the text for each bar in a separate cell array. How to incorporate?



Anke (view profile)

really helpfull!

Dung Chu

Great. I just need view(90, -90) after all to have horizontally-aligned bar charts.


Thanks for the function! Useful, although I think I may have found an annoying bug: using 'error_sides = 1', when I save tiff file, it has the errorbar all the way down to x-axis (it is still ok when the initial figure is created). Using MATLAB R2007a on windowsXP. Any idea why/Any quick fix available?
PS. btw, the usage in the .m file might not be up to date - e.g. mentioning "barwebtype" parameter which is not amongst the function parameters.

Greg Imamura

Great program- I modified mine to allow for lower and upper errors


Clean and simple, it does a very good job. Thank you


Wenjia (view profile)

Excellent! That is just what I need.


Kshitiz Gupta

Thanks. It is very useful.

René Quilodran

Thanks Bolu !!!!! you did a great job!!!

Nikolay Stoykov

Great job, Bolu! Thanks.

Lan Huong Vu Thi

Thanks. It is useful for me !

Brajendra Singh


Jorge T

Great! saved me a lot of time!

A VanderWyst

Ben Engel

This was a great help - thanks!

alyssa smith

you're my hero. this just saved me a mountain of trouble!!

Y Guo

Thanks! Good job! Matlab should consider incorporating this!

Amanda Whitmire

Great - exactly what I needed. Thanks for sharing it.

H Hung

great stuff.. any chance of updating it so that the errors can have an upper and lower bound like the matlab errorbar function?

Kim Bostroem

Why hasn't the great Matlab thought of this himself? It's SO useful!

Juan Hincapie

Exactly what I needed!

Andy C

Just what I always wanted.

Dimka P

Very helpful! Thanks!

John Elve

The script itself is good but it lacks the possibility of a variable number of input arguments!


This is very helpful, which helped me draw the graphs in a few secs.

Diana Bedolla

For the plotting it works really good, but when I introduce the groupnames it repeats the same
first groupname in each x-tick. Any idea what could be the problem?? Thanks for the file!!

Steve Fleming

One of the very few oversights in the graphics toolbox is not having an easy way of plotting error bars! This is great and saved me a lot of time.

germana ba

thank you so much!

Richard Lemon

This works very well. What a big help. Thanks!

Will Hunting

Thanks a lot !

James Blake

Works well with R2006a. Nice and easy to change the colours of the bars and such.

Richard Cui

Neat job!

Michael Frank

Nice! produces very pretty graphs, generally very easy to use.

Scott G

Small problem with group labelling in R14.

Fix on line 124:
Add additional arguments to set(...)

set(gca, ..., 'XTick', 1:numgroups);

Angela Chapman

Unfortunately for me, not compatible with Matlab 6.0.

Jiro Doke

Pretty good, but it doesn't leave the user much control to make modifications. You should at least return the handles of the bar and errorbar objects, so that the user can modify their properties. Along the same line, you should also return the handle of the legend axes. I prefer leaving the legend (as well as title and labels) out for the user to do on their own, since it allows them to customize properties like position, fontsize, fontweight, etc.

Shai Shen-Orr



Changed the usage information


1) Now able to plot 1 vs 2-sided barwebs
2) Now able to show legend along x-axis or on standard plot
3) Made code more robust by using bar children features rather than calculating x positions manually
4) other small fixes

Updated based upon the M-Lint code report. No functional changes were made. The code was just spaced out for easier reading and comprehension.

Revised based upon M-Lint Code Report.

No functional revisions...code has just been spaced for better readability.

Revised based upon M-Lint Code Report.

No functional revisions...code has just been spaced for better readability.

MATLAB Release
MATLAB 7.1.0 (R14SP3)

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

» Watch video

Win prizes and improve your MATLAB skills

Play today