matlab实现3个y轴绘图

通过改写plotyy,可实现3个y轴的绘图,效果还不错,分享下实现。忘了以前哪个大佬写的代码了,贴上来记录下,侵权请告知。

实现代码如下:

function [ax,hlines] = multiplotyyy(set1,set2,set3,ylabels)
% MULTIPLOTYYY - Extends plotyy to include a third y-axis and allows the
% user to plot multiple lines on each set of axes.
%
% Syntax:  [ax,hlines] = plotyyy(set1,set2,set3,ylabels)
%
% Inputs: set1 is a cell array with the xdata and ydata for the first axes
%         set2 is a cell array with the xdata and ydata for the second axes
%         set3 is a cell array with the xdata and ydata for the third axes
%         ylabels is a 3x1 cell array containing the ylabel strings
%
% Outputs: ax -     3x1 double array containing the axes' handles
%          hlines - 3x1 cell array containing the lines' handles
%
% Example:
% x1 = (0:0.01:1)'; 
% x2 = (0:0.1:1)';
% x3 = (0:0.05:1)';
% y1 = x1;
% y2 = x2.^2;
% y3 = x3.^3;
% y4 = sin(x1);
% y5 = fliplr(2*x1.^2);
% y6 = 7*cos(x1);
% y7 = 7*log(x1+1.2);
% ylabels{1}='First y-label';
% ylabels{2}='Second y-label';
% ylabels{3}='Third y-label';
% [ax,hlines] = multiplotyyy({x1,y1,x2,y2,x3,y3,x1,y4},{x1,y5},{x1,[y6,y7]},ylabels);
% legend(cat(1,hlines{:}),'a','b','c','d','e','f','g','location','w')
% 
% Based on plotyyy.m (available at www.matlabcentral.com) by :
% Denis Gilbert, Ph.D.
% 
% Author: Laura L. Proctor
% December 23, 2012
% 

narginchk(3,4)

if nargin==3
   % Use empty strings for the ylabels
   ylabels{1}=' '; ylabels{2}=' '; ylabels{3}=' ';
end

validateattributes(set1,{'cell'},{})
validateattributes(set2,{'cell'},{})
validateattributes(set3,{'cell'},{})

fh = figure('units','normalized');
cfig = get(fh,'Color');

% Preallocate the outputs
ax = zeros(3,1);
hlines = cell(3,1);

% Plot the first set of lines
ax(1) = axes('Parent',fh);
hlines{1} = plot(set1{:},'Color','b');

set(ax(1),'YColor','b')

lines = set(hlines{1}(1),'LineStyle');
lines(end) = [];
nlines = numel(lines);
markers = set(hlines{1}(1),'Marker');
markers(end) = [];
nmarkers = numel(markers);

if numel(hlines{1}) > 1
    for idx = 1:numel(hlines{1})
        set(hlines{1}(idx),'LineStyle',lines{rem(idx,nlines)+1})
        if numel(hlines{1}) > 4
            set(hlines{1}(idx),'Marker',markers{rem(idx,nmarkers)+1});
        end
    end
end

% Plot the second set of lines
ax(2) = axes('Parent',fh);
hlines{2} = plot(set2{:},'Color',[0 0.5 0]);
set(ax(2),'YAxisLocation','right','Color','none','YColor',[0 0.5 0],...
    'xlim',get(ax(1),'xlim'),'xtick',[],'box','off','XColor','k');

if numel(hlines{2}) > 1
    for idx = 1:numel(hlines{2})
        set(hlines{2}(idx),'LineStyle',lines{rem(idx,nlines)+1})
        if numel(hlines{2}) > 4
            set(hlines{2}(idx),'Marker',markers{rem(idx,nmarkers)+1});
        end
    end
end

% Set the axes position and size
pos = [0.1  0.1  0.7  0.8];
offset = pos(3)/5.5;
pos(3) = pos(3) - offset/2;
set(ax(1),'Position',pos);  
set(ax(2),'Position',pos);  

% Determine the position of the third axes
pos3=[pos(1) pos(2) pos(3)+offset pos(4)];

% Determine the proper x-limits for the third axes
limx1=get(ax(1),'xlim');
limx3=[limx1(1)   limx1(1) + 1.2*(limx1(2)-limx1(1))];

ax(3) = axes('Parent',fh);
hlines{3} = plot(set3{:},'Color','r');
set(ax(3),'Position',pos3,'box','off',...
   'Color','none','XColor','k','YColor','r',...   
   'xtick',[],'xlim',limx3,'yaxislocation','right');

if numel(hlines{3}) > 1
    for idx = 1:numel(hlines{3})
        set(hlines{3}(idx),'LineStyle',lines{rem(idx,nlines)+1})
        if numel(hlines{3}) > 4
            set(hlines{3}(idx),'Marker',markers{rem(idx,nmarkers)+1});
        end
    end
end

limy3=get(ax(3),'YLim');

% Hide unwanted portion of the x-axis line that lies between the end of the
% second and third axes
line([limx1(2) limx3(2)],[limy3(1) limy3(1)],...
   'Color',cfig,'Parent',ax(3),'Clipping','off');
axes(ax(2))

% Label all three y-axes
set(get(ax(1),'ylabel'),'string',ylabels{1})
set(get(ax(2),'ylabel'),'string',ylabels{2})
set(get(ax(3),'ylabel'),'string',ylabels{3})

调用:

x1 = (0:0.01:1)'; 
x2 = (0:0.1:1)';
x3 = (0:0.05:1)';
y1 = x1;
y2 = x2.^2;
y3 = x3.^3;
y4 = sin(x1);
y5 = fliplr(2*x1.^2);
y6 = 7*cos(x1);
y7 = 7*log(x1+1.2);
ylabels{1}='First y-label';
ylabels{2}='Second y-label';
ylabels{3}='Third y-label';
[ax,hlines] = multiplotyyy({x1,y1,x2,y2,x3,y3,x1,y4},{x1,y5},{x1,[y6,y7]},ylabels);
legend(cat(1,hlines{:}),'a','b','c','d','e','f','g','location','w')

绘图效果:

 

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值