Matlab:未存储GUI图中的选定数据(通过刷涂)

时间:2013-06-28 15:39:52

标签: matlab user-interface plot store brush

我在轴上绘制这两条曲线:

LH(1) = copyobj(T2pb1hLine(2), S.T2pb1Ax(2)); 
LH(2) = copyobj(T2pb1hLine(2), S.T2pb1Ax(2)); 
set(LH(1), 'XData', PressNoOutliers, 'YData', zNoOutliers, 'linestyle',...
            'x', 'Color', 'm');
set(LH(2), 'XData', PressNoOutliers2, 'YData', zNoOutliers2, 'linestyle',...
            's', 'Color', 'b');

然后我使用这个回调函数来刷数据并存储它:

brush on
pause
hBrushLine = findall(S.T2pb1Ax(2), 'tag', 'Brushing');
brushedData = get(hBrushLine, {'Xdata', 'Ydata'});
brushedIdx = ~isnan(brushedData{1});
PSel = brushedData{1}(brushedIdx);
zSel = brushedData{2}(brushedIdx);

我能够刷数据,但是,没有存储数据导致PSelzSel的空向量。显然,如果我没有使用copyobj并仅绘制单曲线,那么我可以通过刷新PSelzSel来获取数据。当我使用copyobj将2条曲线绘制在一起时,有什么猜测我可以做什么来存储数据?

1 个答案:

答案 0 :(得分:1)

发生了什么:
根据图中的行数,brushedData将超出代码中当前硬连线大小1的大小。因此,除非您从第一行刷过数据,否则PselzSel将为空,因为brushedData{1}只会包含NaN - 您要选择的数据位于{ {1}}(对应于brushedData{n} - 行),但从未被处理过。这是一个小例子(你必须调整n和这样的句柄,但逻辑变得清晰了):

gca

根据您选择数据的行,x1 = linspace(1,10,21); y1 = rand(1,21); x2 = x1; y2 = rand(1,21); x3 = x2; y3 = rand(1,21); h(1) = plot(x1,y1,'b'); h(2) = copyobj(h(1),gca); h(3) = copyobj(h(1),gca); set(h(2),'XData',x2,'YData',y2,'Color','r') set(h(3),'XData',x3,'YData',y3,'Color','g') brush on pause hBrushLine = findall(gca, 'tag', 'Brushing'); brushedData = get(hBrushLine, {'Xdata', 'Ydata'}); for I=1:size(brushedData,1) brushedIdx = ~isnan(brushedData{I,1}); PSel{I} = brushedData{I,1}(brushedIdx); zSel{I} = brushedData{I,2}(brushedIdx); end Psel中的某些单元格显示为空。我选择使用单元格,因为它允许您从不同的行中选择不同数量的点。