Matlab:图形图例中条目的更改顺序

Matlab:图形图例中条目的更改顺序,matlab,matlab-figure,legend,legend-properties,Matlab,Matlab Figure,Legend,Legend Properties,我有一个图形文件,我想在其中更改条目的顺序(例如,将第一个条目作为第三个条目)。我很久以前就保存了这个fig.fig,所以我不确定是否可以恢复原始代码 这里我向你展示我的情节: 我希望图例元素按降序排列(如图所示),但由于一个错误,我的第二个条目指的是错误的绘图(它表示“25年”,但绘图实际上指的是最低趋势,对应于“9年”趋势) 我可以直接从Matlab中图形的属性编辑器切换图例中条目的顺序吗?如果是,如何(我没有看到任何“订单”属性或类似属性)?否则,是否有其他简单的方法来切换图例中条目的顺

我有一个图形文件,我想在其中更改条目的顺序(例如,将第一个条目作为第三个条目)。我很久以前就保存了这个fig.fig,所以我不确定是否可以恢复原始代码

这里我向你展示我的情节:

我希望图例元素按降序排列(如图所示),但由于一个错误,我的第二个条目指的是错误的绘图(它表示“25年”,但绘图实际上指的是最低趋势,对应于“9年”趋势)


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

如果您的地物是在R2014b或更新版本中生成的,则可以使用未记录的
'PlotChildren'
属性来操纵图例条目的顺序,而无需重新调用

例如:

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');
产生:

然后可以对其进行操作:

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

如果您没有
图例
对象的句柄,则它是包含打印数据的对象的对象的子对象。您可以使用以下方法之一找到
图例
对象的句柄:

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

% Handle to figure object unknown
lh = findobj(gcf, 'Type', 'legend');
请注意,通常会将句柄返回到用户单击的最后一个图形,但不一定总是这样



自升级编辑:此方法包含在StackOverflow MATLAB社区的一组中。

对于使用早于R2014b版本的MATLAB的用户,另一种选择是通过指定到
plot
的输出来检索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));
更新

要在从文件加载时正确处理,可以获取轴的所有子对象以获取打印对象,并获取当前图例以获取标签。然后,您可以像上面的方法一样对它们重新排序

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))

我找到了一个MatlabR2020解决方案,它可以用来重新排序图例条目,而不会弄乱它们相互重叠的顺序。我是从那里找到的,很简单,你只要打个电话就行了

legend([p2, p1], ["line 2", "line 1"])
p1是打印时创建的线对象 p1=绘图(…) 与uistack一起,我可以更改在哪个对象上绘制的对象,但是可以对图例进行重新排序,使其有意义。范例

uistack(psave_d,'top') % Brings certain line to front
legend([psave_a, psave_b, psave_g, psave_c, psave_d, psave_e, psave_f, psave_pde], ["k_y=0.000001 W/m/K","k_y=0.0001 W/m/K","k_y=0.001 W/m/K","k_y=0.01 W/m/K","k_y=0.1 W/m/K","k_y=1 W/m/K","k_y=10 W/m/K","Isothermal PDE Numerical Model"])

如果有人需要更多的细节,我很乐意提供。干杯

根据我的经验和excaza回答中其他地方的评论,他们使用未记录函数的解决方案似乎在R2017a之后不再有效

以下使用与excaza原始答案相同的示例图,但不需要未记录的功能,并且似乎使用(至少)R2021a工作。它利用了指定一组图形对象以添加图例标签的功能。此功能似乎保留了传入这些图形对象的顺序

比如说,

x = 1:10;
y1 = x;
y2 = 2*x;
y3 = 3*x;
y4 = x.^2;
plot(x, y1, x, y2, x, y3, x, y4);
labels = {'y = x', 'y = 2*x', 'y = 3*x', 'y = x.^2'};
legend(labels)
生产,,

检索图形句柄允许以不同的顺序重新创建图例

neworder = [3, 1, 4, 2];
ax = gca;
children = ax.Children;
legend(children(neworder), labels(neworder))
修正了之前的情节


请注意,与此不同,这不需要在绘制图形句柄时显式返回它们并跟踪它们。使用
ax.Children

从轴检索控制柄,如果加载图形,你能不能用新的条目顺序再次执行
legend
?什么版本的MATLAB?它是MATLAB R2015b?这个数字也是在R2015b中生成的?是的,我很确定这是不是有特别的原因避免再次调用
legend
,而是使用未记录的函数?@SembeiNorimaki,因为它保持线条系列和图例条目之间的链接。这太棒了!然而,在R2017a或b中,我很难让它工作。以新的顺序分配子级根本不起任何作用(在使用“set”方法时也是如此)。它在R2016b中仍然可以正常工作。有什么想法吗?嗨,埃米尔,很遗憾,R2017a中引入了对图形引擎的改进。使用未记录的功能的危害之一;不幸的是,我还没有时间研究其他方法。