This acts in the same way as MatLab's bar function but with an additional first parameter containing the errors on the y values.
The y values are plotted using MatLab's bar function.
The x values are determined from the bar plot and used with MatLab's errorbar function to add errorbars to the bar chart that are centred on the column.
Adding an extra dimension to the errors allows for asymmetric errors.
Now also compatible with new graphics introduced in 2014b
Any chance you could add an option to control the errorbar tick width, as this code used to do before Matlab 2014b kicked in:
http://www.mathworks.com/matlabcentral/fileexchange/22826-adjust-error-bar-width/content/errorbar_tick.m
Thanks!
I do not know why it wouldn't work in 2014b. Something similar was reported for 2013b though it worked in previous versions and in 2014a. I do not use 2014b so haven't tested. Perhaps a Matlab issue that will be ironed out.
This is a very useful script. Thank you!
However, I can get it to work in Matlab 2014a, but it doesn't work in Matlab 2014b trial version. The bars display properly but the error bars didn't. Do you know what the problem is? Thank you!
Thanks for your quick response. The color of both bars change together to red or green.
for example:
y=[0.33,0.362];
errY=[0.017,0.054];
h=barwitherr(errY,y);
set(h(1),'FaceColor','g')
With earlier releases barwitherr.m seemed to work fine, and the very latest R2014a works as well, so probably some minor changes/bugs in Matlab internal functions..
Really helpful function, thanks! Is there any way to get it to plot a horizontal bar graph? I tried using the "rotate" function but it comes up the error "H must contain axes children only".
Very nice function. I changed the last bit (starting at line 107) like so to get rid of the dot in the middle of the error bar.
if nRows > 1
for col = 1:nCols
% Extract the x location data needed for the errorbar plots:
x = get(get(handles.bar(col),'children'),'xdata');
% Use the mean x values to call the standard errorbar fn; the
% errorbars will now be centred on each bar; these are in ascending
% order so use xOrder to ensure y values and errors are too:
ebhandle = errorbar(mean(x,1),values(xOrder,col),lowerErrors(xOrder,col), upperErrors(xOrder, col), '.k');
set(ebhandle, 'Marker', 'none');
end
else
x = get(get(handles.bar,'children'),'xdata');
ebhandle = errorbar(mean(x,1),values,errors,'.k');
set(ebhandle, 'Marker', 'none');
Unfortunately it does not work when one deals with the only group. Even the modified built-in example does not work ( y = randn(1,4); errY = zeros(1,4,2); errY(:,:,1) = 0.1.*y; errY(:,:,2) = 0.2.*y; barwitherr(errY, y); )
In order to solve this problem, line 118 should be modified to provide errors more explicitly - like this
errorbar(mean(x,1),values,values-errors(:,:,1),errors(:,:,2)-values,'.k')
Unfortunately it does not work when one deals with the only group. Even the modified built-in example does not work ( y = randn(1,4); errY = zeros(1,4,2); errY(:,:,1) = 0.1.*y; errY(:,:,2) = 0.2.*y; barwitherr(errY, y); )
In order to solve this problem, line 118 should be modified to provide errors more explicitly - like this
errorbar(mean(x,1),values,errors(:,:,1),errors(:,:,2),'.k')
Mossi, see the help entry for the file and the help entry for bar (dictates what kind of plots can be created).
You appear to have four parameters in three conditions. So, your data (y) and errors (errY) should each be held in a 3x4 matrix.
h = barwitherr(errY, y);
Use the handles "h" to tailor figure properties/appearance.
Very useful function - I added a line to return the handle to the plot, so that existing commands from Matlab's "bar" can still be used with barwitherr:
After
>handles.bar = bar(varargin{:}); % standard implementation of bar fn
>hold on
Add:
h = handles.bar
and then change the function line at the top of the program to:
function h = barwitherr(errors,varargin)
You can then use things like
set(h(1),'FaceColor','g');
in your code that calls barwitherr, exactly as you would with calls to 'bar'.
I've added the following nice things to change color and bar size :
After line "handles.bar = bar(varargin{:}); % standard implementation of bar fn":
for n=1:length(handles.bar)
set(handles.bar(n),'edgecolor',[.4 .4 .4],'facecolor',[1 0.6 0.2]);
end
Colors can be even changed for a specified n.
After "hold off":
for n=1:length(h)
clear hh
hh=get(h(n),'children');
set(hh(2),'linewidth',1.5)
x = get(hh(2),'xdata');
w = .1; % Horizontal lines width
x(4:9:end) = x(1:9:end)-w/2;
x(7:9:end) = x(1:9:end)-w/2;
x(5:9:end) = x(1:9:end)+w/2;
x(8:9:end) = x(1:9:end)+w/2;
set(hh(2),'xdata',x(:))
end
It changes the width, and the aspect of the error bar line. With tha, you should also add an "end" after, the hold off being non longer the termination.
The other options I came across were barerror #9377 & barweb #10803 as noted earlier. They were too complex for what I wanted. This submission is not an extension of any other hence no reference. It is something I find useful and have submitted in case others would too. If not of use, no problem.
You stated that you came across other error bar scripts (like barweb, which has been around at least 6 years) but completely failed to acknowledge them.
I have just gotten around to updating this so that it can be called with asymmetric error bars. Add an extra dimension to the erros so as to specify the upper and lower in each. Hope this helps.
The ones I came across (barerror #9377 & barweb #10803) are much more complex. With complexity came the need for extra parameters and less user control.
This submission is just a basic extension of MatLab's bar and errorbar functions, which are cited!
I don't have the time to go through all of the other versions to compare. If you do, feel free to post how you get on.
What is the relevant difference between this code and submission #24718 specifically (or generally submissions #27387, #25613, #9377, or #9541)?
This is not a critique specific to this code, which is probably fine, but is there some way to reach a consensus on which of these functions is best? Or perhaps merge these submissions, or create a new umbrella submission for all of these? At any rate, the author should cite some of these predecessors.
Updates
12 Aug 2011
Now accounts for the fact that if x-values are also supplied, they may not be in ascending order.
24 Oct 2011
This version allows for asymmetric errors as requested.
15 Nov 2011
Now allows asymmetric errors on 1D data.
14 Jan 2013
Bug fix: xOrder should be specified when second argument for standard bar function is a width/property.
14 Jun 2013
Returns handle as recommended by Eric in submission comments
08 Jul 2013
Only return handle if requested.
18 Jul 2013
Recent comments addressed via bug fix, appearance update and extra optional output parameter.
27 Aug 2013
Errors always defined in terms of upper and lower, even if symmetric.