Чистка нескольких участков в одном go - PullRequest
0 голосов
/ 01 февраля 2020

У меня есть ряд линий, которые я хотел бы отметить в интерактивном режиме (используя brush). Для этого я попытался адаптировать подобный код, найденный здесь . Однако этот код не подходит для моего варианта использования, потому что он написан с учетом одной строки, в то время как у меня несколько строк (нанесенных на одну ось).

Поэтому я расширил код для достижения своей цели следующим образом:

function testbrushcode()
% Create data
t = 0:0.2:25;
x = sin(t);
y = tan(2.*t);
z = sin(2*t);

% Create figure with points

for i = 1:3

    myfig = figure();
    m{1} = plot(t, x);
    hold on
    m{2} = plot(t, y);
    m{3} = plot(t, z);
    hold off
    brush on;


    index_vec1{i} = brushed_Data_ids(myfig, m{i});


end


plot(t(index_vec1{1}), x(index_vec1{1}))
hold on
plot(t(index_vec1{2}), x(index_vec1{2}))
plot(t(index_vec1{3}), x(index_vec1{3}))
hold off

end

function [index_vec1] = brushed_Data_ids(myfig, m)

uicontrol('Parent', myfig, ...
    'Style', 'pushbutton',...
    'String', 'Get selected points index',...
    'Position', [5, 5, 200, 30],...
    'Units', 'pixels',...
    'Callback', {@mycallback, m} ...
    );

% ---> Now the user should select the points and click the button 'Get
% selected points index'
waitfor(myfig)



% Display index of selected points once the figure is closed
% disp(selectedPoints);
index_vec1 = [];
for i = 1:length(selectedPoints)
    if selectedPoints(i) == 1
        index_vec1 = [index_vec1 i];
    end
end

end

function mycallback(~, ~, mylineseries)
% Ignore the first 2 function inputs: handle of invoking object & event
% data

assignin('caller', 'selectedPoints', get(mylineseries,'BrushData'))

end

В коде есть проблема, связанная с использованием for l oop - из-за этого мне приходится трижды получать sh одних и тех же данных. Я хочу собрать sh данные один раз и получить очищенные индексы (из неокрашенных данных) для всех трех строк.

1 Ответ

3 голосов
/ 01 февраля 2020

Попробуйте этот несколько упрощенный код:

function q60017140()
% Create data
t = 0:0.2:25;
x = sin(t);
y = tan(2*t);
z = sin(2*t);

% Create figure with points
hFig = figure('Position', [295,303,1014,626]); 
hAx = subplot(1,2,1,'Parent', hFig);
hLines = plot(hAx, t,x, t,y, t,z);

hAx(2) = subplot(1,2,2);

uicontrol('Parent', hFig, ...
  'Style', 'pushbutton',...
  'String', 'Get selected points index',...
  'Position', [5, 5, 200, 30],...
  'Units', 'pixels',...
  'Callback', {@brushCallback, hLines, hAx} ...
  );

brush(hFig, 'on');

end

function brushCallback(~, ~, hLines, hAx)
index_vec = cellfun(@logical, get(hLines,'BrushData'), 'UniformOutput', false);

plot(hAx(2), ...
  hLines(1).XData(index_vec{1}), hLines(1).YData(index_vec{1}), ...
  hLines(2).XData(index_vec{2}), hLines(2).YData(index_vec{2}), ...
  hLines(3).XData(index_vec{3}), hLines(3).YData(index_vec{3}));
end

enter image description here

...