Вы сказали, что у вас есть версия Matlab до 2018a (2017b), поэтому вы не можете применить @ ответ Сардара . Вот способ сделать это без свойства NumColumns
:
Мы начнем с первой части вашего кода (в версии, совместимой с моим 2017a), где вы создадите круговую диаграмму и разместите первую половину легенды:
figure(1);
set(gcf,'Position',[350,150,750,750])
% Create a list of items for the food menu (example only).
Menu = {'Egg and Bacon', 'Egg, Sausage and becon', 'Egg and Spam', ...
'Egg, bacon and Spam', 'Egg, bacon, sausage and Spam', ...
'Spam, bacon, sausage and Spam', 'Nothing'};
% Estimate the demand for said food items (example only).
Orders = randi(150,1,length(Menu));
% Make a pie chart showing what ratio the food was ordered.
Pie_Plot = pie(Orders);
% Create two ranges to grab the first and second half of the pie chart's
% patches.
Range_1 = 1:2:ceil(length(Pie_Plot)/2);
Range_2 = Range_1(end)+2:2:length(Pie_Plot);
% In an ideal world this would be the first of two legends that would
% display at the same time:
Ideal_Leg_Pt1 = legend(Pie_Plot(Range_1),Menu(round(Range_1/2)),...
'orientation', 'horizontal','EdgeColor','none');
Далее, мы установим позицию Ideal_Leg_Pt1
вручную, чтобы освободить место:
Ideal_Leg_Pt1.Position(1:3) = [0 1-Ideal_Leg_Pt1.Position(4) 1];
Теперь мы добавим скрытые оси с тем же пирогом, но на этот раз со второй частью легенды:
% the hidden axes are neded so the first legend won't be replaced:
hidden_ax = axes('Visible','off','NextPlot','add');
% we plot the same pie, only to create the objects in the legend:
Pie_Plot_2 = pie(Orders);
% The second half of the ideal legend(s) solution:
Ideal_Leg_Pt2 = legend(Pie_Plot_2(Range_2),Menu(round(Range_2/2)),...
'orientation', 'horizontal','AutoUpdate','off',...
'EdgeColor','none');
Обратите внимание, что мы установили свойство 'AutoUpdate'
для Ideal_Leg_Pt2
в значение 'off', поэтому мы можем безопасно удалить фиктивный пирог, не удаляя элементы из легенды:
% remove the extra dummy pie:
Pie_Plot_2.delete
Теперь мы можем установить положение Ideal_Leg_Pt2
относительно положения Ideal_Leg_Pt1
, чтобы они выглядели как одна легенда:
% Define a position of the second legend to fit the first one:
% make the legend equally wide
Ideal_Leg_Pt2.Position([1 3]) = Ideal_Leg_Pt1.Position([1 3]);
% attach the two parts of the leggend
Ideal_Leg_Pt2.Position(2) = Ideal_Leg_Pt1.Position(2)-Ideal_Leg_Pt2.Position(4);
Результат:
Обратите внимание, что при любом изменении размера фигуры потребуется изменить положение легенд, поэтому, если это проблема, вы можете установить свойство 'SizeChangedFcn'
фигуры, чтобы сделать это для вас:
% updating the position of the legends upon resizing of the figure:
set(figure(1),'SizeChangedFcn',...
['Ideal_Leg_Pt1.Position(1:3) = [0 1-Ideal_Leg_Pt1.Position(4) 1];'...
'Ideal_Leg_Pt2.Position([1 3]) = Ideal_Leg_Pt1.Position([1 3]);'...
'Ideal_Leg_Pt2.Position(2) = Ideal_Leg_Pt1.Position(2)-Ideal_Leg_Pt2.Position(4);']);
или установите для этого небольшую функцию, сохраните ее в другом M-файле:
function setLgePos(Ideal_Leg_Pt1,Ideal_Leg_Pt2)
Ideal_Leg_Pt1.Position(1:3) = [0 1-Ideal_Leg_Pt1.Position(4) 1];
Ideal_Leg_Pt2.Position([1 3]) = Ideal_Leg_Pt1.Position([1 3]);
Ideal_Leg_Pt2.Position(2) = Ideal_Leg_Pt1.Position(2)-Ideal_Leg_Pt2.Position(4);
end
и вызовите его из свойства figure:
set(figure(1),'SizeChangedFcn','setLgePos(Ideal_Leg_Pt1,Ideal_Leg_Pt2)');