2016-04-11 5 views
0

У меня есть функция, обновляющая график с учетом новой точки (она добавляет последнюю точку к строке). Я хочу иметь возможность обновить курсор таким образом, чтобы он автоматически отображался в последней точке. В настоящее время я делаюОбновление позиции курсора данных в цикле

for i = 1 : numel(dataObjs) 
    X{i}(end+1) = newX{i}; 
    Y{i}(end+1) = newY{i}; 
    set(dataObjs(i), 'XData', X{i}); 
    set(dataObjs(i), 'YData', Y{i}); 

    set(cursorMode, 'enable', 'on'); 

    % Create a new data tip 
    hDatatip = cursorMode.createDatatip(dataObjs(i)); 

    % Update annotation position 
    hDatatip.Cursor.Position = [newX{i}, newY{i} 0]; 
end 

Однако он медленный, так как он всегда создает новый курсор. Я не могу найти, где старый хранится так, что мне не нужно создавать новые.

ответ

2

Вместо того, чтобы создавать новый объект курсора каждый раз, когда вы добавляете новые данные, вы можете создать его один раз (для каждого объекта) и сохранить его в переменной. Затем внутри цикла вы можете обновить позицию.

set(cursorMode, 'Enable', 'on') 

%// Create all of your data cursors once 
for k = 1:numel(dataObjs) 
    datacursors(k) = cursorMode.createDatatip(dataObjs(k)); 
end 

%// Now when you add new data 
for k = 1 : numel(dataObjs) 
    X{k}(end+1) = newX{k}; 
    Y{k}(end+1) = newY{k}; 
    set(dataObjs(k), 'XData', X{k}); 
    set(dataObjs(k), 'YData', Y{k}); 

    %// Update annotation position 
    datacursors(k).Cursor.Position = [newX{k}, newY{k} 0]; 
end 

И ради законченного примера:

hfig = figure(); 
data = rand(5,4); 
hplots = plot(data); 

cursorMode = datacursormode(hfig); 

for k = 1:numel(hplots) 
    datacursors(k) = cursorMode.createDatatip(hplots(k)); 
end 

for k = 1:size(data, 1) 
    for m = 1:numel(hplots) 
     set(datacursors(m), 'Position', [k, data(k,m)]) 
    end 
end 

enter image description here

Update

В качестве альтернативы вы могли использовать findall на самом деле найти курсор данных для данный сюжет. Единственным недостатком этого является то, что он добавляет накладные расходы на необходимость поиска курсора данных каждый раз, когда вы хотите его обновить.

datacursor = findall(ancestor(hplots(k), 'axes'), 'DataSource', hplots(k)); 

Другой альтернативой

Вместо того, чтобы хранить все в одной переменной, можно сохранить курсор данных в UserData собственности на сюжет самих объектов.

for k = 1:numel(hplots) 
    set(hplots(k), 'UserData', cursorMode.createDatatip(hplots(k))) 
end 

Затем, чтобы использовать его:

set(get(hplots(k), 'UserData'), 'Position', [x, y, 0]) 
+0

большую работу! спасибо за код share – 16per9

+0

это был не мой вопрос, я просто получаю больше опыта с matlab, и этот код хорош для построения графика :) – 16per9

+0

@ user2205242 К сожалению! Извини за это. – Suever

Смежные вопросы