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
”。通过这样做,矩形不再对父级可见,在这种情况下,轴不再可见,因此它看到的唯一子级是绘制的线。
我有一个函数可以收集刷过的数据(以 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
”。通过这样做,矩形不再对父级可见,在这种情况下,轴不再可见,因此它看到的唯一子级是绘制的线。