MATLAB:区分轴的children?

MATLAB: Differentiate between children of an axes?

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

EDIT2 经过进一步研究,我找到了trouble-line的代码。 function annotateSelectedRegion 中的行:

selectedData = currentSelection.Children

当存在多个 child 时会导致代码崩溃,在本例中为绘制的矩形和绘制的直线。有没有办法区分矩形和绘图线?或者我最好的做法是在执行函数之前删除矩形。

Warning: An error occurred during the mode callback.

In matlab.uitools.internal.uimode/fireActionPostCallback (line 16)

In datamanager/brushup (line 117)

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

In hgfeval (line 62)

In matlab.uitools.internal.uimode/modeWindowButtonUpFcn (line 55)

In matlab.uitools.internal.uimode/modeControl>localModeWindowButtonUpFcn (line 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

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