【发布时间】:2016-04-08 05:10:52
【问题描述】:
我想将我的图例的位置设置为“最佳”(如 legend('y1','y2','Location','Best')),这样图例就不会与我的线条发生冲突,但同时,如果这样的话,我更愿意将它放在角落里可能没有数据冲突。有没有办法实现这个?
【问题讨论】:
标签: matlab matlab-figure legend legend-properties
我想将我的图例的位置设置为“最佳”(如 legend('y1','y2','Location','Best')),这样图例就不会与我的线条发生冲突,但同时,如果这样的话,我更愿意将它放在角落里可能没有数据冲突。有没有办法实现这个?
【问题讨论】:
标签: matlab matlab-figure legend legend-properties
如果有人对此感兴趣,我编写了一个基于@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
【讨论】:
我没有完整的答案,只有草图。但是,您可以尝试先将图例设置在角落
a=legend('y1', 'y2', 'Location', 'NorthEast')
然后获取它的位置
get(a,'Position')
您可以将此位置转换为坐标并使用 http://www.mathworks.com/matlabcentral/fileexchange/11837-fast-and-robust-curve-intersections .如果是这种情况,请尝试另一个角落,直到没有角落。在这种情况下,请使用“最佳”。
【讨论】: