传奇; 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
默认情况下,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