www.gusucode.com > mbcguitools 工具箱 matlab 源码程序 > mbcguitools/@xreglegend/private/pr_plot.m

    function pr_plot(obj)
% This is a private xreglegend function used to plot legend

%  Copyright 2000-2010 The MathWorks, Inc. and Ford Global Technologies, Inc.



obj = get(obj.axes,'UserData');

% Do some checking - ensure line and marker properties match number of items.
num = length(obj.items);
if length(obj.d.linestyle)>=num & iscell(obj.d.linestyle)
    linestyle = obj.d.linestyle(1:num);
else
    linestyle = cellstr(repmat('none',num,1));
    if iscell(obj.d.linestyle)
        linestyle(1:length(obj.d.linestyle)) = obj.d.linestyle;
    end
end
if sum(size(obj.d.linewidth)>1)<=1 & length(obj.d.linewidth)>=num
    linewidth = obj.d.linewidth(1:num);
else
    linewidth = repmat(get(0,'DefaultLineLineWidth'),1,num);
    linewidth(1:length(obj.d.linewidth)) = obj.d.linewidth;
end
if size(obj.d.linecolor,2)==3 & size(obj.d.linecolor,1)>=num
    linecolor = obj.d.linewidth(1:num,:);
else
    linecolor = zeros(num,3);
    if size(obj.d.linecolor,2)==3
        linecolor(1:size(obj.d.linecolor,1),:) = obj.d.linecolor;
    end
end
        
if length(obj.d.markerfacecolor)>=num & iscell(obj.d.markerfacecolor)
    markerfacecolor = obj.d.markerfacecolor(1:num);
else
    markerfacecolor = cellstr(repmat('none',num,1));
    if iscell(obj.d.markerfacecolor)
        markerfacecolor(1:length(obj.d.markerfacecolor)) = obj.d.markerfacecolor;
    end
end
if length(obj.d.markeredgecolor)>=num & iscell(obj.d.markeredgecolor)
    markeredgecolor = obj.d.markeredgecolor(1:num);
else
    markeredgecolor = cellstr(repmat('none',num,1));
    if iscell(obj.d.markeredgecolor)
        markeredgecolor(1:length(obj.d.markeredgecolor)) = obj.d.markeredgecolor;
    end
end
if length(obj.d.marker)>=num & iscell(obj.d.marker)
    marker = obj.d.marker(1:num);
else
    marker = cellstr(repmat('none',num,1));
    if iscell(obj.d.marker)
        marker(1:length(obj.d.marker)) = obj.d.marker;
    end
end
if sum(size(obj.d.markersize)>1)<=1 & length(obj.d.markersize)>=num
    markersize = obj.d.markersize(1:num);
else
    markersize = repmat(get(0,'DefaultLineMarkerSize'),1,num);
    markersize(1:length(obj.d.markersize)) = obj.d.markersize;
end


lh = length(obj.text);
% Ensure correct number of graphics objects
if lh>num
    delete([obj.text(num+1:end) obj.lines(num+1:end) obj.markers(num+1:end)]);
    obj.text(num+1:end) = [];
    obj.markers(num+1:end) = [];
    obj.lines(num+1:end) = [];
elseif lh<num
    for i = lh+1:num
        obj.lines(i) = line('XData',[],'YData',[],'Parent',obj.axes,'Marker','none');
        obj.markers(i) = line('XData',[],'YData',[],'Parent',obj.axes,'LineStyle','none');
        obj.text(i) = text('Position',[0 0],'String','','Parent',obj.axes,...
            'HorizontalAlignment','left',...
            'VerticalAlignment','top',...
            'Interpreter','none',...
            'FontSize',obj.d.fontsize,...
            'FontUnits',obj.d.fontunits,...
            'FontWeight',obj.d.fontweight,...
            'FontName',obj.d.fontname,...
            'Color','k');
    end
end
pos = get(obj.axes,'Position');

xpos = 0; ypos = 0;
% work out normalised gaps
xg = obj.d.gapx./pos(3);
yg = obj.d.gapy./pos(4);
xl = obj.d.linex./pos(3);

maxex = 0;
lx1 = xpos;
lx2 = xpos+xl;
mx = xpos+xl./2;
tx = lx2 + xg;
count = 1;
for i = 1:num
    % set text object
    set(obj.text(i),'String',obj.items{i},...
        'Position',[tx,ypos]);
    
    % check for overlap with edge of legend box
    ex = get(obj.text(i),'Extent');
    y = ex(2);  % working downwards, so only need bottom coordinate
    if y>1
        if count==1
            % box is too small to even display one
            % clean up the objects yet to be plotted
            delete([obj.text(count:end) obj.lines(count:end) obj.markers(count:end)]);
            obj.text(count:end) = [];
            obj.markers(count:end) = [];
            obj.lines(count:end) = [];
            break
        end
        ypos = 0;
        xpos = maxex+xg;
        lx1 = xpos;
        lx2 = xpos+xl;
        mx = xpos+xl./2;
        tx = lx2 + xg;
        if tx>=1
            % reached edge of box
            % clean up the objects yet to be plotted
            delete([obj.text(count:end) obj.lines(count:end) obj.markers(count:end)]);
            obj.text(count:end) = [];
            obj.markers(count:end) = [];
            obj.lines(count:end) = [];
            break
        end
        set(obj.text(i),'Position',[tx,ypos]);
        ex = get(obj.text(i),'Extent');
    end
    
    x = ex(1)+ex(3);
    if x>1
        totlength = x - tx;
        over = x - 1;
        frac = 1 - (over./totlength);
        guess = min(length(obj.items{i}),max(1,floor(length(obj.items{i}).*frac)));
        while x>1 & guess>=-3
            switch guess
            case -3
                set(obj.text(i),'String','');
            case -2
                set(obj.text(i),'String',obj.items{i}(1));
            case -1
                set(obj.text(i),'String',[obj.items{i}(1) '.']);
            case 0
                set(obj.text(i),'String',[obj.items{i}(1) '..']);
            otherwise
                set(obj.text(i),'String',[obj.items{i}(1:guess) '...']);
            end
            ex = get(obj.text(i),'Extent');
            x = ex(1)+ex(3);
            guess = guess - 1;
        end
        if guess==-4
            % no text displayed - finish
            % clean up the objects yet to be plotted
            delete([obj.text(count:end) obj.lines(count:end) obj.markers(count:end)]);
            obj.text(count:end) = [];
            obj.markers(count:end) = [];
            obj.lines(count:end) = [];
            break
        end
    end    
    y = ex(2);
    maxex = max(maxex,x);
    
    % set line
    set(obj.lines(i),'XData',[lx1 lx2],...
        'YData',[ypos+ex(4)./2 ypos+ex(4)./2],...
        'Color',linecolor(i,:),...
        'LineWidth',linewidth(i),...
        'LineStyle',linestyle{i});
    
    % set marker
    set(obj.markers(i),'XData',mx,...
        'YData',ypos+ex(4)./2,...
        'MarkerFaceColor',markerfacecolor{i},...
        'MarkerEdgeColor',markeredgecolor{i},...
        'Marker',marker{i},...
        'MarkerSize',markersize(i));
    
    ypos = y + yg;
    count = count + 1;
end

% store handles to text, lines and markers
builtin('set',obj.axes,'userdata',obj);