Erratic behavior with datacursormode while trying to delete plots on uiaxes

2 visualizzazioni (ultimi 30 giorni)
I'm writing some code where several channels are plotted into a uiaxes, then using datacursormode, channels can be clicked and deleted from the plot.
Problem:
  • The channel that gets deleted is erratic. Sometimes it deletes the channel as intended. Sometimes it doesn't do anything, other times it deletes other channels rather than the one selected.
  • If instead of this method, I have the "Delete Channel" close the figure, remove the selected channel from the plot list, then re-open/re-plot the data, everything works fine. However, this is very slow given the amount of data I'd like processed.
Example:
Here I have C20 selected and click Delete Channel:
Result: C20 remains, but C29 and C30 (the top two channels) were deleted
The problem can be replicated with the following code
function struct1 = operation_troubleshoot
% Draw UI
plotfig = uifigure('Units', 'normalized', 'Position',[.1 .1 .8 .6]);
plotgrd = uigridlayout(plotfig,[1 2]);
plotgrd.ColumnWidth = {'9x','1x'};
ax1 = uiaxes(plotgrd);
ax1.Layout.Column = 1;
plotDelete = uibutton(plotgrd,'push','Position', [.5 .5 .1 .1], 'Text', 'Delete Channel',...
'ButtonPushedFcn', @(btn,event) plotDeleteButtonPushed);
plotDelete.Layout.Row = 1;
plotDelete.Layout.Column = 2;
% generate fake data
data = [];
chans = {'C1'; 'C2'; 'C3'; 'C4'; 'C5'; 'C6'; 'C7'; 'C8'; 'C9'; 'C10';...
'C11'; 'C12'; 'C13'; 'C14'; 'C15'; 'C16'; 'C17'; 'C18'; 'C19'; 'C20';...
'C21'; 'C22'; 'C23'; 'C24'; 'C25'; 'C26'; 'C27'; 'C28'; 'C29'; 'C30'};
for i = 1:1:30
data.(chans{i}) = rand(1,500)*0.5;
end
%Create stacked plot:
t = linspace(0, 1, 500);
for i = 1:length(chans)
data.(chans{i}) = data.(chans{i})+1*i;
h(chans{i}) = plot(ax1, t, data.(chans{i}),'tag',sprintf(chans{i}));
hold(ax1, 'on')
end
y_limit = max(data.(chans{end}))+2;
ylim(ax1, [0 y_limit])
set(ax1,'YColor','none');
%Activate datacursormode
dcm = datacursormode(plotfig);
set(dcm,'Enable','on')
set(dcm,'UpdateFcn',@myupdatefcn)
%Datacursormode function
function txt = myupdatefcn(trash, event)
pos = get(event,'Position');
dts = get(event.Target,'Tag');
txt = {dts,...
['X: ',num2str(pos(1))],...
['Y: ',num2str(pos(2))]};
struct1 = dts; %Passes Tag to struct1 to be used in the plotDeleteButtonPushed function
end
%Plot delete function
function plotDeleteButtonPushed
fprintf(['Removing ', struct1, '\n'])
delete(h(struct1))
end
end

Risposte (0)

Prodotti


Release

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by