在我编写的GUI中,我意识到我的代码性能中最大的瓶颈是创建/更新图例。
目前,我在每次更新GUI时删除并重新创建图例,因为用户需要能够调整图例中的内容。我目前通过调整LINEHANDLE.Annotation.LegendInformation.IconDisplayStyle
的设置并使用legend('off');legend('show');
以下代码段显示,legend
的调用主要受到legend>make_legend
调用的限制,并且完全独立于图例内容。
close all
n=50; % number of plot lines
S=rand(n); % data
legs=cellstr(char(26*rand(n,10)+97)); % legend entries
profile on %start profiler
plot(S)
legend(legs{:})
profile viewer % view call stats
是否有更好的方法来更新图例内容而不删除它,从而强制它在娱乐时重新调用make_legend
?
此外,我想知道为什么legend
一般来说这么慢并且有这种奇怪的行为。
我在这里添加一些信息以避免the XY Problem。 我正在尝试做的最小例子是:
我正在构建一个绘制四行的GUI,我们称之为data1
,data2
,linear model 1
和linear model 2
。数据线在颜色和内容上都是独立的,而线性模型具有相同的外观并连接到相应的数据线。
我希望有一个只有三个条目的图例:data1
,data2
和linear model
。到目前为止,没问题。
我还希望有三个切换按钮,用于切换轴和图例上四条线的可见性。按钮是:
data1
,可切换data1
和linear model 1
数据行的可见性。data2
,可切换data2
和linear model 2
数据行的可见性。linear model
,用于切换linear model 1
和linear model 2
数据行的可见性。我的第一种方法是首先只将三个句柄传递给legend
,然后让按钮回调根据上面调整线对象的visibility
属性。
这会产生以下问题:当禁用第一个数据行和相应的线性模型时,linear model
的图例条目也会在连接到该特定线对象时消隐,即使另一个仍然可见。
我当前的工作方法是手动设置所有行的DisplayName
属性,然后按钮回调调整每行Annotation.LegendInformation.IconDisplayStyle
属性。根据{{3}},用户需要调用legend
来强制更新。
但是这没有实现,查看legend.m
的代码很明显,此选项仅返回当前图例对象而不进行任何其他操作。因此,我被迫调用legend('off');legend('show');
来触发(慢速)创建新的图例对象。
这当前有效但使用profile
我可以看到,图例创建是计算时间的一半,并且在较慢的笔记本电脑上使用GUI时对用户体验有相当大的影响。我已经确保我的代码只有在真正需要的情况下运行legend('off');legend('show');
。
问题是,这里的任何用户是否能够调用matlab.graphics.illustration.Legend
的不可读但可访问的类方法来触发现有对象的更新而不强制它删除和重新创建。从而执行MATHWORKS文档声称在legend
中实现的内容(尽管不是)。
或者,我愿意找到一种不同的方法来更改当前图例有效跟踪的线对象。
答案 0 :(得分:0)
您可以尝试直接更改图例对象的属性。查看http://www.mathworks.com/help/matlab/ref/legend-properties.html以获取属性列表。图例对象可以通过以下方式访问:
% Assign the output of legend to a variable. Do this only once at creation.
l = legend(<some arguments>);
% Example: change the location of the legend to 'north'
l.Location = 'north';
我认为这就是你所要求的,但我不确定是否会提高效率。