2016-08-23 5038 views
1

我有一个图文件,我想改变条目的顺序(例如,把第一个条目作为第三条)。我很久以前就保存了这张图,所以我不确定是否可以恢复原始代码。Matlab:改变图例中条目的顺序

在这里,我告诉你我的阴谋:

My plot

我想传说元素是在递减的顺序(如图片),但由于错误我的第二项指的是错误的情节(它说“25年”,但情节实际上是指最低趋势,对应于“9年”趋势)。

我可以直接从图中的属性编辑器中切换图例中条目的顺序吗?如果是,如何(我没有看到任何“订单”财产或类似的)?否则,是否有其他简单的方法来切换图例中的条目顺序?

+0

如果你加载图,难道你只是再次执行'legend'与条目的新顺序? –

+0

什么版本的MATLAB? – excaza

+0

这是Matlab R2015b – Patapunfate

回答

5

如果您的图形是在R2014b或更新的版本中生成的,则可以利用未记录的'PlotChildren'属性来操纵图例条目的顺序,而不需要新的legend调用。

例如:

x = 1:10; 
y1 = x; 
y2 = 2*x; 
y3 = 3*x; 
y4 = x.^2; 

plot(x, y1, x, y2, x, y3, x, y4); 
lh = legend('y = x', 'y = 2*x', 'y = 3*x', 'y = x.^2'); 

产地:

start

然后你就可以操作:

neworder = [3, 1, 4, 2]; 
lh.PlotChildren = lh.PlotChildren(neworder); 

生产:

yay

如果没有句柄legend对象,它是一个包含你的数据绘制在axes对象figure对象的孩子。您可以通过以下findobj方法之一找到手感,以您的legend对象:

% Handle to figure object known 
lg = findobj(figureobj, 'Type', 'legend'); 

% Handle to figure object unknown 
lh = findobj(gcf, 'Type', 'legend'); 

注意gcf一般返回句柄到最后的数字,用户点击,但这并不一定总是案件。


自我宣传编辑:此方法是在由StackOverflow的MATLAB社区一组legend manipulation tools maintained on GitHub

+0

是否有一个特殊的原因,以避免再次调用'legend',而是使用**未记录**功能? –

+1

@SembeiNorimaki,因为它维护线条系列和图例条目之间的链接。 – excaza

+0

它完美地工作。万分感谢! – Patapunfate

2

对于那些使用比R2014b更早的MATLAB版本的用户,另一种方法是通过指定plot的输出来检索绘图对象的手柄。然后,您可以在将它们传递到legend之前按照您想要的顺序重新排列手柄。

x = 1:10; 
y1 = x; 
y2 = 2*x; 
y3 = 3*x; 
y4 = x.^2; 

hplots = plot(x, y1, x, y2, x, y3, x, y4); 
labels = {'y = x', 'y = 2*x', 'y = 3*x', 'y = x.^2'}; 

% Indices specifying the order in which you want the legend entries to appear 
neworder = [3 1 4 2]; 
legend(hplots(neworder), labels(neworder)); 

更新

从文件加载时妥善处理,你可以得到所有轴的Children来获得剧情对象并获得当前的传说得到的标签。然后,您可以按照上述方法重新排列它们。

load('filename.fig'); 

labels = get(legend(), 'String'); 
plots = flipud(get(gca, 'children')); 

% Now re-create the legend 
neworder = [3 1 4 2]; 
legend(plots(neworder), labels(neworder))