Matlab 将多个对等对象归因于图例中的单个项目 简化问题

Matlab 将多个对等对象归因于图例中的单个项目 简化问题,matlab,plot,legend,Matlab,Plot,Legend,我正在策划10个项目 为了生成绘图,我在for循环中创建了10个独立的Line对象 x=1:10;y=1;10;names = num2str((1:10)'); for i = 1:10 my_plots(i) = plot(x(i),y(i),'.','Color',rgb(i,:),'MarkerSize',14); end legend(my_plots,names); 单击图例中的项目时,它会切换相应行的可见性 (legHandle.ItemHitFcn=toggleLe

我正在策划10个项目

为了生成绘图,我在for循环中创建了10个独立的
Line
对象

x=1:10;y=1;10;names = num2str((1:10)');
for i = 1:10
    my_plots(i) = plot(x(i),y(i),'.','Color',rgb(i,:),'MarkerSize',14); 
end
legend(my_plots,names);

单击图例中的项目时,它会切换相应行的可见性

legHandle.ItemHitFcn=toggleLegendItem

这很好用


当我的一些情节实际上属于同一类别时,我遇到了一些问题。

在这个简单的例子中,我可以以多种不同的方式将1:5行组合成一个对象,并将组合后的对象作为
my_plots
中的单个项目传递给图例

实际问题 我所有的
对象都分布在几个独立的轴/子地块之间。每个
轴必须保持独立,因为我需要能够自由旋转每个子地块,而不会干扰其他地块

迄今取得的进展 我已经能够在轴之间构建一个共享图例(因为同一类项目共享相同的颜色,我只需要为每个类链接第一个
),但我不知道如何将多个
对象链接到单个图例项目,这样我就能够正确地跨越每个图例项回调上的
所有

我有一系列的线

  {{Line Line Line}}
  {{Line Line Line}} 
  {{Line Line Line}}
  ...
  {{Line Line Line}}
基本上,我需要做的是将多个
对等对象设置为单个图例项,但我不确定这是否可行。


如果有人有另一个解决方案,允许在轴上组合多个
句柄,这也会很有帮助。

因此查看
legend()
函数,我发现不可能用每个项目的多个
对等对象来实例化图例。可能有一种方法可以返回并通过某种“组合对象”添加多个引用,但我不确定是否存在可以处理具有不同
父对象
句柄的对象的“组合对象”

我的问题(将回调归因于多个轴中的同一项)的一个快速修复方法是使用每个类内和跨轴的共享属性来获取每个类内所有项的句柄。在本例中,我已经将颜色指定为不同类别之间的不同颜色,但也可以使用更客观的属性,如
Tag

function toggleLegendItem(src,evnt)
    % Find all items in this category
    obj = findobj(findall(gcf,'type','Scatter'),'CData',evnt.Peer.CData);

    for oid = 1:length(obj) 
        if strcmp(obj(oid).Visible,'on')
            obj(oid).Visible = 'off';
        else 
           obj(oid).Visible= 'on';
        end
    end
end
此解决方案留下的一个麻烦是图例是仅一个轴的子项。如果每个类别在所有轴中都不存在,则缺少的类别的颜色可能不会显示。幸运的是,当您切换每个项目的可见性时,颜色会显示并正常工作。我想可能会发生其他类似的错误

function toggleLegendItem(src,evnt)
    % Find all items in this category
    obj = findobj(findall(gcf,'type','Scatter'),'CData',evnt.Peer.CData);

    for oid = 1:length(obj) 
        if strcmp(obj(oid).Visible,'on')
            obj(oid).Visible = 'off';
        else 
           obj(oid).Visible= 'on';
        end
    end
end