Matlab 将不存在的条目添加到图例中

Matlab 将不存在的条目添加到图例中,matlab,matlab-figure,Matlab,Matlab Figure,我想在MATLAB图例中手动添加一个条目。此图例可以预先存在,并包含其他图形化元素的条目,但不一定 我做了一个散点图,但没有使用例如散点(x,y),而是使用 for n = 1:numel(x) text(x(n),y(n),num2str(n), ... 'HorizontalAlignment','center','color',[1 0 0]) end 这将导致一个散点图,其中的数字为1到x(和y,因为它们的大小相同)。我想为这些数字添加一个图例条目 我试图添加或编辑带有

我想在MATLAB图例中手动添加一个条目。此图例可以预先存在,并包含其他图形化元素的条目,但不一定

我做了一个散点图,但没有使用例如
散点(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(___)
如上所述。我不知道如何添加图例条目,而不必绘制某些东西(如实际散点图或常规图)。我希望图例中常用的线或标记符号是数字或字符,如
'n'
,表示图形中的数字。这是可能的吗?如何实现这一点?

由Erik编辑 我的答案低于塞拉尼的答案,因为我的答案是基于它的


原始答案 一个相当可行的解决方案可能如下所示:

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);
输出:

其中的诀窍是,新轴与图例在完全相同的位置创建,并且
图标
元素的坐标位于归一化坐标中,现在可以直接在新轴内使用。当然,你现在可以自由使用任何字体大小/颜色/你需要的任何东西

缺点是,只有在您的图例填充和定位后,才应调用此函数。移动图例或添加条目不会更新自定义标记


埃里克的回答 根据以上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;
%绘制一些行和一些文本编号
f=数字;
绘图([01]、[01]、[01]、[10])
x=兰特(25,1);
y=兰特(25,1);
对于n=1:numel(x)
文本(x(n),y(n),num2str(n)。。。
‘水平对齐’、‘中心’、‘颜色’、[10])
结束
等等
%散点(x,y)%用于测试位置数
散布(x,y,'Visible','off')%将图例位置移动到最佳位置
%使用一些虚拟图创建虚拟图例
绘图(0,0,'o','Visible','off')
[l,i]=图例('some line','some other line','some number','location','best');
l、 可见='关闭';
%创建空轴以模仿图例
oa=gca;%原始当前轴控制柄
a=轴;
安讯士手册
a、 框='on';
a、 XTick=[];
a、 YTick=[];
%将图例的特性和内容复制到新轴
a、 单位=l.单位;%以防万一
a、 位置=l.位置;
i=复制对象j(i,a);
%将标记替换为红色的“n”
s=findobj(i,'string','some number');
%m=findobj(i(i~=s),'property','YData','marker','o');
m=findobj(i(i~=s),'property','YData');
sy=s位置(2);
如果numel(m)>1
dy=abs(m(1).YData-sy);
对于k=2:numel(m)
h=m(k);
dy2=绝对值(h.YData-sy);

如果Dy2你能用一个“@Steve-是的,但是如果图形已经有任何其他图形元素的图例,那么它就不起作用了。在这种情况下,我希望将我的自定义条目添加到该图例中。也许可以选择创建隐藏(白色)点(使用类似的代码),然后将数字添加到图例文本中,例如
1:foo
2:bar
。也可以通过这种方式向图例中添加占位符,然后通过在顶部添加文本作为注释来伪造占位符(尽管图例可能会隐藏它)。@zelanix-感谢链接和建议。我想到了以下几点:我可以使默认的图例线或标记不可见(可以通过问题中的
图标
图例
输出来完成)。然后我可以改变图例文本的位置(也在
图标中)。然后,文本字符串可能会变成“n”␣␣␣(根据需要设置空格以使其看起来正常)␣␣␣图例输入文本'。这将是所有的黑色文本,这对于黑色数字来说是可以的。然而,如果我想用不同的颜色添加另一个分散的数字,“n”不能是那种颜色。难道MATLAB的图例不只是轴吗?只是用一些更现代的图形引擎包装,与常规的轴相比,它非常硬编码和不可访问?我可以创建自己的函数,它不添加普通图例,而是添加看起来与真实图例完全相同的轴,包括图例中的任何当前条目。这将需要相当多的编程,但是,我没有时间。非常好。为了以防万一,我会添加一条线使原始图例不可见。此外,还可以使用
copyobj
图标的所有元素复制到新轴上:这将产生一个非常好的新轴,覆盖所有当前图例条目。最麻烦的是调整新轴的位置和大小以适应所有现有和新条目。最简单的方法是使用普通的
legend
功能为您完成所有工作,然后使用您的解决方案基于它创建新轴,并复制所有您想要的对象(并省略或编辑不需要的内容)。@Erik有趣的想法,这样您就可以在新轴中重新创建整个图例。这还提供了一些很好的功能,例如可以使用手动工具将其拖动。只要在创建原始图例(带有虚拟条目)后复制所有内容,则不会出现任何定位问题,因为轴使用标准化坐标。我认为这取决于你在应用程序中的通用性。我现在正在研究它,我正在尝试创建一个脚本来实现这一点。我会把它张贴在这里,如果它的工作,并添加到您的解决方案。谢谢你的帮助!没问题!祝你好运如果有用的话,请发回来-我很想看看。我已经根据你的答案编辑了你的答案,加入了我自己的答案。