MATLAB: Как сохранить постоянные индексы дескриптора gcf при обновлении фигур - PullRequest
0 голосов
/ 06 ноября 2018

У меня довольно сложная фигура с большим количеством данных. Я включаю и выключаю разные наборы данных, используя «видимые» команды включения / выключения, в зависимости от ввода пользователя. Тем не менее, пользователь также может добавить больше линий на график. К сожалению, дескрипторы gcf обновляют оси и данные после добавления новых графиков. Это означает, что индекс для каждого дескриптора изменяется по мере добавления новых графиков.

Есть ли способ сохранить индексы такими же? Почему сортировка MATLAB обрабатывает в обратном направлении (например, первый нанесенный рисунок является последним индексом дескриптора)? Для меня было бы гораздо разумнее, если бы первый индекс дескриптора соответствовал первому намеченному набору данных и т. Д.

Ниже приведен простой пример:

figure
plot(1:10,'-r'); hold on
plot((1:0.2:4).^2,'-k')

h = gcf;

h.Children.Children(1); %The first index contains info for the black line
h.Children.Children(2); %The second index contains info for the red line

for i = 1:2
    %Do stuff here where i = 1 is the last plot (black line) and i = 2 is the
    %first plot (red line)
end

plot((1:0.1:2).^3,'-g')

h.Children.Children(1); %Now the first index CHANGED and it now represents the green line
h.Children.Children(2); %Now the second index CHANGED and it now represents the black line
h.Chilrden.Children(3); %Now this is the new index which represents the red line

for i = 1:2
    %I want to do stuff here to the black line and the red line but the
    %indices have changed! The code and the plots are much more complicated
    %than this simple example so it is not feasible to simply change the indices manually.

    %A solution I need is for the indices pointing to different datasets to 
    %remain the same
end

1 Ответ

0 голосов
/ 06 ноября 2018

Лучший вариант, чем в зависимости от порядка дочерних объектов, - это просто построить вектор объекта Line, который обрабатывает сам себя, захватив выходные данные из функции plot, например:

figure;
hPlots(1) = plot(1:10, '-r');
hold on;
hPlots(2) = plot((1:0.2:4).^2, '-k');
hPlots(3) = plot((1:0.1:2).^3, '-g');
hPlots

hPlots = 

  1×3 Line array:

    Line    Line    Line

Например, в векторе hPlots дескриптор черной линии всегда будет вторым элементом.

В качестве альтернативы, если вы не хотите сохранять все дескрипторы, вы можете использовать Tag свойство линейных объектов, чтобы пометить каждую строку уникальной строкой, тогда используйте findobj чтобы найти этот дескриптор при необходимости с помощью тега:

figure;
plot(1:10, '-r', 'Tag', 'RED_LINE');
hold on;
plot((1:0.2:4).^2, '-k', 'Tag', 'BLACK_LINE');
plot((1:0.1:2).^3, '-g', 'Tag', 'GREEN_LINE');
hBlack = findobj(gcf, 'Tag', 'BLACK_LINE');
...