我在许多地方进行了搜索,并没有找到一种方法来实现我想用MATLAB实现的目标:将键(文本标签)放在MATLAB图例中颜色线的左侧
我想实现这个结果,这是默认结果,例如使用gnuplot(参见上面的链接),这显然可以使用MATLAB的堂兄Octave(见Octave's legend
)可以选择legend("left")
{&#34}将标签文字放在键的左侧。"
是否可以使用MATLAB完成?
答案 0 :(得分:7)
使用@ nirvana-msu 提到的legend
的第二个输出略微更新。
我们可以通过检索当前位置并更改它来调整图例中文本和绘图对象的位置。图例中所有项目的位置单位是0到1之间的标准化数据单位。
以下内容应该有效。
%// Create some random data and display
figure;
p = plot(rand(2,3));
[L, handles] = legend({'one', 'two', 'three'});
%// Get the text handles
texts = findall(handles, 'type', 'text');
%// Get the line handles
lines = findall(handles, 'type', 'line');
%// Get the XData of all the lines
poslines = get(lines, 'XData');
%// Subtract 1 from all the positions and take the absolute value
%// this will shift them to the other side as the xlims are [0 1]
set(lines, {'XData'}, cellfun(@(x)abs(x - 1), poslines, 'uni', 0))
%// Get the position of all of the text labels
postext = get(texts, 'Position');
%// Figure out where the lines ended up
xd = get(lines, 'xdata');
xd = cat(2, xd{:});
%// Have the labels be next to the line (with 0.05 padding)
positions = cellfun(@(x)[min(xd) - 0.05, x(2:3)], postext, 'uni', 0);
set(texts, {'Position'}, positions, ...
'HorizontalAlignment', 'right');
答案 1 :(得分:5)
这是一个适用于HG1和HG2的解决方案。
这个想法与@Suever的答案有些相似 - 我们想要翻转图例中的所有文字,线条和标记,但是有一些显着的差异:
line
搜索text
和findall
句柄 - 它们可用作legend
函数的第二个输出。XData
包含起点和终点。有了文本,因为你需要控制Position
,即左边缘,但是你需要知道文本宽度来计算对称变换,因此它有点棘手。 Extent
属性为我们提供了我们所缺少的内容。代码:
hFig = figure();
axh = axes('Parent', hFig);
plot(axh, randn(100,2), '-*');
[~, hObjs] = legend(axh, {'first','second-some-long-text'});
for i = 1:length(hObjs)
hdl = hObjs(i);
if strcmp(get(hdl, 'Type'), 'text')
pos = get(hdl, 'Position');
extent = get(hdl, 'Extent'); % we need text x-position and width
pos(1) = 1-extent(1)-extent(3); % symmetrical relative to center
set(hdl, 'Position', pos);
else % 'line'
xData = get(hdl, 'XData');
if length(xData) == 2 % line
xDataNew = [1-xData(2), 1-xData(1)];
else % length(xData)==1, i.e. marker
xDataNew = 1-xData;
end
set(hdl, 'XData', xDataNew);
end
end
答案 2 :(得分:4)
我决定对HG2案采取略微不同的方法。虽然不可否认,如果这个数字最终被导出,它实际上是有用的。
我们所做的几乎是将每个可以想象的东西旋转180°:
function q37286345
%// Define some functions:
f = {'sin(x)','cos(x)','-2E-3.*x.^3'};
figure(); hold on;
for ind1 = 1:numel(f)
ezplot(f{ind1}, [-10 10]);
end
title(''); %// Just because I find the default annoying :)
%// Rotate stuff:
[L,H] = legend(f{:},'Location','SouthWest');
[H(1:3).Rotation] = deal(180);
[H(1:3).HorizontalAlignment] = deal('right');
set(gca,'XTickLabelRotation',180,'YTickLabelRotation',180,...
'XAxisLocation','top','YAxisLocation','right');
结果大致如下:
有几种容易解决的副作用:
Children
的{{1}}。我们可以探索Legend元类(Legend
)以了解有关HG2的更多信息:
'matlab.graphics.illustration.Legend'