Matlab 将多个对等对象归因于图例中的单个项目 简化问题
我正在策划10个项目 为了生成绘图,我在for循环中创建了10个独立的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
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