如何将文本标签(键)放在图例中线条的左侧?

时间:2016-05-17 21:13:50

标签: matlab gnuplot matlab-figure

我在许多地方进行了搜索,并没有找到一种方法来实现我想用MATLAB实现的目标:将键(文本标签)放在MATLAB图例中颜色线的左侧

enter image description here

我想实现这个结果,这是默认结果,例如使用gnuplot(参见上面的链接),这显然可以使用MATLAB的堂兄Octave(见Octave's legend)可以选择legend("left") {&#34}将标签文字放在键的左侧。"

是否可以使用MATLAB完成?

3 个答案:

答案 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');

R2014a

enter image description here

R2015b

enter image description here

答案 1 :(得分:5)

这是一个适用于HG1和HG2的解决方案。

这个想法与@Suever的答案有些相似 - 我们想要翻转图例中的所有文字,线条和标记,但是有一些显着的差异:

  1. 无需使用line搜索textfindall句柄 - 它们可用作legend函数的第二个输出。
  2. 没有必要猜测合理的位置应该是什么。我们只需要对称地翻转所有控件。使用行很容易,因为XData包含起点和终点。有了文本,因为你需要控制Position,即左边缘,但是你需要知道文本宽度来计算对称变换,因此它有点棘手。 Extent属性为我们提供了我们所缺少的内容。
  3. 代码:

    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
    

    enter image description here

答案 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');

结果大致如下:

The rotated image

有几种容易解决的副作用:

  • 图例输入顺序将与绘图顺序相反(除非重新排序Children的{​​{1}}。
  • 轴的标签也需要旋转(或消除......)。

旁注:

我们可以探索Legend元类(Legend)以了解有关HG2的更多信息:

'matlab.graphics.illustration.Legend'