如何使用 togglebutton 在散点图中转换标签 on/off

How to use togglebutton to turn labels in scatterplot on/off

我尝试为每个点创建一个带有标签的散点图:

现在我想让代码的用户可以打开和关闭标签。

到目前为止,我的代码如下所示:

x = rand(1,100); y = rand(1,100); pointsize = 30;
idx = repmat([1 : 10], 1, 10)             % I used class memberships here

figure(1)
MDSnorm = scatter(x, y, pointsize, idx, 'filled');
dx = 0.015; dy = 0.015;                   % displacement so the text does not overlay the data points
T = text(x + dx, y +dy, labels);
colormap( jet );                          % in my code I use a specific colormap

Button = uicontrol('Parent',figure(2),'Style','toggle','String',...
    'labels','Units','normalized','Position',[0.8025 0.82 0.1 0.1],'Visible','on',...
    'callback',{@pb_call, MDSnorm, ???});

在脚本的末尾,我尝试定义 pb_call 函数。我试了几个不同的版本,都失败了。

我大概知道我需要做什么。类似于:

function [] = pb_call( ??? )

if get(Button, 'Value')
    T --> invisible       % ???
else
    T --> visible         % ???
end
end

如何修改以上内容以根据需要打开或关闭标签?

这是一个工作示例:

x = rand(1,9); y = rand(1,9); pointsize = 30;
idx = repmat(1 : 3, 1, 3);             % I used class memberships here

labels = {'a', 'b', 'c', 'd', 'e', 'f', 'h', 'i', 'j'};

h_fig = figure(1); %Create a figure, an keep the handle to the figure.
MDSnorm = scatter(x, y, pointsize, idx, 'filled');
dx = 0.015; dy = 0.015;                   % displacement so the text does not overlay the data points
T = text(x + dx, y +dy, labels);
colormap( jet );                          % in my code I use a specific colormap

%Add a button to the same figure (the figure with the labels).
Button = uicontrol('Parent',h_fig,'Style','toggle','String',...
    'labels','Units','normalized','Position',[0.8025 0.82 0.1 0.1],'Visible','on',...
    'callback',@pb_call);


function pb_call(src, event)
    %Callback function (executed when button is pressed).
    h_fig = src.Parent; %Get handle to the figure (the figure is the parent of the button).
    h_axes = findobj(h_fig, 'Type', 'Axes'); %Handle to the axes (the axes is a children of the figure).
    h_text = findobj(h_axes, 'Type', 'Text'); %Handle to all Text labels (the axes is the parent of the text labels).

    %Decide to turn on or off, according to the visibility of the first text label.
    if isequal(h_text(1).Visible, 'on')
        set(h_text, 'Visible', 'off'); %Set all labels visibility to off
    else
        set(h_text, 'Visible', 'on');  %Set all labels visibility to on
    end
end

评论里有解释。