Using plotyy with error bars and 3 sets of data...

3 views (last 30 days)
Hello All,
I have an issue with trying to make a 2-D line plot with y-axes on both left and right side for two different number ranges for the y axis. I need error bars as well for the plot. There are 3 sets of data that are made and 2 of them are going to be on the same 1st axis and one of them is going on the 2nd axis. I have really never used the plotyy, let alone trying to make errorbars on the plotyy and doing 3 sets of data on the same plot.
Here is some code that I have been playing with to try to make the the plot as of now:
sliceNum = 10;
figure
ax = gca;
for x = 1:sliceNum+1
s(x) = struct('field1',rand(1,5)*10,'field2',rand(1,5)*10+40,'field3',rand(1,5)*10);
end
needed = s(2:end);
nums = reshape([needed.field2]',5,sliceNum);
cal = [40 0.8 0.9];%need to find source
AreaVal = nums(1,:).*cal(1);
meanVal = nums(2,:).*cal(2);
RMSVal = nums(3,:).*cal(3);
numsStd = reshape([needed.field3]',5,sliceNum);
AreaValStd = numsStd(1,:).*cal(1)*0.05;
meanValStd = numsStd(2,:).*cal(2)*0.05;
RMSValStd = numsStd(3,:).*cal(3)*0.05;
errorbar(1:sliceNum,AreaVal,AreaValStd,'.-','Parent',ax);
hold(ax,'on');
errorbar(1:sliceNum,meanVal,meanValStd,'.-g','Parent',ax);
errorbar(1:sliceNum,RMSVal,RMSValStd,'.-r','Parent',ax);
hold(ax,'off');
xLab='Slice Number';
xlabel(ax,xLab);
ylabel(ax,'count ()');
% title(ax,opts.title);
legend(ax,'Sum','Mean','RMS');
legend(ax,'boxoff');
When this code is run, random data is generated (similar to the real data) and then is plotted, the plot is good, except the green and red lined data are forced to the lower part of the plot due to the blue data. I need the error bars, but have not been able (don't know how really) to put them on in plotyy. Any help or hints or guidance is very appreciated.
Thank you!
Chris
  2 Comments
Chris E.
Chris E. on 3 Jul 2013
Well to answer part of my own question, I found out how to plot with plotyy, but still have no clue how to add the error bars. Here is the new code:
sliceNum = 10;
figure
ax = gca;
for x = 1:sliceNum+1
s(x) = struct('field1',rand(1,5)*10,'field2',rand(1,5)*10+40,'field3',rand(1,5)*10);
end
needed = s(2:end);
nums = reshape([needed.field2]',5,sliceNum);
cal = [40 0.8 0.9];%need to find source
AreaVal = nums(1,:).*cal(1);
meanVal = nums(2,:).*cal(2);
RMSVal = nums(3,:).*cal(3);
numsStd = reshape([needed.field3]',5,sliceNum);
AreaValStd = numsStd(1,:).*cal(1)*0.05;
meanValStd = numsStd(2,:).*cal(2)*0.05;
RMSValStd = numsStd(3,:).*cal(3)*0.05;
[AX,H1,H2] = plotyy(1:sliceNum,AreaVal,1:sliceNum,[meanVal; RMSVal],'plot');
set(get(AX(1),'Ylabel'),'String','Area')
set(get(AX(2),'Ylabel'),'String','Mean and RMS')
set(get(AX(1),'Xlabel'),'String','Slice Number');
set(H2,'LineStyle','--')
legend(AX(1),'Area','Location','best')
legend(AX(2),'Mean', 'RMS','Location','best')
Chris E.
Chris E. on 3 Jul 2013
Well it is not pritty, but here is the code to do that (if anyone knows a better way, please let me know!):
sliceNum = 10;
figure
ax = gca;
for x = 1:sliceNum+1
s(x) = struct('field1',rand(1,5)*10,'field2',rand(1,5)*10+40,'field3',rand(1,5)*10);
end
needed = s(2:end);
nums = reshape([needed.field2]',5,sliceNum);
cal = [40 0.8 0.9];%need to find source
AreaVal = nums(1,:).*cal(1);
meanVal = nums(2,:).*cal(2);
RMSVal = nums(3,:).*cal(3);
numsStd = reshape([needed.field3]',5,sliceNum);
AreaValStd = numsStd(1,:).*cal(1)*0.05;
meanValStd = numsStd(2,:).*cal(2)*0.05;
RMSValStd = numsStd(3,:).*cal(3)*0.05;
[AX,H1,H2] = plotyy(1:sliceNum,AreaVal,1:sliceNum,[meanVal; RMSVal],'plot');
set(get(AX(1),'Ylabel'),'String','Area')
set(get(AX(2),'Ylabel'),'String','Mean and RMS')
set(get(AX(1),'Xlabel'),'String','Slice Number');
legend(AX(1),'Area','Location','best')
legend(AX(2),'Mean', 'RMS','Location','best')
hold(AX(1),'on');
hold(AX(2),'on');
errorbar(AX(1), 1:sliceNum,AreaVal,AreaValStd,'.-');
errorbar(AX(2), 1:sliceNum,meanVal,meanValStd,'.-g');
errorbar(AX(2), 1:sliceNum,RMSVal,RMSValStd,'.-r');
hold(AX(1),'off');
hold(AX(2),'off');

Sign in to comment.

Accepted Answer

Chris E.
Chris E. on 3 Jul 2013
Well it is not pritty, but here is the code to do that (if anyone knows a better way, please let me know!):
sliceNum = 10;
figure
ax = gca;
for x = 1:sliceNum+1
s(x) = struct('field1',rand(1,5)*10,'field2',rand(1,5)*10+40,'field3',rand(1,5)*10);
end
needed = s(2:end);
nums = reshape([needed.field2]',5,sliceNum);
cal = [40 0.8 0.9];%need to find source
AreaVal = nums(1,:).*cal(1);
meanVal = nums(2,:).*cal(2);
RMSVal = nums(3,:).*cal(3);
numsStd = reshape([needed.field3]',5,sliceNum);
AreaValStd = numsStd(1,:).*cal(1)*0.05;
meanValStd = numsStd(2,:).*cal(2)*0.05;
RMSValStd = numsStd(3,:).*cal(3)*0.05;
[AX,H1,H2] = plotyy(1:sliceNum,AreaVal,1:sliceNum,[meanVal; RMSVal],'plot');
set(get(AX(1),'Ylabel'),'String','Area')
set(get(AX(2),'Ylabel'),'String','Mean and RMS')
set(get(AX(1),'Xlabel'),'String','Slice Number');
legend(AX(1),'Area','Location','best')
legend(AX(2),'Mean', 'RMS','Location','best')
hold(AX(1),'on');
hold(AX(2),'on');
errorbar(AX(1), 1:sliceNum,AreaVal,AreaValStd,'.-');
errorbar(AX(2), 1:sliceNum,meanVal,meanValStd,'.-g');
errorbar(AX(2), 1:sliceNum,RMSVal,RMSValStd,'.-r');
hold(AX(1),'off');
hold(AX(2),'off');

More Answers (0)

Categories

Find more on Two y-axis in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!