error bar on group plot :X-data must be the same size as Y-data.
You are now following this question
- You will see updates in your followed content feed.
- You may receive emails, depending on your communication preferences.
An Error Occurred
Unable to complete the action because of changes made to the page. Reload the page to see its updated state.
Show older comments
0 votes
% Set up the problem by recreating the table.
A = [ 0 0 1 1 2 2 3 3]';
B = ['0' '1' '0' '1' '0' '1' '0' '1']';
C = [2 11 32 33 38 31 47 39]';
D = [0.5 0.7 9.5 3.3 3.8 3.1 4.7 3.9]';
T = table(A,B,C,D);
% use sortrows to organize data in an expected format
T = sortrows(T,["B","A"]);
% extract x values, group names
x = unique(T.A);
b = unique(T.B);
% Reshape the data based on the number of unique values in A
CC = reshape(T.C,length(x),[])
DD = reshape(T.D,length(x),[])
% plot
hold on
bar(x,CC)
errorbar(x,CC,DD)
legend(b)
hold off

Error using errorbar (line 105)
X-data must be the same size as Y-data.
Accepted Answer
Alan Stevens
on 27 Aug 2022
Something like this?
% Set up the problem by recreating the table.
A = [ 0 0 1 1 2 2 3 3]';
B = ['0' '1' '0' '1' '0' '1' '0' '1']';
C = [2 11 32 33 38 31 47 39]';
D = [0.5 0.7 9.5 3.3 3.8 3.1 4.7 3.9]';
T = table(A,B,C,D);
% use sortrows to organize data in an expected format
T = sortrows(T,["B","A"]);
% extract x values, group names
x = unique(T.A);
b = unique(T.B);
% Reshape the data based on the number of unique values in A
CC = reshape(T.C,length(x),[]);
DD = reshape(T.D,length(x),[]);
% plot
hold on
bar(x,CC)
errorbar(x-0.15,CC(:,1),DD(:,1),'o')
errorbar(x+0.15,CC(:,2),DD(:,2),'o')
legend(b)
hold off

7 Comments
Frederick Awuah-Gyasi
on 27 Aug 2022
yes this works. only issue now is x-1.5 is giving errors because in the orignal data x is a string: names. any suggestion on how to shift that.
Frederick Awuah-Gyasi
on 27 Aug 2022
and how do I custom color instead of the default.
Alan Stevens
on 28 Aug 2022
- Custom color is straightforward - see below.
- You don't say what the string names are. If they are just string representations of numbers, then use str2num.
% Set up the problem by recreating the table.
A = [ '0' '0' '1' '1' '2' '2' '3' '3']'; %%%%%%%%%%%%%%%
B = ['0' '1' '0' '1' '0' '1' '0' '1']';
C = [2 11 32 33 38 31 47 39]';
D = [0.5 0.7 9.5 3.3 3.8 3.1 4.7 3.9]';
T = table(A,B,C,D);
% use sortrows to organize data in an expected format
T = sortrows(T,["B","A"]);
% extract x values, group names
x = str2num(unique(T.A)); %%%%%%%%%%%%%%%%%
b = unique(T.B);
% Reshape the data based on the number of unique values in A
CC = reshape(T.C,length(x),[]);
DD = reshape(T.D,length(x),[]);
% plot
hold on
bar(x,CC)
errorbar(x-0.15,CC(:,1),DD(:,1),'o','Color','k') %%%%%%%%%%%%%%
errorbar(x+0.15,CC(:,2),DD(:,2),'o','Color','k') %%%%%%%%%%%%%%
legend(b)
hold off

Frederick Awuah-Gyasi
on 29 Aug 2022
the names of had A01,A02 etc so I created a namenumber from that and it worked. . The custom color I asked was mainly for the bars actually. Thanks so much.
Frederick Awuah-Gyasi
on 30 Aug 2022
fixed now
How do I add text labels over the bars.
% Set up the problem by recreating the table.
A = [ '0' '0' '1' '1' '2' '2' '3' '3']'; %%%%%%%%%%%%%%%
B = ['0' '1' '0' '1' '0' '1' '0' '1']';
C = [2 11 32 33 38 31 47 39]';
D = [0.5 0.7 9.5 3.3 3.8 3.1 4.7 3.9]';
E = ["Q1" "Q2" "Q1" "Q4" "Q1" "Q1" "Q2" "Q1"]';
T = table(A,B,C,D,E);
% use sortrows to organize data in an expected format
T = sortrows(T,["B","A"]);
% extract x values, group names
x = str2num(unique(T.A)); %%%%%%%%%%%%%%%%%
b = unique(T.B);
% Reshape the data based on the number of unique values in A
CC = reshape(T.C,length(x),[]);
DD = reshape(T.D,length(x),[]);
EE = reshape(T.E,length(x),[]);
% plot
hold on
hb = bar(x,CC)
errorbar(x-0.15,CC(:,1),DD(:,1),'o','Color','k') %%%%%%%%%%%%%%
errorbar(x+0.15,CC(:,2),DD(:,2),'o','Color','k') %%%%%%%%%%%%%%
% legend(b)
% xtips2 = ba(2).XEndPoints;
% ytips2 = ba(2).YEndPoints;
% labels2 = string(EE(2).YData);
%
% text(xtips2,ytips2,labels2,'HorizontalAlignment','center',...
% 'VerticalAlignment','bottom')
barWidth = hb.BarWidth;
numCol = size(CC,1);
cnt = 0;
for ii = numbersToAdd'
cnt = cnt + 1;
xPos = linspace(cnt - barWidth/2, cnt + barWidth / 2, numCol+1);
idx = 1;
for jj = xPos(1:end-1)
val = EE(cnt,idx);
y = M(cnt,idx);
text(jj, y + 1, num2str(val));
idx = idx +1;
end
end
hold off
Alan Stevens
on 7 Sep 2022
Do you mean something like this?
% Set up the problem by recreating the table.
A = [ '0' '0' '1' '1' '2' '2' '3' '3']'; %%%%%%%%%%%%%%%
B = ['0' '1' '0' '1' '0' '1' '0' '1']';
C = [2 11 32 33 38 31 47 39]';
D = [0.5 0.7 9.5 3.3 3.8 3.1 4.7 3.9]';
E = ["Q1" "Q2" "Q1" "Q4" "Q1" "Q1" "Q2" "Q1"]';
T = table(A,B,C,D,E);
% use sortrows to organize data in an expected format
T = sortrows(T,["B","A"]);
% extract x values, group names
x = str2num(unique(T.A)); %%%%%%%%%%%%%%%%%
b = unique(T.B);
% Reshape the data based on the number of unique values in A
CC = reshape(T.C,length(x),[]);
DD = reshape(T.D,length(x),[]);
EE = reshape(T.E,length(x),[]);
% plot
hold on
hb = bar(x,CC);
errorbar(x-0.15,CC(:,1),DD(:,1),'o','Color','k'); %%%%%%%%%%%%%%
errorbar(x+0.15,CC(:,2),DD(:,2),'o','Color','k'); %%%%%%%%%%%%%%
text(x-0.2,CC(:,1)+DD(:,1)+5,EE(:,1))
text(x+0.1,CC(:,2)+DD(:,2)+5,EE(:,2))
hold off

More Answers (0)
Categories
Find more on Errorbars in Help Center and File Exchange
See Also
on 27 Aug 2022
on 7 Sep 2022
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)