Как добавить две легенды к одному графику в MATLAB?

Я хотел бы добавить две легенды к графику в MATLAB. Как я могу это сделать?


person Will    schedule 28.06.2012    source источник


Ответы (4)


Вы можете создать вторую наложенную ось с собственной легендой (конечно, в другом месте).


РЕДАКТИРОВАТЬ:

Вот краткий пример:

%# create some plot with a legend
hAx(1) = axes();
hLine(1) = plot(1:10, 'Parent',hAx(1));
set(hAx(1), 'Box','off')
legend(hLine(1), 'line')

%# copy the axis
hAx(2) = copyobj(hAx(1),gcf);
delete( get(hAx(2),'Children') )            %# delete its children
hLine(2) = plot(sin(1:10), 'Color','r', 'Parent',hAx(2));
set(hAx(2), 'Color','none', 'XTick',[], ...
    'YAxisLocation','right', 'Box','off')   %# make it transparent
legend(hLine(2), {'curve'}, 'Location','NorthWest', 'Color','w')

скриншот

person Amro    schedule 29.06.2012

Чтобы создать липкую легенду, вы можете вызвать copyobj

handle_legend = legend(handle_plot, 'string1');
copyobj(handle_legend, handle_figure);

Функция copyobj просто сохраняет соответствующую легенду на рисунке.

Это работает в пределах одной оси (нет необходимости создавать вторую наложенную ось), и таким образом можно добавить несколько легенд.

Пример:

%declare figure
hfigure = figure('Color', 'w');

%plot 2 lines (red and blue)
hplot1 = plot(1:10,'r-.x');
hold on;
hplot2 = plot(10:-1:1,'b--o');

%plot legends
hlegend1 = legend(hplot1, 'Data 1', 'Location','East'); %display legend 1
new_handle = copyobj(hlegend1,hfigure);                 %copy legend 1 --> retain
legend(hplot2, 'Data 2', 'Location','West');            %display legend 2

введите здесь описание изображения

person marsei    schedule 24.04.2014
comment
Этот метод не работает со мной (R2016a), даже при использовании «устаревшего» в качестве опции. - person tvo; 12.05.2016

пример для нескольких участков:

hAx(1) = axes();
hold on
hLine(1) = plot(1:10, 'Parent',hAx(1),'color','b');
hLine(2) = plot(3:15, 'Parent',hAx(1),'color','b', 'linestyle','--');
set(hAx(1), 'Box','off')
legend([hLine(1), hLine(2)],{ 'line' 'line2'})

%# copy the axis
hAx(2) = copyobj(hAx(1),gcf);
delete( get(hAx(2),'Children') )            %# delete its children
hold on
hLine(3) = plot(sin(1:10), 'Color','r','Parent',hAx(2));
hLine(4) = plot(cos(1:10), 'Color','r','linestyle','--','Parent',hAx(2));
hold off
set(hAx(2), 'Color','none', 'XTick',[], ...
'YAxisLocation','right', 'Box','off')   %# make it transparent
legend([hLine(3),hLine(4)], {'sin' , 'cos'}, 'Location','NorthWest', 'Color','w')
%legend(hLine(3), {'sin'}, 'Location','NorthWest', 'Color','w')
person houcinus    schedule 15.02.2017
comment
совершенно неочевидно, но это то, что мне было нужно в октаве, спс: legend([hLine(3),hLine(4)], {'sin' , 'cos'}) - person Josh.F; 03.01.2018

После того, как вы сделали первую легенду, создайте новую невидимую ручку оси:

ax=axes('Position',get(gca,'Position'),'Visible','Off');

Теперь сделайте вторую легенду на новой оси:

legend(ax,...);

Это в принципе то же самое, что и ответ @Amro, но проще и короче.

person tvo    schedule 12.05.2016
comment
Я безуспешно пробовал это в R2016b: Plot1; настроить xticks и yticks; новые оси; ...; Новые галочки и метки перекрываются со старыми. - person Jonas Stein; 31.03.2017