在循环中更新数据游标位置
Updating data cursor position within a loop
我有一个函数可以在给定新点的情况下更新绘图(它将最后一个点附加到该行)。我希望有可能更新光标,使其自动出现在最后一点。目前,我
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
但是,它很慢,因为它总是创建一个新游标。我找不到旧的存储位置,因此我不必创建新的。
与其在每次添加新数据时都创建一个新的游标对象,不如创建一次(每个绘图对象)并将其保存到一个变量中。然后在循环内部你可以更新位置。
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])
我有一个函数可以在给定新点的情况下更新绘图(它将最后一个点附加到该行)。我希望有可能更新光标,使其自动出现在最后一点。目前,我
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
但是,它很慢,因为它总是创建一个新游标。我找不到旧的存储位置,因此我不必创建新的。
与其在每次添加新数据时都创建一个新的游标对象,不如创建一次(每个绘图对象)并将其保存到一个变量中。然后在循环内部你可以更新位置。
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])