Matlab 设置X&;YData到更少的点

Matlab 设置X&;YData到更少的点,matlab,user-interface,scatter,Matlab,User Interface,Scatter,编辑:有关无需鼠标/键盘输入即可自动再现问题的代码以及描述问题的图片,请参见文章结尾 如果以下任何解释或代码需要进一步澄清,请告知我 我允许用户点击一个轴,然后散射点出现在他们点击的地方。左键单击将生成较大的散布标记,右键单击将生成较小的散布标记。按enter键添加一个新集合(由在黄色和红色之间切换的散布标记表示)。按backspace键应删除最近的标记,如果继续按,则应连续将标记从集合中删除回先前的集合 如果我只使用一个尺寸标记,这很好,但是,如果我允许通过左/右键单击确定尺寸,然后单击bac

编辑:有关无需鼠标/键盘输入即可自动再现问题的代码以及描述问题的图片,请参见文章结尾

如果以下任何解释或代码需要进一步澄清,请告知我

我允许用户点击一个轴,然后散射点出现在他们点击的地方。左键单击将生成较大的散布标记,右键单击将生成较小的散布标记。按enter键添加一个新集合(由在黄色和红色之间切换的散布标记表示)。按backspace键应删除最近的标记,如果继续按,则应连续将标记从集合中删除回先前的集合

如果我只使用一个尺寸标记,这很好,但是,如果我允许通过左/右键单击确定尺寸,然后单击backspace删除以前的点,它将正确删除这些点,直到您到达第一个发生尺寸更改的点(最早的点,而不是您尝试删除的第一个点)。即使它们是一个散点图,并且设置该图所依据的数据已被删除(以及该删除数据集的散点数据集),它们仍会在图上显示为一个单独的散点图

下面是我的示例代码:

function CodeToReplicateIssue()


a = get(0,'ScreenSize');
set(0,'DefaultFigurePosition',[a(3)*.3,a(4)*.1,a(3)*.4,a(4)*.8]);

mainFig = figure;
set(mainFig, 'WindowButtonDownFcn', @mouseDown);
set(mainFig,'WindowKeyPressFcn', @keyPress);

pfTitle = 'Next Set: Enter   Delete Previous Point: Backspace';

colormap('gray');
imagesc(zeros(512,512));
set(gca,'XTick',[]);
set(gca,'YTick',[]);
axis image;
title(pfTitle)
hold on;

cStrs2 = {'r','y'};
pfTracks = {[]};
pfTracksRef = {[]};
pfTrackI = 1;
pfScatters{1} = scatter([],[],5,cStrs2{2});


    function mouseDown(source,callbackData)
        %display('mouseDown');
        pos = get (gca, 'CurrentPoint');
        pos = pos(1,1:2);
        pfTracksRef{pfTrackI}(end+1) = ~strcmp(get(source,'SelectionType'),'alt');
        pfTracks{pfTrackI}(end+1,1:2) = pos;
        if(numel(pfScatters)<pfTrackI)
            pfScatters{pfTrackI} = scatter(pos(1),pos(2),getSizes(pfTrackI),cStrs2{mod(pfTrackI,2)+1});
        else
            set(pfScatters{pfTrackI},{'XData','YData','SizeData'},{pfTracks{pfTrackI}(:,1),pfTracks{pfTrackI}(:,2),getSizes(pfTrackI)});
        end
    end



    function keyPress(source,eventdata)
        %display(eventdata.Key);
        if(strcmp(eventdata.Key,'return'))

            if(isempty(pfTracks{pfTrackI}))
                %do nothing
            else
                refreshScatter('pfScatters');
                pfTrackI = pfTrackI+1;
                pfTracks{pfTrackI} = [];
                pfTracksRef{pfTrackI} = [];
            end

        elseif(strcmp(eventdata.Key,'backspace'))

            if(isempty(pfTracks{pfTrackI}) && numel(pfTracks)>1)
                pfTracks(pfTrackI) = [];
                pfTracksRef(pfTrackI) = [];
                if(numel(pfScatters) >= pfTrackI)
                    pfScatters(pfTrackI:end) = [];
                end
                pfTrackI = pfTrackI -1;
            end
            if(numel(pfTracks{pfTrackI}))
                pfTracks{pfTrackI}(end,:) = [];
                pfTracksRef{pfTrackI}(end) = [];
            end
            refreshScatter('pfScatters');
        end
    end

    function refreshScatter(strOption)
        if(nargin<1)
            strOption = '';
        end
        if(any(strcmp(strOption,{'','pfScatters'})))
            for n = 1:numel(pfScatters)
                if(numel(pfTracks{n})>0)
                    set(pfScatters{n},{'XData','YData','SizeData','MarkerEdgeColor'},{pfTracks{n}(:,1),pfTracks{n}(:,2),getSizes(n),cStrs2{mod(n,2)+1}});
                else
                    set(pfScatters{n},{'XData','YData'},{[],[]});
                end
            end
        end

    end

    function scatterSize = getSizes(indx)
        scatterSize = 9*(pfTracksRef{indx}(:)+1)-6;
    end
end
这是记录鼠标左键或右键的地方,稍后在getSizes()中使用,输出用于调用散布(或设置散布序列SizeData时)

我不明白为什么在删除相关数据并将散布值设置为该数据后,在大小更改之前创建的点会持续存在。似乎第一次更改大小时,会创建一个新的散点序列

如果能对这个问题有所了解,我们将不胜感激,任何修复措施都将倍感感激

谢谢

编辑:查看我所说内容的一种方法是执行以下操作:

左键单击几次(比如说5次),间隔开,以便您可以看到它们

按回车键

再左键单击5次,再次隔开,注意它们是红色的(这是我最终产品所需的功能)

按backspace直到所有点不再可见。这是正确的功能

不正确:

左键单击1次,右键单击4次

按回车键

左键单击1次,右键单击4次

重复退格(10次)。请注意,红色和黄色的前2个点(1个大点和1个小点)仍然存在,即使您单击backspace的次数足够多,可以删除所有内容,这是在没有大小更改时发生的情况

编辑:我在下面添加了一些代码,这些代码复制了我看到的问题,使用了一些循环,不再需要鼠标和键盘输入

function ReplicateIssueWithLoops()


mainFig = figure;

imshow(zeros(512,512));
hold on;
axis image;

for hh = 1:2
    %two runs, the first works fine, the second fails to remove scatter
    %points from the figure.
    cStrs = {'r','y'};
    tracks = {[]};
    tracksSizeRef = {[]};
    trackI = 1;
    scatters{1} = scatter([],[],5,cStrs{2});

    for ii = 1:2
        %simulates 2 sets
        for jj = 1:5
            %simulates 5 left clicks each
            tracks{ii}(end+1,:) = [256,(ii*6+jj)*20];
            if(hh ==1)  %Simulates all left clicks
                tracksSizeRef{ii}(end+1) = 12;
            else        %Simulates 1 left click and 4 right clicks
                tracksSizeRef{ii}(end+1) = ((jj==1)+1)*9-6;
            end
            if(numel(scatters)<ii)
                scatters{ii} = scatter(tracks{ii}(:,1),tracks{ii}(:,2),tracksSizeRef{ii},cStrs{mod(ii,2)+1});
            else
                set(scatters{ii},{'XData','YData','SizeData'},{tracks{ii}(:,1),tracks{ii}(:,2),tracksSizeRef{ii}});
            end
            pause(0.25);
        end
        tracks{ii+1}=[];
        tracksSizeRef{ii+1} = [];
    end
    trackI = ii;
    for kk = 1:10
        %simulates 10 backspaces
        if(isempty(tracks{trackI}) && numel(tracks)>1)
            tracks(trackI) = [];
            tracksSizeRef(trackI) = [];
            if(numel(scatters) >= trackI)
                scatters(trackI:end) = [];
            end
            trackI = trackI -1;
        end
        if(numel(tracks{trackI}))
            tracks{trackI}(end,:) = [];
            tracksSizeRef{trackI}(end) = [];
        end
        refreshScatters();
        pause(0.25);
    end
end

    function refreshScatters()
        for n = 1:numel(scatters)
            if(numel(tracks{n})>0)
                set(scatters{n},{'XData','YData','SizeData','MarkerEdgeColor'},{tracks{n}(:,1),tracks{n}(:,2),tracksSizeRef{n},cStrs{mod(n,2)+1}});
            else
                set(scatters{n},{'XData','YData'},{[],[]});
            end
        end

    end

end
函数ReplicateIssueWithLoops()
mainFig=图;
imshow(零(512512));
等等
轴图像;
对于hh=1:2
%两次运行,第一次运行正常,第二次未能消除分散
%图中的点。
cStrs={'r','y'};
轨道={[]};
tracksSizeRef={[]};
trackI=1;
散射体{1}=散射体([]、[]、5、cstr{2});
对于ii=1:2
%模拟2套
对于jj=1:5
%模拟每次左键单击5次
磁道{ii}(end+1,:)=[256,(ii*6+jj)*20];
如果(hh==1)%1模拟所有左键单击
tracksSizeRef{ii}(end+1)=12;
else%模拟1次左键单击和4次右键单击
tracksSizeRef{ii}(end+1)=((jj==1)+1)*9-6;
结束
if(numel(散射)1)
轨道(轨道i)=[];
tracksSizeRef(trackI)=[];
if(努梅尔(散射)>=trackI)
散点(trackI:end)=[];
结束
trackI=trackI-1;
结束
if(numel(轨迹{trackI}))
磁道{trackI}(结束:)=[];
tracksSizeRef{trackI}(end)=[];
结束
刷新散点();
暂停(0.25);
结束
结束
函数refreshScatters()
对于n=1:numel(散射)
if(numel(磁道{n})>0)
集合(散布{n}、{XData'、'YData'、'SizeData'、'MarkerEdgeColor'}、{tracks{n}(:,1)、tracks{n}(:,2)、tracksSizeRef{n}、cStrs{mod(n,2)+1});
其他的
集合(散布{n}、{'XData','YData'}、{[]、[]});
结束
结束
结束
结束
下面的图片展示了我这边的问题。按从左到右的顺序,图片显示1)在前10个点的末尾,2)在删除前10个点后,3)在删除后10个点(大小不同的集合)后,4)在删除后10个点后(保留4个,第一次更改大小时每组中的两个)


我承认我没有彻底检查你的问题,但是
不能坚持下去
干扰你的删除吗?或者轴的重画行为?也许它们已经消失了,但坐标轴没有重新绘制。(我想我指的是
erasemode
属性)等等,你用的是什么版本的MATLAB?你能按点击和按钮的精确顺序编辑你所看到的吗?我不确定我在R2015b中是否看到了这种行为。我正在使用R2015a,我将快速尝试,不使用<代码>按住。编辑:摆脱
等待
混乱:单击并按enter键创建新分散集后,按backspace键尝试引用已删除的分散序列并抛出错误。我无法使用R2015b中的给定说明再现此问题仍然无法在R2015b中再现此问题
function ReplicateIssueWithLoops()


mainFig = figure;

imshow(zeros(512,512));
hold on;
axis image;

for hh = 1:2
    %two runs, the first works fine, the second fails to remove scatter
    %points from the figure.
    cStrs = {'r','y'};
    tracks = {[]};
    tracksSizeRef = {[]};
    trackI = 1;
    scatters{1} = scatter([],[],5,cStrs{2});

    for ii = 1:2
        %simulates 2 sets
        for jj = 1:5
            %simulates 5 left clicks each
            tracks{ii}(end+1,:) = [256,(ii*6+jj)*20];
            if(hh ==1)  %Simulates all left clicks
                tracksSizeRef{ii}(end+1) = 12;
            else        %Simulates 1 left click and 4 right clicks
                tracksSizeRef{ii}(end+1) = ((jj==1)+1)*9-6;
            end
            if(numel(scatters)<ii)
                scatters{ii} = scatter(tracks{ii}(:,1),tracks{ii}(:,2),tracksSizeRef{ii},cStrs{mod(ii,2)+1});
            else
                set(scatters{ii},{'XData','YData','SizeData'},{tracks{ii}(:,1),tracks{ii}(:,2),tracksSizeRef{ii}});
            end
            pause(0.25);
        end
        tracks{ii+1}=[];
        tracksSizeRef{ii+1} = [];
    end
    trackI = ii;
    for kk = 1:10
        %simulates 10 backspaces
        if(isempty(tracks{trackI}) && numel(tracks)>1)
            tracks(trackI) = [];
            tracksSizeRef(trackI) = [];
            if(numel(scatters) >= trackI)
                scatters(trackI:end) = [];
            end
            trackI = trackI -1;
        end
        if(numel(tracks{trackI}))
            tracks{trackI}(end,:) = [];
            tracksSizeRef{trackI}(end) = [];
        end
        refreshScatters();
        pause(0.25);
    end
end

    function refreshScatters()
        for n = 1:numel(scatters)
            if(numel(tracks{n})>0)
                set(scatters{n},{'XData','YData','SizeData','MarkerEdgeColor'},{tracks{n}(:,1),tracks{n}(:,2),tracksSizeRef{n},cStrs{mod(n,2)+1}});
            else
                set(scatters{n},{'XData','YData'},{[],[]});
            end
        end

    end

end