MATLAB:区分轴的子节点?

时间:2015-08-18 18:47:10

标签: matlab plot brush

我有一个收集刷新数据的函数(以ActionPostCallback的形式)。该函数按预期运行:当我突出显示给定轴的区域时,它存储突出显示数据的xmin和xmax。但是,有时我会在轴上的一大块数据周围绘制一个红色矩形,以引起对该数据的注意。如果我将该矩形绘制在轴上,然后尝试在同一轴上刷其他数据,则会收到回调错误。

EDIT2 经过进一步研究,我发现了代码的麻烦。 function annotateSelectedRegion中的一行:

selectedData = currentSelection.Children

当有多个子节点时,会导致代码崩溃,在这种情况下是绘制的矩形和绘制的线。有没有办法区分矩形和绘制线?或者是我在执行函数之前删除矩形的最佳方法。

  

警告:模式回调期间发生错误。

     

在matlab.uitools.internal.uimode / fireActionPostCallback(第16行)

     

在datamanager / brushup(第117行)

     

在%522823425> @(es,ed)datamanager.brushup(es,ed)

     

在hgfeval(第62行)

     

在matlab.uitools.internal.uimode / modeWindowButtonUpFcn(第55行)

     

在   matlab.uitools.internal.uimode / modeControl> localModeWindowButtonUpFcn   (第161行)

附加代码和屏幕截图。

粗矩形是绘制的矩形,细长矩形是刷牙工具。这是 产生错误的方案的屏幕截图。

矩形图代码

 function displayPrevAnnotation(obj, selectedAxes, rangeStart, rangeEnd)


        if strcmp(selectedAxes, 'Raw')
            axes(obj.rawDataDisplayAxes); 
            boxWidth = rangeEnd - rangeStart; 
            yLimits = obj.rawDataDisplayAxes.YLim;
            boxHeight = yLimits(2) - yLimits(1); 
            obj.focusBox = rectangle('Position', [rangeStart, yLimits(1), boxWidth, boxHeight]); hold off; 


        elseif strcmp(selectedAxes, 'PSD') 
            axes(obj.psdDataDisplayAxes); 
            boxWidth = rangeEnd - rangeStart; 
            yLimits = obj.psdDataDisplayAxes.YLim;
            boxHeight = yLimits(2) - yLimits(1); 
            obj.focusBox = rectangle('Position', [rangeStart, yLimits(1), boxWidth, boxHeight]); hold off; 

        end 

        obj.focusBox.LineWidth = 3;
        obj.focusBox.EdgeColor = 'red'; 

    end 

拉丝数据收集功能

function annotateSelectedRegion(obj, ~, eventdata)

    currentSelection = eventdata.Axes; 

    selectedData = currentSelection.Children; 

    if isempty(selectedData) || ~any(selectedData.BrushData(:))
        % Do nothing 
        disp('please select data or load data');

    elseif ~isempty(selectedData.BrushData)           
        brushedIdx = logical(selectedData.BrushData);
        brushedXData = selectedData.XData(brushedIdx);
        brushedYData = selectedData.YData(brushedIdx);

        obj.t1 = brushedXData(1); 
        obj.t2 = brushedXData(end); 

        fillRecPairInfo(obj); 
        fillAnnotIDInfo(obj); 
        fillUniqueIDInfo(obj); 
        fillAnnotRangeInfo(obj, currentSelection);

        annotationPopUp;

    end

end

1 个答案:

答案 0 :(得分:0)

注意: 此解决方案最适用于我的情况,我不确定它对其他人有多大用处。但无论如何,这是我的解决方案。正如我在问题中所述,我意识到函数" annotateSelectedRegion"由于存在两个孩子(矩形和绘制的线)而感到困惑。在函数" displayPrevAnnotation"中,我只需设置" HandleVisibility"矩形的属性为" off"。通过这样做,父节点不再可见矩形,在这种情况下,轴是因此它看到的唯一子节点是绘制的线。