我想手动将条目添加到MATLAB图例中。这个图例可以预先存在,并包含其他图形元素'条目,但不一定。
我制作散点图,但不是使用例如scatter(x,y)
,我使用
for n = 1:numel(x)
text(x(n),y(n),num2str(n), ...
'HorizontalAlignment','center','color',[1 0 0])
end
这导致数字1到x
(和y
中的元素数量的散点图,因为它们具有相同的大小)。我想为这些数字添加一个图例条目。
我尝试使用
添加或编辑图例[h,icons,plots,s] = legend(___)
如legend
documentation page所述。我无法弄清楚如何添加图例条目,而无需绘制某些内容(例如实际的散点图或常规图)。我希望图例中的常用线条或标记符号是数字或字符,例如'n'
,表示图表中的数字。这有可能吗?如何实现这一目标?
答案 0 :(得分:1)
我的回答低于zelanix的回答,因为我的回答是基于它。
一个相当可行的解决方案可能如下:
x = rand(10, 1);
y = rand(10, 1);
figure;
text(x,y,num2str(transpose(1:numel(x))),'HorizontalAlignment','center')
% Create dummy legend entries, with white symbols.
hold on;
plot(0, 0, 'o', 'color', [1 1 1], 'visible', 'off');
plot(0, 0, 'o', 'color', [1 1 1], 'visible', 'off');
hold off;
% Create legend with placeholder entries.
[h_leg, icons] = legend('foo', 'bar');
% Create new (invisible) axes on top of the legend so that we can draw
% text on top.
ax2 = axes('position', get(h_leg, 'position'));
set(ax2, 'Color', 'none', 'Box', 'off')
set(ax2, 'xtick', [], 'ytick', []);
% Draw the numbers on the legend, positioned as per the original markers.
text(get(icons(4), 'XData'), get(icons(4), 'YData'), '1', 'HorizontalAlignment', 'center')
text(get(icons(6), 'XData'), get(icons(6), 'YData'), '2', 'HorizontalAlignment', 'center')
axes(ax1);
输出:
这方面的技巧是新轴在与图例完全相同的位置创建,icons
元素的坐标在标准化坐标中,现在可以直接在新轴内使用。当然,您现在可以随意使用任何字体大小/颜色/任何您需要的颜色。
缺点是只应在填充和定位图例后调用此方法。移动图例或添加条目不会更新自定义标记。
基于zelanix的上述答案。这是一个正在进行中的答案,我正在努力使其具有相当灵活的功能。目前,它只是一个你需要适应你的情况的脚本。
% plot some lines and some text numbers
f = figure;
plot([0 1],[0 1],[0 1],[1 0])
x = rand(25,1);
y = rand(25,1);
for n = 1:numel(x)
text(x(n),y(n),num2str(n), ...
'HorizontalAlignment','center','color',[1 0 0])
end
hold on
% scatter(x,y) % used to test the number positions
scatter(x,y,'Visible','off') % moves the legend location to best position
% create the dummy legend using some dummy plots
plot(0,0,'o','Visible','off')
[l,i] = legend('some line','some other line','some numbers','location','best');
l.Visible = 'off';
% create empty axes to mimick legend
oa = gca; % the original current axes handle
a = axes;
axis manual
a.Box = 'on';
a.XTick = [];
a.YTick = [];
% copy the legend's properties and contents to the new axes
a.Units = l.Units; % just in case
a.Position = l.Position;
i = copyobj(i,a);
% replace the marker with a red 'n'
s = findobj(i,'string','some numbers');
% m = findobj(i(i~=s),'-property','YData','marker','o');
m = findobj(i(i~=s),'-property','YData');
sy = s.Position(2);
if numel(m)>1
dy = abs(m(1).YData - sy);
for k = 2:numel(m)
h = m(k);
dy2 = abs(h.YData - sy);
if dy2<dy
kbest = k;
dy = dy2;
end
end
m = m(kbest);
end
m.Visible = 'off';
mx = m.XData;
text(mx,sy,'n','HorizontalAlignment','center','color',[1 0 0])
% reset current axes to main axes
f.CurrentAxes = oa;
结果: