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

时间:2016-08-23 14:17:45

标签: matlab matlab-figure legend legend-properties

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

在这里,我向您展示我的情节:

My plot

我希望图例元素的顺序递减(如图所示),但由于错误,我的第二个条目是指错误的情节(它表示“25年”,但情节实际上是指最低的趋势,对应“9年”趋势。)

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

4 个答案:

答案 0 :(得分:6)

如果您的数字是在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对象的句柄,则它是figure对象的子项,其中包含您的数据所绘制的axes对象。您可以使用以下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中。

答案 1 :(得分:5)

使用早于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))

答案 2 :(得分:0)

我找到了一个Matlab R2020解决方案,该解决方案可用于重新排列图例条目,而不会弄乱它们相互叠加的顺序。我是从https://matplotlib.org/1.3.1/users/legend_guide.html找到它的,它确实很简单,您需要做的就是打电话

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

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

答案 3 :(得分:0)

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

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

例如

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)

生产, Plot with original legend order

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

neworder = [3, 1, 4, 2];
ax = gca;
children = ax.Children;
legend(children(neworder), labels(neworder))

修改之前的情节制作,

Plot with amended legend order

请注意,与 another answer to a similar question 不同,这不需要在绘制图形句柄并跟踪它们时显式返回图形句柄。使用 ax.Children 从轴中简单地检索句柄。