2016-04-11 12 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

更新

作爲替代你使用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

偉大的工作!感謝代碼共享 – 16per9

+0

這不是我的問題,我只是越來越有經驗的matlab和這個代碼是好的繪圖:) – 16per9

+0

@ user2205242哎呀!對於那個很抱歉。 – Suever