【问题标题】:Updating data cursor position within a loop在循环内更新数据光标位置
【发布时间】:2016-04-11 14:49:50
【问题描述】:

我有一个函数在给定一个新点的情况下更新一个绘图(它将最后一个点附加到该线)。我希望有可能更新光标,使其自动出现在最后一点。目前,我有

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

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

【问题讨论】:

    标签: matlab plot matlab-figure figure


    【解决方案1】:

    不是每次添加新数据时都创建一个新的光标对象,而是可以创建一次(每个绘图对象)并将其保存到变量中。然后在循环内部你可以更新位置。

    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
    

    更新

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

    【讨论】:

    • 这不是我的问题,我只是对 matlab 越来越有经验,而且这段代码很适合绘图 :)
    • @user2205242 哎呀!对此感到抱歉。
    • 谢谢!因为我有专门的函数,所以在第一种情况下我必须使用persistent 变量。事实证明,它并没有比findall 快(这比我原来的解决方案至少快 5 倍)。
    • @Simon 我刚刚在帖子末尾添加了另一个可能更适合您的选项。
    • 太好了!不知道UserData字段可以写。
    猜你喜欢
    • 1970-01-01
    • 2017-09-17
    • 2012-12-30
    • 2017-03-23
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    相关资源
    最近更新 更多