更新循环内的数据光标位置

时间:2016-04-11 14:49:51

标签: matlab plot matlab-figure figure

我有一个函数在给定一个新点时更新一个图(它将最后一个点附加到该行)。我希望有可能更新光标,使其自动出现在最后一个点上。目前,我确实

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

但是,它总是很慢,因为它总是会创建一个新的游标。我无法找到旧的存储位置,因此我不必创建新的。

1 个答案:

答案 0 :(得分: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

更新

作为替代方案,可以使用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])