Изменение легенды фигуры таким образом, чтобы разные строки разделяли одну и ту же запись легенды. - PullRequest
2 голосов
/ 05 июня 2019

Коллега передал мне файл .fig, в котором много строк на одних и тех же графиках, и они окрашены в зависимости от того, к какой группе они принадлежат. Рисунок показан ниже для справки.

Мне нужно изменить легенду, чтобы строки с одинаковым цветом имели одинаковую запись легенды. Проблема в том, что у меня нет доступа к необработанным данным, поэтому я не могу использовать метод, упомянутый здесь , так есть ли способ изменить записи легенды, просто используя файл .fig? Я попытался изменить некоторые имена легенды на NaN в инспекторе свойств, но это просто изменило записи на NaN.

What I have so far

1 Ответ

0 голосов
/ 06 июня 2019

Если у вас есть файл *.fig, вы можете извлечь любые включенные данные с помощью метода 'get', если вы поняли иерархию MATLAB Графических объектов .

Например, смотрите левый график ниже как пример вашего *.fig файла. вы можете извлечь данные, пролистав Children вашего текущего объекта фигуры.

% Open your figure
fig = openfig('your_figure.fig');
% fig = gcf     % If you have the figure already opened
title('loaded figure')

% Get all objects from figure (i.e. legend and axis handle)
Objs = get(fig, 'Children');      
% axis handle is second entry of figure children
HA = Objs(2);          
% get line objects from axis (is fetched in reverse order)
HL = flipud(get(HA, 'Children'));     

% retrieve data from line objects
for i = 1:length(HL)
    xData(i,:) = get(HL(i), 'XData');
    yData(i,:) = get(HL(i), 'YData');
    cData{i} = get(HL(i), 'Color');
end

xy данные всех линий на рисунке теперь извлекаются в xData и yData. Информация о цвете сохраняется в ячейке cData. Теперь вы можете перенести рисунок с легендой так, как вы хотите (например, используя уже найденное вами SO-решение):

% Draw new figure with data extracted from old figure
figure()
title('figure with reworked legend')
hold on
for i = 1:length(HL)
    h(i) = plot(xData(i,:), yData(i,:), 'Color', cData{i});
end

% Use method of the SO answer you found already to combine equally colored
% line objects to the same color
legend([h(1), h(3)], 'y1', 'y2+3')

Результат - график внизу справа, где каждый цвет указан только один раз.

enter image description here

...