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

2 vues (au cours des 30 derniers jours)
Erik
Erik le 20 Fév 2013
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})

Réponses (0)

Catégories

En savoir plus sur Combine Multiple Plots dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by