我有一个图形文件,我想更改条目的顺序(例如,将第一个条目作为第三个条目)。我很久以前保存了这个Figure.fig所以我不确定我是否可以恢复原始代码。
在这里,我向您展示我的情节:
我希望图例元素的顺序递减(如图所示),但由于错误,我的第二个条目是指错误的情节(它表示“25年”,但情节实际上是指最低的趋势,对应“9年”趋势。)
我可以直接从Matlab中的图的属性编辑器切换图例中条目的顺序吗?如果是,如何(我没有看到任何“订单”属性或类似)?否则是否有任何其他简单方法来切换图例中条目的顺序?
答案 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');
产地:
然后你可以操纵:
neworder = [3, 1, 4, 2];
lh.PlotChildren = lh.PlotChildren(neworder);
产:
如果您没有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)
检索图形句柄允许以不同的顺序重新创建图例,
neworder = [3, 1, 4, 2];
ax = gca;
children = ax.Children;
legend(children(neworder), labels(neworder))
修改之前的情节制作,
请注意,与 another answer to a similar question 不同,这不需要在绘制图形句柄并跟踪它们时显式返回图形句柄。使用 ax.Children
从轴中简单地检索句柄。