Вы можете использовать курсор ginput
в цикле while, чтобы отметить все точки, которые вы хотите отредактировать. Затем просто нажмите за пределами осей, чтобы выйти из цикла, переместить точки и принять любую клавишу.
f = figure(1);
scatter(x,y);
ax = gca;
i = 1;
while 1
[u,v] = ginput(1);
if ~inpolygon(u,v,ax.XLim,ax.YLim); break; end;
[~, ind] = min(hypot(x-u,y-v));
h(i).handle = impoint(gca, x(ind), y(ind));
h(i).index = ind;
i = i + 1;
end
В зависимости от того, как вы обновляете свой график вы можете получить общее ускорение с помощью функций, как clf
(ясный рисунок) и cla
(четкие оси) вместо того, чтобы всегда как открыть новое окно с цифрами, как описано в this answer, может оказаться полезным.
В качестве альтернативы, это очень грубое представление о том, что я имел в виду в комментариях. Он вызывает различные ошибки, и у меня нет времени отлаживать его прямо сейчас. Но, возможно, это помогает в качестве отправной точки.
1) Обычные зарисовки данных и активизация datacursormode
x = rand(100,1);
y = rand(100,1);
xlim([0 1]); ylim([0 1])
f = figure(1)
scatter(x,y)
datacursormode on
dcm = datacursormode(f);
set(dcm,'DisplayStyle','datatip','Enable','on','UpdateFcn',@customUpdateFunction)
2) Пользовательская функция обновления оценки выбранной всплывающей подсказки и создание impoint
function txt = customUpdateFunction(empt,event_obj)
pos = get(event_obj,'Position');
ax = get(event_obj.Target,'parent');
sc = get(ax,'children');
x = sc.XData;
y = sc.YData;
mask = x == pos(1) & y == pos(2);
x(mask) = NaN;
y(mask) = NaN;
set(sc, 'XData', x, 'YData', y);
set(datacursormode(gcf),'Enable','off')
impoint(ax, pos(1),pos(2));
delete(findall(ax,'Type','hggroup','HandleVisibility','off'));
txt = {};
Он работает для, если вы хотите просто хотите переместить одну точку. Возобновление datacursormode и установки второй точки не удается:
Может быть, вы можете найти ошибку.
Поскольку 72% времени работы потребляется функцией 'impoint', вряд ли существует какой-либо запас для ее оптимизации. Пожалуйста, предоставьте еще несколько примеров, чтобы увидеть, есть ли другой подход с нуля. – thewaywewalk
Итак, сколько из этих 100 пунктов перемещено впоследствии? Я мог бы вообразить, чтобы построить точки условно, а затем использовать datatips и функцию обратного вызова, чтобы просто создать точку перетаскивания, если вы действительно хотите ее перетащить. – thewaywewalk
Это звучит для меня очень хорошая идея, как бы вы решительно выбрали то, что вы меняете? – lhcgeneva