答案 0 :(得分:1)
我能想到的最常用的GUI方法是使用'数据光标'选择点。 工具,看看它是什么?值,然后将此点的XData和YData属性替换为NaN,在更多属性'按钮。
或者,您可以alter the callback function of the 'Data Cursor'为您执行此操作(您可以看到here另一个示例)。
检查绘图中的数据点是否为'Scatter'图形对象,在选择图形时在命令窗口中执行该类型
get(gca,'children')
,并查看第一行输出是否:
Scatter with properties:
如果是这样,请使用下面的选项1 。如果没有,请将数据点和线条绘制为不同的对象,或使用下面的选项2 。
创建图形后,右键单击图中的一个工具提示,然后选择编辑文本更新功能。
在打开的编辑器中,最后添加以下行:
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
)。
现在,每次点击一个点使用'数据光标'工具将删除它。但是,请记住,恢复点的唯一方法是重新创建图形,因为数据将从图中删除(但不会从保存它的工作区中的变量中删除)。
在打开的编辑器中,最后添加以下行:
% 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)
最简单的方法:
通过这种方式,线路连续性得以保留,无需编码。