如何删除Matlab图上的单个点?最好是通过GUI

时间:2017-07-18 21:40:34

标签: matlab plot subset visualization matlab-figure

考虑以下情节:

plot

我的数据点过于密集,我想隐藏或删除其中一些点以使图表更清晰。如果没有重新计算数据并重新绘制图形(这很耗时),我怎么能这样做呢?

3 个答案:

答案 0 :(得分:1)

我能想到的最常用的GUI方法是使用'数据光标'选择点。 enter image description here工具,看看它是什么?值,然后将此点的XData和YData属性替换为NaN,在更多属性'按钮。

或者,您可以alter the callback function of the 'Data Cursor'为您执行此操作(您可以看到here另一个示例)。

  

检查绘图中的数据点是否为'Scatter'图形对象,在选择图形时在命令窗口中执行该类型get(gca,'children'),并查看第一行输出是否:
     Scatter with properties:
  如果是这样,请使用下面的选项1 。如果没有,请将数据点和线条绘制为不同的对象,或使用下面的选项2

创建图形后,右键单击图中的一个工具提示,然后选择编辑文本更新功能

选项1

在打开的编辑器中,最后添加以下行:

event_obj.Target.XData(event_obj.Target.XData==pos(1)) = nan;
event_obj.Target.YData(event_obj.Target.YData==pos(2)) = nan;

为函数指定一些有意义的名称,并将其另存为新的.m文件。

以下是您应该获得的一个简单示例:

function output_txt = DeletePoint(obj,event_obj) % Give it some meaningful name
% Display the position of the data cursor
% obj          Currently not used (empty)
% event_obj    Handle to event object
% output_txt   Data cursor text string (string or cell array of strings).

pos = get(event_obj,'Position');
output_txt = {['X: ',num2str(pos(1),4)],...
    ['Y: ',num2str(pos(2),4)]};

% If there is a Z-coordinate in the position, display it as well
if length(pos) > 2
    output_txt{end+1} = ['Z: ',num2str(pos(3),4)];
end

% The lines you add:
event_obj.Target.XData(event_obj.Target.XData==pos(1)) = nan;
event_obj.Target.YData(event_obj.Target.YData==pos(2)) = nan;

现在,再次右键单击图中的一个工具提示,然后选择选择文本更新功能。在打开的浏览器中选择刚刚保存的功能(此处为DeletePoint.m)。

现在,每次点击一个点使用'数据光标'工具将删除它。但是,请记住,恢复点的唯一方法是重新创建图形,因为数据将从图中删除(但不会从保存它的工作区中的变量中删除)。

选项2

在打开的编辑器中,最后添加以下行:

% The lines you add:
props = {'Color',...
    'LineStyle',...
    'LineWidth',...
    'Marker',...
    'MarkerSize',...
    'MarkerEdgeColor',...
    'MarkerFaceColor'};
line_props = get(event_obj.Target,props);
newX = event_obj.Target.XData;
newY = event_obj.Target.YData;
newX(newX==pos(1)) = [];
newY(newY==pos(2)) = [];
new_line = line(newX,newY);
set(new_line,props,line_props);
delete(event_obj.Target)
warning('off') % after you finish removing points, type warning('on') in the command window

所有其余内容与选项1 相同。这里的不同之处在于后一个函数使用相同的属性再次绘制所有行,但没有选择的点。通常,每次删除一个点时,数据光标会自动移动到下一个点(这就是为什么我们不能简单地删除这些点,它将启动一个删除整行的循环)。这里我们删除整行,因此Matlab会在每次删除时发出警告:

  

警告:执行MarkedClean事件的侦听器回调时出错。来源已被删除

为了避免我添加warning('off')和函数的结尾,但是一旦完成数据光标工具,就应该再次设置它们。

答案 1 :(得分:1)

绘制未连接的点时,您可以XData替换{0}}或YData(或两者)您不想要的点数。对于带有线条的图表,这不起作用(它会产生不连续性),并且必须从数据向量中删除相应的点。我将在下面的示例中演示如何完成此操作:

出于演示的目的,我将假设您正在使用NaN文件,并且没有图表/行的句柄。

这是用于绘制图形的代码:

.fig

然后,假设您加载了数字并且它是当前数字(x = [0:0.05:0.9, 1:0.01:1.09, 1.1:0.1:pi/2]; figure(); plot(x,sin(x),'-+',x,sin(x-0.02),'-^',x,sin(x-0.04),'-s'); grid minor; ),您可以这样做:

gcf

您可以使用您想要计算的任何逻辑function q45177572 %% Find handles: hL = findobj(gcf,'Type','Line'); %% Choose which indices to remove, and remove... for ind1 = 1:numel(hL) % (Option 1) Keeping every other datapoint: ind2rem = 1:2:numel(hL(ind1).XData); % (Option 2) Removing points in a certain interval: ind2rem = hL(ind1).XData > 1 & hL(ind1).XData < 1.05; % (Option 3) Manual (watch out for indices out of bounds!) ind2rem = [1 3 20:23 30]; % (Option 4) ... % Finally, delete the points: hL(ind1).XData(ind2rem) = []; hL(ind1).YData(ind2rem) = []; end ,甚至可以手动指定。

以上在R2017a上进行了测试。

答案 2 :(得分:1)

最简单的方法:

  1. 点击按钮&#34;刷/选择数据&#34;
  2. 选择积分
  3. 右键单击鼠标
  4. 选择&#34;删除&#34;
  5. 通过这种方式,线路连续性得以保留,无需编码。