Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

Thread Subject:
datacursormode UpdateFcn cannot be set if data tip is selected

Subject: datacursormode UpdateFcn cannot be set if data tip is selected

From: Richard Crozier

Date: 28 Sep, 2010 13:52:04

Message: 1 of 4

I want to use a custom data cursor in my figures, however I have noticed that modifying the UpdateFcn property of the figure when you have already manually selected a datatip has no effect. How do I correctly modify the UpdateFcn if a user has already selected a datatip in the current figure? The code below demonstrates my problem:

We need a custom function to set the datatip text for testing, the one below should do:

function output_txt = testdtips(obj, event_obj)
% Test alternate datatip text
% obj Currently not used (empty)
% event_obj Handle to event object
%
% output_txt Datatip text (string or string cell array)
%

    output_txt = {'This is a test'};

end

Now the next listing demonstrates my problem using the function above.

% plot a figure
x = 0:.1:4*pi;
figure; plot(x,sin(x));
% get the datacursormode object for the figure
dcm_obj = datacursormode(gcf);
% check if it is enabled
get(dcm_obj, 'Enable')
% set it to be enabled
set(dcm_obj, 'Enable', 'on')
% Set the UpdateFcn to the function testdtips
set(dcm_obj, 'UpdateFcn', @testdtips)

% In this case, data cursor correctly displays the text 'This is a test'
% instead of default values. If we repeat this but this time manually
% select the data cursor mode by clicking on the button on the figure, but
% do not actually add a datatip by clicking on a plot, the change is still
% applied

%% plot a figure
x = 0:.1:4*pi;
figure; plot(x,sin(x));
% get the datacursormode object for the figure
dcm_obj = datacursormode(gcf);
% check if it is enabled
get(dcm_obj, 'Enable')

%% Now go manually to figure window and click on the Data Cursor Button

% check again to see if it is enabled (it will be)
get(dcm_obj, 'Enable')

% Set the UpdateFcn to the function testdtips
set(dcm_obj, 'UpdateFcn', @testdtips)

%%

% Now we do the same, but before setting UpdateFcn, we click on the Data
% Cursor button, and also select a data tip by clicking on the plot

% plot a figure

x = 0:.1:4*pi;
figure; plot(x,sin(x));
% get the datacursormode object for the figure
dcm_obj = datacursormode(gcf);
% check if it is enabled
get(dcm_obj, 'Enable')

%%
% Now go manually to figure window and click on the Data Cursor Button,
% then select a point on the plot, bringing up a datatip

% check again to see if it is enabled (again, it will be)
get(dcm_obj, 'Enable')

% Set the UpdateFcn to the function testdtips
set(dcm_obj, 'UpdateFcn', @testdtips)
% This has no effect, even though it claims it has been set to the desired
% function, clicking on new points in the graph will confirm this
disp(get(dcm_obj,'UpdateFcn'))


Hope someone can help,
Thanks
Richard

Subject: datacursormode UpdateFcn cannot be set if data tip is selected

From: Richard Crozier

Date: 30 Sep, 2010 14:51:19

Message: 2 of 4

"Richard Crozier" <r.crozier@ed.ac.uk> wrote in message <i7sru4$a1i$1@fred.mathworks.com>...
> I want to use a custom data cursor in my figures, however I have noticed that modifying the UpdateFcn property of the figure when you have already manually selected a datatip has no effect. How do I correctly modify the UpdateFcn if a user has already selected a datatip in the current figure? The code below demonstrates my problem:
>
> We need a custom function to set the datatip text for testing, the one below should do:
>
> function output_txt = testdtips(obj, event_obj)
> % Test alternate datatip text
> % obj Currently not used (empty)
> % event_obj Handle to event object
> %
> % output_txt Datatip text (string or string cell array)
> %
>
> output_txt = {'This is a test'};
>
> end
>
> Now the next listing demonstrates my problem using the function above.
>
> % plot a figure
> x = 0:.1:4*pi;
> figure; plot(x,sin(x));
> % get the datacursormode object for the figure
> dcm_obj = datacursormode(gcf);
> % check if it is enabled
> get(dcm_obj, 'Enable')
> % set it to be enabled
> set(dcm_obj, 'Enable', 'on')
> % Set the UpdateFcn to the function testdtips
> set(dcm_obj, 'UpdateFcn', @testdtips)
>
> % In this case, data cursor correctly displays the text 'This is a test'
> % instead of default values. If we repeat this but this time manually
> % select the data cursor mode by clicking on the button on the figure, but
> % do not actually add a datatip by clicking on a plot, the change is still
> % applied
>
> %% plot a figure
> x = 0:.1:4*pi;
> figure; plot(x,sin(x));
> % get the datacursormode object for the figure
> dcm_obj = datacursormode(gcf);
> % check if it is enabled
> get(dcm_obj, 'Enable')
>
> %% Now go manually to figure window and click on the Data Cursor Button
>
> % check again to see if it is enabled (it will be)
> get(dcm_obj, 'Enable')
>
> % Set the UpdateFcn to the function testdtips
> set(dcm_obj, 'UpdateFcn', @testdtips)
>
> %%
>
> % Now we do the same, but before setting UpdateFcn, we click on the Data
> % Cursor button, and also select a data tip by clicking on the plot
>
> % plot a figure
>
> x = 0:.1:4*pi;
> figure; plot(x,sin(x));
> % get the datacursormode object for the figure
> dcm_obj = datacursormode(gcf);
> % check if it is enabled
> get(dcm_obj, 'Enable')
>
> %%
> % Now go manually to figure window and click on the Data Cursor Button,
> % then select a point on the plot, bringing up a datatip
>
> % check again to see if it is enabled (again, it will be)
> get(dcm_obj, 'Enable')
>
> % Set the UpdateFcn to the function testdtips
> set(dcm_obj, 'UpdateFcn', @testdtips)
> % This has no effect, even though it claims it has been set to the desired
> % function, clicking on new points in the graph will confirm this
> disp(get(dcm_obj,'UpdateFcn'))
>
>
> Hope someone can help,
> Thanks
> Richard


Ok, I take it no-one who knows how to solve this has come across my post. Could someone from the TMW possibly comment on whether this is a feature or a bug, and how to achieve the functionality I would like (or whether to abandon all hope!).

Thanks,
Richard

Subject: datacursormode UpdateFcn cannot be set if data tip is selected

From: Steven_Lord

Date: 30 Sep, 2010 21:15:39

Message: 3 of 4



"Richard Crozier" <r.crozier@ed.ac.uk> wrote in message
news:i82857$68o$1@fred.mathworks.com...
> "Richard Crozier" <r.crozier@ed.ac.uk> wrote in message
> <i7sru4$a1i$1@fred.mathworks.com>...

*snip*

> Ok, I take it no-one who knows how to solve this has come across my post.
> Could someone from the TMW possibly comment on whether this is a feature
> or a bug, and how to achieve the functionality I would like (or whether to
> abandon all hope!).

I'm not certain -- you should contact Technical Support and work with them
to investigate the cause of this behavior (and whether or not it's a bug)
and a workaround if it is a bug. You should mention when you contact
Support what version of MATLAB you're using and on what operating system
you're using it.

--
Steve Lord
slord@mathworks.com
comp.soft-sys.matlab (CSSM) FAQ: http://matlabwiki.mathworks.com/MATLAB_FAQ
To contact Technical Support use the Contact Us link on
http://www.mathworks.com

Subject: datacursormode UpdateFcn cannot be set if data tip is selected

From: Adam

Date: 27 Feb, 2012 22:30:16

Message: 4 of 4

Your sample code will set the default UpdateFcn for your figure so all newly created datacursors will have the UpdateFcn set. That does not set the UpdateFcn for any existing datacursors. You need to find all the existing datacursors and set the UpdateFcn. I also found that they will not be updated unless you hide and show them again (at least in Matlab R2009b). I used findall to get the objects with the type property set to hggroup and then check to see if it has an UpdateFcn property since there are other classes with the type set to hggroup (e.g. stairs plots).

example code:

for oh=findall(gcf, 'type', 'hggroup')'
    if isprop(oh, 'UpdateFcn')
        set(oh, 'UpdateFcn', @testdtips);
        set(oh, 'Visible', 'off');
        set(oh, 'Visible', 'on');
    end
end

Tags for this Thread

What are tags?

A tag is like a keyword or category label associated with each thread. Tags make it easier for you to find threads of interest.

Anyone can tag a thread. Tags are public and visible to everyone.

Contact us