File Exchange

image thumbnail

barweb (BARgraph With Error Bars)

version 1.2.0.0 (2.78 KB) by Bolu Ajiboye
Plots a fully customizable grouped bar graph with error bars

49 Downloads

Updated 01 Oct 2009

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)

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

Comments and Ratings (107)

Calvin Koh

May I know how can you show the legend of the errorbar plot rather than the legend of the bar plot?

+1 for Fan Zhang's comment on 29 Oct 2017; thank you!

Jacky

When I plot a barplot with error_side = 1 (one sided error bars) the bars inside each Group get rearranged. So the value represented by the first bar when plotting with error_side = [] is the last bar when plotting with error_side = 1. This would be no big Problem, but the error bars seem not to be rearranged. Therefore the first value/bar gets the error bar from the last value/bar and so on. Do you know any solution to that?
And is it somehow possible to also plot negative values?

jun fan

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?

AAA BBB

Thanks!

handec

Excellent! Very useful app.

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

jfcabana

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],:));

Hi all

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

Hi all

First this function is very useful.

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

imu931

Very useful!

bugguts99

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

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

Works great with the change Flo provided. Thanks.

Flo

To get the code back working with R2015a (8.5.0.197613), 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)]);
end

Flo

cmo

Oleg Komarov

Since R2012b you can use errorbar:

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

bar(x,y)
hold on
errorbar(x,y,e,'rx')

Rainer

Oh no, doesnt work with 2014b anymore.

Greg

@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;
pValues(pValues<0)=NaN;
nValues = barvalues;
nValues(nValues>0)=NaN;
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);
else
handles.errors(i) = errorbar(x, barvalues(:,i), errors(:,i), 'k', 'linestyle', 'none', 'linewidth', 2);
end
ymax = max([ymax; barvalues(:,i)+errors(:,i)]);
end

Li

It is working,thank you very much!

Shuvra

Awesome

Michael

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!
M

Shatrughan

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

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.

great!

Diane

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

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!

Thanks.
G

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

David

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

good job

Mariana

Yi YIN

amit Singh

good

dani din

Nice file. I recommend you to look at this post (http://blogs.mathworks.com/loren/2009/05/05/nice-way-to-set-function-defaults/) regarding variable inputs for functions.

Keep up the good work ;-)

musi

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

musi

Pretty great:

it is working

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

Pearl

Thank you!

Rachel

what are the options to set the gridstatus input to?

Casey Ta

Thanks, this was very helpful!

Casey Ta

Karen

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

Ali Ali

Thanks a lot

Juan Carlos

Thanks!

Erin

to plot bars horizontal
view(90, -90)

or view(-90, 90)

Patrick A.

C G

Great. Thanks!

Jeff Chen

Works GREAT!

Ross

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

Thanks Bolu! This is what I was looking for.

Pearl

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?

Thanks

Anke

really helpfull!

Dung Chu

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

Arthur

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.

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

Matthew

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

Wenjia

Excellent! That is just what I need.

Mastaneh

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

Great!

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

Coolomat!
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!

J X

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

Updates

1.2.0.0

Changed the usage information

1.1.0.0

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

1.0.0.0

Updated to return handles to different aspects of plot

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 Compatibility
Created with R14SP3
Compatible with any release
Platform Compatibility
Windows macOS Linux