当前位置:  开发笔记 > 编程语言 > 正文

传奇位置'最佳',但如果可能仍然在角落里

如何解决《传奇位置'最佳',但如果可能仍然在角落里》经验,为你挑选了1个好方法。

我想将我的传奇的位置设置为'最佳'(如legend('y1','y2','Location','Best')),因此图例不会与我的线条发生碰撞,但与此同时,如果可能没有数据冲突,我宁愿将它放在角落里.有没有办法实现这个?



1> Max..:

如果有人对此感兴趣,我写了一个基于@S的函数..答案就是我想要实现的.这是代码:

function setPositionCornerBest( figureHandle )
%Sets the Location of the legend of the figure that is referenced by figureHandle to one of the Corners if there is no data in the Corners. Otherwise it sets it to 'Best'
h = figureHandle;

figObjects = get(h,'Children');
legHandle = findobj(figObjects,'Tag','legend');
axHandle = findobj(figObjects,'Type','axes','-and','Tag','');
lineHandle = findobj(figObjects,'Type','line','-and','Parent',axHandle);
axPos = get(axHandle,'Position');

LimX = get(axHandle,'XLim');
LimY = get(axHandle,'YLim');

xScaling = (LimX(2)-LimX(1))/axPos(3);
yScaling = (LimY(2)-LimY(1))/axPos(4);

locCell = {'NorthWest','NorthEast','SouthEast','SouthWest'};
ii = 1;
interSecFlag = true;

while (interSecFlag) && (ii<=4)
    set(legHandle,'Location',locCell{ii});
    legPos = get(legHandle,'Position');

    x(1) = LimX(1)+(legPos(1)-axPos(1))*xScaling;
    x(2) = x(1);
    x(3) = LimX(1)+(legPos(1)+legPos(3)-axPos(1))*xScaling;
    x(4) = x(3);
    x(5) = x(1);

    y(1) = LimY(1)+(legPos(2)-axPos(2))*yScaling;
    y(2) = LimY(1)+(legPos(2)+legPos(4)-axPos(2))*yScaling;
    y(3) = y(2);
    y(4) = y(1);
    y(5) = y(1);

    for jj = 1:numel(lineHandle)
        xline = get(lineHandle(jj),'XData');
        yline = get(lineHandle(jj),'YData');
        [xInter ~] = intersections(x,y,xline,yline);
        if numel(xInter) == 0
            xInterFlag(jj) = 0;
        else
            xInterFlag(jj) = 1;
        end
    end

    if all(xInterFlag==0)
        interSecFlag = false;
    end

    ii = ii + 1;
end

if interSecFlag
    set(legHandle,'Location','Best');
end

end

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有