传奇; text/description 在 key/colour 之前?

Legend; text/description before key/colour?

默认情况下,MATLAB 将图例条目的文本部分放在之后 图中所用内容的样本。有什么办法可以扭转这种局面吗?例如,使用下面的代码,图例中的第一个条目是一个深蓝色矩形,后跟文本 I'm;我希望它是另一种方式(即文本 I'm 后跟一个深蓝色矩形)。我正在使用 R2017b

示例代码:

test_values = [ 12, 232, 22, 44, 67, 72, 123, 35, 98 ];
test_text   = [ "I'm", "sorry", "Dave", "I'm", "afraid", "I", "can't", "do", "that" ];

Pie = pie( test_values );

legend( test_text );

我认为这是不可能的,但如果您给图例提供空文本然后在外面显示文本,您可以解决此问题,如下所示:

figure;
Pie = pie( test_values );
emptyLegend = repmat({''},9,1);
h = legend( emptyLegend );
text(repmat(0.8,9,1),[0.8:-0.1:0]',test_text)
set(h,'Position',[0.9 0.5 0.05 0.35])

这是另一个使用一些 undocumented features:

的选项
test_values = [ 12, 232, 22, 44, 67, 72, 123, 35, 98 ];
test_text   = {'I''m'; 'sorry'; 'Dave'; 'I''m';'afraid';'I';'can''t';'do';'that'};
Pie = pie( test_values );
leg = legend(test_text,'Location','eastoutside');
drawnow % without this you can't accsses the legend entries
icons = [leg.EntryContainer.NodeChildren.Icon]; % an array with all the legend icons
leg.ItemTokenSize(1) = 0; % set the relative position of the text in the legend to x=0

% the following will probably need some fine tuning for a specific
% figure. It shifts the icons positions horizontally (i.e. only the first
% row has values other than zeros):
shift = [10    10     17     17
         0     0     0     0
         0     0     0     0];
for k = 1:numel(icons)
    % move the icon (patch) border:
    icons(k).Transform.Children.Children(1).VertexData = ...
    icons(k).Transform.Children.Children(1).VertexData+shift;
    % move the icon (patch) fill:
    icons(k).Transform.Children.Children(2).VertexData = ...
    icons(k).Transform.Children.Children(2).VertexData+shift;
end

% the following will probably need some fine tuning for a specific
% figure. It expands the legend box horizontally:
shift = [0    0     1     1
         0     0     0     0
         0     0     0     0];
leg.BoxEdge.VertexData = leg.BoxEdge.VertexData+shift; % the box border
leg.BoxFace.VertexData = leg.BoxFace.VertexData+shift; % the box face

这是基于 EBH 在其解决方案中使用的方法的替代解决方案。

希望不要被认为是抄袭,如果我道歉,请发表评论,我会删除我的答案。

我提出的解决方案没有使用任何未记录的功能,并且已经在 R2015b 上进行了测试;我不知道它是否适用于以后的版本。

想法是:

  • 通过要求所有输出参数来调用 legend 函数
  • 处理第二个输出参数
  • 该参数前半部分数据为图例text
  • 后半部分是图例patch的adta(方框)
  • 遍历此参数
  • 获取文本项的原始位置
  • 获取补丁顶点的原始坐标
  • 将文字的位置设置为补丁第一个X的原始坐标
  • 将补丁的"X"坐标设置为文本的原始"X"位置并缩放

最后一步包含 drawbak,因为它需要缩放补丁的大小以将它们保留在图例框内。

另外,我修改了图例文本的定义,因为 R2015b 没有按照问题处理字符串。

test_values = [ 12, 232, 22, 44, 67, 72, 123, 35, 98 ];
test_text   = { 'I''m', 'sorry', 'Dave', 'I''m', 'afraid', 'I' 'can''t', 'do', 'that' };

Pie = pie( test_values );
% get all the output from the legend function
[lgd,icons,plots,txt]=legend( test_text );
% Get the number of elements in the legend
n_items=length(icons)/2
% Loop over the legend's items
for i=1:n_items
   % Get the original position of the text item
   orig_txt=icons(i).Position
   % Get the original coordinated of the Vertices of the patch
   orig_mark=icons(i+n_items).Vertices
   % Set the position of the text to the original coordinate of the first
   % "X" of the patch
   icons(i).Position=[orig_mark(1) orig_txt(2)]
   % Set the "X" coordinates of the patch to the original "X" position of
   % the text and scale it
   icons(i+n_items).Vertices(:,1)=icons(i+n_items).Vertices(:,1)+orig_txt(1)*.7
end