Simple Multiple Y axes with Scale, Pan, and Zoom Features

조회 수: 2 (최근 30일)
Erik
Erik 2013년 2월 20일
Plotting multiple signals on a line graph with separately scalable y-axes is very useful when analyzing data from data sets containing more than 2 signals (I've tried using PLOTYY or other available tools on file exchange but I wasn't fully satisfied with them so I decided to make my own)
Here is a rough script that will plot 8 scalable lines. I used the LINKAXES command to acquire a common x axes. However this command shifts most of the lines outside the white figure box and into the surrounding grey background. Is there a quick fix to my script that will scale/cut everything to the white figure box?
clear
close all
%%Dummy data
x1 = 0:0.01:1;
x2 = x1;
x3 = x1;
x4 = x1;
x5 = x1;
x6 = x1;
x7 = x1;
x8 = x1;
y1 = x1;
y2 = x2.^2;
y3 = x3.^3;
y4 = sin(x4);
y5 = cos(x5);
y6 = -cos(x6);
y7 = -sin(x7);
y8 = x8.^4;
ylabels{1}='A'; ylabels{2}='B'; ylabels{3}='C'; ylabels{4}='D'; ylabels{5}='E'; ylabels{6}='F'; ylabels{7}='G'; ylabels{8}='H';
Create figure window
fh=figure('units','normalized',...
'DefaultAxesXMinorTick','on','DefaultAxesYminorTick','on');
cfig = get(fh,'Color');
pos = [0.190 0.1 0.56 0.8]; %Axes Position [*left bottom *width height]
offset = pos(3)/15.5; %originally = /5.5
%Plot the first two lines
ah(1) = axes('Parent',fh,'XColor','k','YColor','b');
lh1 = line(x1,y1,'Color','b','Parent',ah(1));
lineColors = get(ah(1),'ColorOrder');
ah(2) = axes('Parent',fh);
lh2 = line(x2,y2,'Color','k','Parent',ah(2));
set(ah(2),'YAxisLocation','right','Color','none');
%Reduce width of the two axes generated by plotyy
pos(1) = pos(1) + offset;
pos(3) = pos(3) - offset/2;
set(ah,'position',pos);
%Determine the position of the rest of axes (spacing between
%y-axis(offset*#))
pos4=[pos(1) pos(2) pos(3)+offset pos(4)];
pos3=[pos(1) - offset pos(2) pos(3)+offset pos(4)];
pos6=[pos(1) pos(2) pos(3)+offset*2 pos(4)];
pos5=[pos(1) - offset*2 pos(2) pos(3)+offset*2 pos(4)];
pos8=[pos(1) pos(2) pos(3)+offset*3.2 pos(4)];
pos7=[pos(1) - offset*3.2 pos(2) pos(3)+offset*3.2 pos(4)];
%Determine the proper x-limits for the third and fourth axes
scale3 = pos3(3)/pos(3);
scale4 = pos4(3)/pos(3);
scale5 = pos5(3)/pos(3);
scale6 = pos6(3)/pos(3);
scale7 = pos7(3)/pos(3);
scale8 = pos8(3)/pos(3);
limx1 = get(ah(1),'xlim');
limx4 = [limx1(1) limx1(1)+scale4*(limx1(2)-limx1(1))];
limx3 = [limx1(2)-scale3*(limx1(2)-limx1(1)) limx1(2)];
limx6 = [limx1(1) limx1(1)+scale6*(limx1(2)-limx1(1))];
limx5 = [limx1(2)-scale5*(limx1(2)-limx1(1)) limx1(2)];
limx8 = [limx1(1) limx1(1)+scale8*(limx1(2)-limx1(1))];
limx7 = [limx1(2)-scale7*(limx1(2)-limx1(1)) limx1(2)];
%Create ax(3) & ax(4)
ah(3)=axes('Position',pos3,'box','off',...
'Color','none','XColor','k','YColor','g',...
'xtick',[],'xlim',limx3,'yaxislocation','left');
ah(4) = axes('Position',pos4,'box','off',...
'Color','none','XColor',cfig,'YColor','r',...
'xtick',[],'xlim',limx4,'yaxislocation','right');
ah(5)=axes('Position',pos5,'box','off',...
'Color','none','XColor','k','YColor',[1,0,.5],...
'xtick',[],'xlim',limx5,'yaxislocation','left');
ah(6)=axes('Position',pos6,'box','off',...
'Color','none','XColor','k','YColor',[0,0.5,0],...
'xtick',[],'xlim',limx6,'yaxislocation','right');
ah(7)=axes('Position',pos7,'box','off',...
'Color','none','XColor','k','YColor',[0.5,0.1,0],...
'xtick',[],'xlim',limx7,'yaxislocation','left');
ah(8)=axes('Position',pos8,'box','off',...
'Color','none','XColor','k','YColor',[0,0.7,0.7],...
'xtick',[],'xlim',limx8,'yaxislocation','right');
linkaxes([ah(8) ah(7) ah(6) ah(5) ah(4) ah(3) ah(2) ah(1)],'x'); % Link to have common X axes.
lh3 = line(x3,y3,'Color','g','Parent',ah(3));
limy3=get(ah(3),'YLim');
lh4 = line(x4,y4,'Color','r','Parent',ah(4));
limy4=get(ah(4),'YLim');
lh5 = line(x5,y5,'Color',[1,0,.5],'Parent',ah(5));
limy5=get(ah(5),'YLim');
lh6 = line(x6,y6,'Color',[0,0.5,0],'Parent',ah(6));
limy6=get(ah(6),'YLim');
lh7 = line(x7,y7,'Color',[0.5,0.1,0],'Parent',ah(7));
limy7=get(ah(7),'YLim');
lh8 = line(x8,y8,'Color',[0,0.7,0.7],'Parent',ah(8));
limy8=get(ah(8),'YLim');
%Label all y-axes
set(get(ah(1),'ylabel'),'string',ylabels{1})
set(get(ah(2),'ylabel'),'string',ylabels{2})
set(get(ah(3),'ylabel'),'string',ylabels{3})
set(get(ah(4),'ylabel'),'string',ylabels{4})
set(get(ah(5),'ylabel'),'string',ylabels{5})
set(get(ah(6),'ylabel'),'string',ylabels{6})
set(get(ah(7),'ylabel'),'string',ylabels{7})
set(get(ah(8),'ylabel'),'string',ylabels{8})

답변 (0개)

카테고리

Help CenterFile Exchange에서 Combine Multiple Plots에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by