2016-04-11 6 views
0

Ich habe eine Funktion, die einen Plot aktualisiert, indem ein neuer Punkt hinzugefügt wird (er fügt den letzten Punkt an die Linie an). Ich möchte die Möglichkeit haben, den Cursor so zu aktualisieren, dass er automatisch auf dem letzten Punkt erscheint. Derzeit mache ichAktualisiere die Position des Datencursors innerhalb einer Schleife

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 

Allerdings ist es langsam, da es immer einen neuen Cursor erstellt. Ich kann nicht finden, wo der alte gespeichert ist, so dass ich keine neuen erstellen muss.

Antwort

2

Anstatt jedes Mal, wenn Sie neue Daten hinzufügen, ein neues Cursor-Objekt zu erstellen, können Sie es einmal (pro Plotobjekt) erstellen und in einer Variablen speichern. Dann können Sie innerhalb der Schleife die Position aktualisieren.

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 

Und im Interesse einer vollständigen Beispiel:

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

aktualisieren

Als Alternative Sie konnte Verwendung findall, um tatsächlich den Datencursor für eine lokalisieren gegebene Handlung. Der einzige Nachteil davon ist, dass es den Aufwand verursacht, den Datencursor jedes Mal zu finden, wenn Sie ihn aktualisieren wollen.

datacursor = findall(ancestor(hplots(k), 'axes'), 'DataSource', hplots(k)); 

Eine weitere Alternative

Anstatt innerhalb einer Variablen alles zu speichern, können Sie die Daten Cursor im UserData Eigenschaft speichern könnte der Plot selbst Objekte.

for k = 1:numel(hplots) 
    set(hplots(k), 'UserData', cursorMode.createDatatip(hplots(k))) 
end 

Dann, es zu benutzen:

set(get(hplots(k), 'UserData'), 'Position', [x, y, 0]) 
+0

großartige Arbeit! danke für den code share – 16per9

+0

es war nicht meine frage, ich bin gerade mehr erfahren mit matlab und dieser code ist gut zum plotten :) – 16per9

+0

@ user2205242 Ups! Das tut mir leid. – Suever

Verwandte Themen