Adding Error Bars Within Multiple Data Sets
조회 수: 26 (최근 30일)
이전 댓글 표시
Hi! This is my entire code below. The bar graphs is plotting perfectly, but I'm having trouble adding error bars to the two data sets within the graph. I have the error bar code at the end, but I'm getting errors when trying to index into my bar graph to add the code. What am I doing wrong?
Pre_Sys_Slow = [116 121 119 115 130 122 120 120];
Post_Sys_Slow = [112 118 116 110 126 120 118 120];
Pre_Dia_Slow = [68 75 75 70 84 79 79 78];
Post_Dia_Slow = [64 70 72 64 78 77 70 74];
sem1 = std((Pre_Sys_Slow)/sqrt(length(Pre_Sys_Slow)));
sem2 = std((Post_Sys_Slow)/sqrt(length(Post_Sys_Slow)));
sem3 = std((Pre_Dia_Slow)/sqrt(length(Pre_Dia_Slow)));
sem4 = std((Post_Dia_Slow)/sqrt(length(Post_Dia_Slow)));
semslow=[sem1 sem2; sem3 sem4];
av1 = mean(Pre_Sys_Slow);
av2 = mean(Post_Sys_Slow);
av3 = mean(Pre_Dia_Slow);
av4 = mean(Post_Dia_Slow);
%FAST
Pre_Sys_Fast = [121 129 120 118 124 120 122 130];
Post_Sys_Fast = [126 143 121 122 126 124 124 132];
Pre_Dia_Fast = [81 88 70 70 65 82 88 80];
Post_Dia_Fast = [87 105 79 78 72 85 92 88];
sem5 = std((Pre_Sys_Fast)/sqrt(length(Pre_Sys_Fast)));
sem6 = std((Post_Sys_Fast)/sqrt(length(Post_Sys_Fast)));
sem7 = std((Pre_Dia_Fast)/sqrt(length(Pre_Dia_Fast)));
sem8 = std((Post_Dia_Fast)/sqrt(length(Post_Dia_Fast)));
semfast=[sem5 sem6,sem7 sem8];
av5 = mean(Pre_Sys_Fast);
av6 = mean(Post_Sys_Fast);
av7 = mean(Pre_Dia_Fast);
av8 = mean(Post_Dia_Fast);
figure(1);
hold on
y=[av1 av2;av3 av4];
y1=[av5 av6;av7 av8];
b1 = bar([y;y1],'grouped');
ylim([60,130])
name= {'Systolic';'';'Diastolic';'';'Systolic';'';'Diastolic'};
title('Fast and Slow Tempo Blood Pressure Pre and Post Song')
ylabel('Blood Pressure (mmHg)')
set(gca,'xticklabel', name, 'fontweight', 'bold');
legend('Pre-Song','Post-Song')
% ERROR BARS BELOW!!!
% Calculate the number of groups and number of bars in each group
[ngroups,nbars] = size(y);
[ngroups1,nbars1] = size(y1);
% Get the x coordinate of the bars
x = nan(nbars, ngroups);
for i = 1:nbars
x(i,:) = b1(:,1).XEndPoints;
end
er=errorbar(x',y,semslow, 'k','LineStyle','none','LineWidth',1);
% Get the x coordinate of the bars
x = nan(nbars1, ngroups1);
for i = 1:nbars1
x(i,:) = b1(:,2).XEndPoints;
end
er1=errorbar(x1',y1,semslow, 'k','LineStyle','none','LineWidth',1);
댓글 수: 0
답변 (1개)
Trevor
2022년 11월 22일
XEndPoints is a 1 by 4 array, while x is a 2 by 2 array. When you try to place the elements of XEndPoints into x, the dimensions are incompatable. You can use the "reshape" function to create x instead of filling in the elements with a for loop.
x = reshape(b1(:,1).XEndPoints, [2,2]);
er = errorbar(x,y,semslow, 'k','LineStyle','none','LineWidth',1);
This doesn't put the error bars in the correct location, because b1(:,1) is every other bar, while y is the first four bars in the chart. You can fix this by using this code instead, which takes the first two elements of both instances of XEndPoints and combines them:
x = reshape([b1(:,1).XEndPoints(1:2) b1(:,2).XEndPoints(1:2)], [2, 2]);
er = errorbar(x,y,semslow, 'k','LineStyle','none','LineWidth',1);
x1 = reshape([b1(:,1).XEndPoints(3:4) b1(:,2).XEndPoints(3:4)], [2, 2]);
er1=errorbar(x1,y1,semfast, 'k','LineStyle','none','LineWidth',1);
Note that the code provided causes er1 to look at semfast, as I was assuming that was your intention. Also, semfast needs to be declared as a 2 by 2 matrix instead of a vector.
댓글 수: 0
참고 항목
카테고리
Help Center 및 File Exchange에서 Matrix Indexing에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!