version 1.12.0.0 (6.17 KB) by
Martina Callaghan

This is a very simple extension of MatLab's bar function to add error bars.

Released Code; update to draw graphics immediately.

Martina Callaghan (2021). barwitherr(errors,varargin) (https://www.mathworks.com/matlabcentral/fileexchange/30639-barwitherr-errors-varargin), MATLAB Central File Exchange. Retrieved .

Created with
R2010b

Compatible with any release

- Graphics > 2-D and 3-D Plots > Line Plots > Errorbars >

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

Ece KayaJun LiuSimple works best. Much better than barweb.

mohamadmmSerhii Tetoraone bug?

y = randn(3,4); % random y values (3 groups of 4 parameters)

errY = zeros(3,4,2);

errY(:,:,1) = 0.1.*y; % 10% lower error

errY(:,:,2) = 0.2.*y; % 20% upper error

[hBar, hErrorbar] = barwitherr(errY, y); % Plot with errorbars

hErrorbar

>>hErrorbar =

0.0082 1.0082 2.0072 4.0071

Andres SastoqueJonathan PoliRob FeldmannJason Yves TissièresRohan KulkarniHow can you change the color scheme of the bars?

Benji ObikenobiBravo!

Maxandre JacquelineI worked around my problem for if x is categorical by calling:

barwitherr(err,1:length(x_categorical),data);

gca.XAxis.TickLabels = x_categorical;

Maxandre JacquelineGreat but doesn't work when x is categorical. It would be amazing if you could make it work in that case.

Lionel ArteagaomidJonas WielinskiJames AdinataBrandon CummingsWorked exactly as advertised, out of the box. Thank you!

Jayasuriya SenthilvelanJayasuriya SenthilvelanHi, is there anyway to change the thickness of the error bars or customize it?

Martina CallaghanHi Oscar, this would only be the case if y is a vector not a matrix. In this case the bars are separated by group (x-axis) rather than colour. If y is a matrix then hBar will have an entry for each column of y and the face colour for these can be individually set.

Oscar KnightsI can't seem to change the 'facecolor' of each bar separately - they all change to the same colour.

set(hBar(1),'facecolor','b') - changes all bars to blue

set(hBar(2),'facecolor','r') - gives error "index exceeds matrix dimensions"

There only appears to be 1 bar in the handle, but 4 bars are plotted. Any ideas?

Paloma Garrido AmadorThank you very much, it works perfectly!

Martina CallaghanHi Harsh, yes you can have variable errors - these are passed as a matrix.

Martina CallaghanMahlet, yes, you can plot values, e.g.:

set(gca,'XTick',[1:6],'XTickLabel',{'A','B','C','D','E','F'});

or

set(gca,'XTick',[1:6],'XTickLabel',1:6);

Matt LearnerTim BlackmoreWorked perfectly. Thank you.

Mahlet ZewdeHei, Is it possible to plot values on the x axis?

Miro GrundeiChristopher HuenermundVery nice solution !!!

Balasundaram KadirveluAlmut HeinkenGreat, exactly what I needed.

Adrian JuncosCan somebody tell me how to use this extension? I can't really make heads or tails of it.

James MorelandFantastic. Immediately did what I wanted.

Francisco Garcia RosalesGreat job, thank you

Janja DermolReally helpful, thank you.

nuvoletChangoleonFidan SümbülLiguo Yangthat is really helpful, thank you very much

KevinWang15very easy to use!

Antonio VerdoneSahar MahmoudiMark DoesMohamed AbdelkareemLuca Lo VerdeDaniel CharleboisExactly what I needed. Thanks!

Amir Mohammad AlizadehIs there a way to change the color of error bars?

BrendanHarshIs there any way I can provide different error for different group and parameters?

I have a single parameter and multiple groups with symmetric error but different for each group(e.g. Group 1:10%, Group 2:30%, Group 3:20%).

Any help?

Nivedita RangarajandkvDaveGreat! Note that hold must be off before calling this function.

Anta HUANGPedram RaminPedram Raminnice job

Nico Zuo@Parto Parto's question indeed exists, since the get(h0, 'children') function can not get the individual bar which is the way in original bar function in Matlab. For example, Y=rand(1,3); eY=rand(1,3);

h0=barwitherr(eY,Y);

h1=get(h0, 'children');

Here, the h1 is not a cell which contains individual bar.

Martin SchrimpfN/AVery simple & works fine for me! Good job!

Paolo IngleseJhonatan SotoThanks, I was suffering with this, clever solution :)

diegodlhI'm not sure if this has been commented already or not. I'm using MATLAB 2015a and the hErrorbar object array output wasn't working correctly. I found the hErrorbar array preallocation (line 120) to be the problem. Commenting it out solved it. The appropriate fix would be to preallocate the object array somehow else, but I'm quite a beginner and I'm not sure how to do it.

zong zhangvery clear and useful

Paolo InglesePhilippevery effective function. Thank

Ben de MonsabertHi everyone,

The function is no longer working with Matlab R2015a and R2015b.

Because the graphics are now handled differently, the position of the middle of each bar in a grouped bar series can no longer be obtained using :

x = handles.bar(col).XData + [handles.bar(col).XOffset];

After searching on the forum and on the web, I found a solution that worked for me

For Matlab version R2015a and R2015b, the line above should be replaced (see Link 1 below) by :

x = bsxfun(@plus, hBar(col).XData, [hBar(col).XOffset]');

If this does not work (see Link 2 below), another line must be added before:

drawnow

x = bsxfun(@plus, hBar(col).XData, [hBar(col).XOffset]');

Hope it will help other R2015 users continue using this great function.

Ben

Link 1:

http://www.mathworks.com/matlabcentral/answers/170095-grouped-bar-series-xdata-in-2014b

Link2:

http://undocumentedmatlab.com/blog/hidden-hg2-plot-functionality

Guillermo DavidHi everyone!

I would like exactly this .m but with the posibility to plot in horizontal. Any ideas?

Have a nice week!

James Rankin>> Now updated for 2014b - thanks Jiri for the linke.

I had to also add a drawnow after line 115:

handles.bar = bar(varargin{:});

This is a bit weird, but the handles.bar wasn't properly initialised (XOffset used later would be 0) until the plot command had been allowed to execute...

Incidentally this was on Ubuntu 14.04.

Thanks for a useful function Martina!

Jatin GeraMartina CallaghanHi Eric,

I would suggest simply generating the plot and then applying a grayscale colour map. That's how I convert my figures for papers.

(>> colormap gray)

Martina

EricHi Martina - still an excellent function (I'm using R2013b) and thank you for updating it with my earlier suggested edit.

I'm trying to prepare a bar chart in black & white as required by a journal, and the solution here

http://blogs.mathworks.com/pick/2011/07/15/creating-hatched-patches/

reports an error:

Error using specgraph.barseries/get

The name 'paperpositionmode' is not an accessible property for an

instance of class 'barseries'.

Error in applyhatch_plusC (line 82)

oldppmode = get(h,'paperpositionmode');

...which I presume arises because of the way barwitherr generates the plot associated with the handle h.

I know it's not a fault in your code, but do you have any ideas how we could replace a colour with a hatching or shading pattern?

Thanks

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

BarbaraMartina CallaghanNow updated for 2014b - thanks Jiri for the linke.

JiriThe fix for 2014b is here:

http://www.mathworks.com/matlabcentral/answers/158899-barweb-in-2014b-doesn-t-work-any-more

Love it!

FrancescoAs mentioned by others, error bars don't show properly on the new 2014b...

CarlGreat submission - very useful! The instructions are pretty clear as well.

Martina CallaghanHi WH,

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.

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

PartoThanks 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')

Martina CallaghanHi Parto,

For example:

h = barwitherr(randn(3,4), randn(3,4));

set(h(1), 'FaceColor','r')

set(h(2), 'FaceColor','g')

The first parameter will be red and the second parameter will be green.

PartoThank you very much for this useful matlab file. I just wanted to know how I can modify each bar separately, for example color?

ElizabethThank you! Works a charm!

Feifei ZhouJaakkoNice and clean output. But, something fishy going on with Matlab R2013b. Even the example

y = randn(3,4);

errY = 0.1.*y;

h = barwitherr(errY, y);

spits out error

Error using errorbar (line 74)

X, Y and error bars must all be the same length

Error in barwitherr (line 126)

hErrorbar(col) = errorbar(mean(x,1), values(xOrder,col), lowerErrors(xOrder,col),

upperErrors(xOrder, col), '.k');

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

EfrenThank you very much! This is a very good extra. It is nice from you :)

Martina CallaghanHi Clare, yes, you can change the line width via:

[hBox hErr] = barwitherr(errY, y);

set(hErr(:), 'LineWidth', 2)

ClareVery useful submission.

Is it possible to change the line width of the error bars?

AnnickJust got it to do it with the plot editor. all good.

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

Thanks!

Martina CallaghanHi Cui, use asymmetric error bars (example in header) and set one error to 0.

CuiI only want to plot the above half errorbar, how can I do with this function? Thanks very much.

BeateMattFantastic.

Charles CollinVery 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');

end

Cherkasov NikolayUnfortunately 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')

Cherkasov NikolayUnfortunately 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')

Martina CallaghanMossi, 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.

MossiThank you so much for the useful function. I could not create a special plot though. Here is the link to the plot picture:

https://www.dropbox.com/s/jn45qasmr8zec8a/Photo%202013-06-24%201%2024%2005%20AM.png

I have created this plot in Excel but could not use Matlab to do it. Could you please guide me on how to use your function for plotting this?

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

StratosBrettThanks for the program. Aurélien, nice addition, I modified your code a little to allow for different colors for multiple parameters in each group:

edge = [.4 .4 .4;.4 .4 .4;.4 .4 .4];

face = [0 1 0;0 0 1;1 0 0];

for n=1:length(handles.bar) %set colors

set(handles.bar(n),'edgecolor',edge(n,:),'facecolor',face(n,:));

end

Aurélien BERTINI'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.

Anyway, very nice program!

LauraArmitaAlexandreBrendan FloydSimple and works well. Nice job.

Don VaughnSimple. Quick. Easy. Exactly what I was looking for

AlexWorks great for me, thanks!

Martina CallaghanAsymmetric errors on 1D/2D data now working.

JensThe asymmetric errors seem to work only with grouped/2D data

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

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

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

sinoTrinity LiuThe errors are symmetric. How can I add asymmetric errors?

Quoc Viet Hung NguyenMartina CallaghanThe 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.

Zachary DanzigerSorry, maybe its easier to search for files with file names instead of file IDs:

24718-bar-with-errorbars

27387-create-healthy-looking-error-bars

25613-barrerror-utility-for-bar-plots-with-automatic-error-bars

9377-barerror

9541-barerrorbar

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