Вместо того, чтобы создавать новый объект курсора каждый раз, когда вы добавляете новые данные, вы можете создать его один раз (для каждого объекта) и сохранить его в переменной. Затем внутри цикла вы можете обновить позицию.
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
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])
большую работу! спасибо за код share – 16per9
это был не мой вопрос, я просто получаю больше опыта с matlab, и этот код хорош для построения графика :) – 16per9
@ user2205242 К сожалению! Извини за это. – Suever