MATLAB:如何从时间序列图中连续存储单击的坐标(峰值点),即使在平移等之后。

MATLAB:如何从时间序列图中连续存储单击的坐标(峰值点),即使在平移等之后。,matlab,matlab-figure,matlab-guide,Matlab,Matlab Figure,Matlab Guide,我目前正在开发一个MatlabGUI,在这里我需要单击不需要的峰值点(而不是删除它们),并将其结果存储在矩阵中(连续)。我正在使用带有以下代码的按钮来收集点并存储结果。但是,当我单击这些点时,只有最后一次单击的结果存储(不是所有单击的点)。此外,由于这是一个连续的绘图,我使用平移按钮移动数据。因此,我想做以下工作: 1) 对于按钮点击(从getpts函数收集峰值),我想点击并收集几个点(每次点击都连续存储并附加值)。此外,我希望阵列处于活动状态,即使在使用平移按钮移动绘图之后也是如此。 2) 我

我目前正在开发一个MatlabGUI,在这里我需要单击不需要的峰值点(而不是删除它们),并将其结果存储在矩阵中(连续)。我正在使用带有以下代码的按钮来收集点并存储结果。但是,当我单击这些点时,只有最后一次单击的结果存储(不是所有单击的点)。此外,由于这是一个连续的绘图,我使用平移按钮移动数据。因此,我想做以下工作:

1) 对于按钮点击(从getpts函数收集峰值),我想点击并收集几个点(每次点击都连续存储并附加值)。此外,我希望阵列处于活动状态,即使在使用平移按钮移动绘图之后也是如此。 2) 我想创建另一个按钮来结束任务(要求用户“是否要停止收集峰值点”,停止收集点,并将整个单击结果存储在一个数组中)


对不起,这是我的第一篇帖子,请接受我的道歉,如果有不清楚的地方请澄清。提前谢谢

编辑:改为使用基于指南的GUI

在Matlab命令窗口中定义X&Y

>> x = 0:.1:4*pi;
>> y = sin(x);
>> y(10:10:end) = 2; %With some bad points to mark
然后运行GUI,选择开始标记,标记一些点,平移等:

>> plotTest(x,y)
退出GUI后,查看Globala IDX_商店:

>> global IDX_STORE
>> IDX_STORE

IDX_STORE =

    10    30    40
如果要标记x,y值,则只需

>> markedX = x(IDX_STORE);
>> markedY = y(IDX_STORE);
GUI的布局如下所示

GUI代码如下所示:

function varargout = plotTest(varargin)
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',mfilename,'gui_Singleton',gui_Singleton,'gui_OpeningFcn', @plotTest_OpeningFcn, ...
                   'gui_OutputFcn',  @plotTest_OutputFcn,'gui_LayoutFcn',[] ,'gui_Callback',[]);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT

% --- Executes just before plotTest is made visible.
function plotTest_OpeningFcn(hObject, eventdata, handles, varargin)
global IDX_STORE
IDX_STORE = [];
handles.output = [];
if numel(varargin) ~= 2
    handles.closeFigure = true;
else    
    x = varargin{1}; y =varargin{2};
    handles.l = plot(handles.axes1,x,y);
    hold(handles.axes1,'on')
    handles.axes1.ButtonDownFcn = {@clickCallback,handles};
    handles.l.ButtonDownFcn     = {@clickCallback,handles};
    guidata(hObject, handles);
end

% --- Outputs from this function are returned to the command line.
function varargout = plotTest_OutputFcn(hObject, eventdata, handles) 
varargout{1} = [];
if (isfield(handles,'closeFigure') && handles.closeFigure)
    errordlg('Nothing Passed in!')    
end

% --- Executes on button press in markToggle.
function markToggle_Callback(hObject, eventdata, handles)
switch handles.markToggle.Value
    case 1
        handles.markToggle.String = 'Stop Marking';
    case 0
        handles.markToggle.String = 'Start Marking';        
end

function clickCallback(hObj,evtData,handles)
global IDX_STORE
if handles.markToggle.Value == 0
    return %Do Nothing if toggle not pressed.
end
coordinates = handles.axes1.CurrentPoint(1,1:2); %Get coordinates of mouse click
idx = knnsearch([handles.l.XData' handles.l.YData'],coordinates);%Find closest point in line data
IDX_STORE = unique([IDX_STORE idx]); %Store the index.   
mH = findobj(handles.axes1,'tag','markLine');%Add some markers to see what you are doing.
if isempty(mH) %Make the marker plot if it doesn't exist
    plot(handles.axes1, handles.l.XData(IDX_STORE),handles.l.YData(IDX_STORE),'rO','tag','markLine')
else%If it does exist then update the markers
    mH.XData = handles.l.XData(IDX_STORE);    mH.YData = handles.l.YData(IDX_STORE);
end
guidata(hObj,handles); %Save handles structure

编辑:改用基于指南的GUI

在Matlab命令窗口中定义X&Y

>> x = 0:.1:4*pi;
>> y = sin(x);
>> y(10:10:end) = 2; %With some bad points to mark
然后运行GUI,选择开始标记,标记一些点,平移等:

>> plotTest(x,y)
退出GUI后,查看Globala IDX_商店:

>> global IDX_STORE
>> IDX_STORE

IDX_STORE =

    10    30    40
如果要标记x,y值,则只需

>> markedX = x(IDX_STORE);
>> markedY = y(IDX_STORE);
GUI的布局如下所示

GUI代码如下所示:

function varargout = plotTest(varargin)
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',mfilename,'gui_Singleton',gui_Singleton,'gui_OpeningFcn', @plotTest_OpeningFcn, ...
                   'gui_OutputFcn',  @plotTest_OutputFcn,'gui_LayoutFcn',[] ,'gui_Callback',[]);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT

% --- Executes just before plotTest is made visible.
function plotTest_OpeningFcn(hObject, eventdata, handles, varargin)
global IDX_STORE
IDX_STORE = [];
handles.output = [];
if numel(varargin) ~= 2
    handles.closeFigure = true;
else    
    x = varargin{1}; y =varargin{2};
    handles.l = plot(handles.axes1,x,y);
    hold(handles.axes1,'on')
    handles.axes1.ButtonDownFcn = {@clickCallback,handles};
    handles.l.ButtonDownFcn     = {@clickCallback,handles};
    guidata(hObject, handles);
end

% --- Outputs from this function are returned to the command line.
function varargout = plotTest_OutputFcn(hObject, eventdata, handles) 
varargout{1} = [];
if (isfield(handles,'closeFigure') && handles.closeFigure)
    errordlg('Nothing Passed in!')    
end

% --- Executes on button press in markToggle.
function markToggle_Callback(hObject, eventdata, handles)
switch handles.markToggle.Value
    case 1
        handles.markToggle.String = 'Stop Marking';
    case 0
        handles.markToggle.String = 'Start Marking';        
end

function clickCallback(hObj,evtData,handles)
global IDX_STORE
if handles.markToggle.Value == 0
    return %Do Nothing if toggle not pressed.
end
coordinates = handles.axes1.CurrentPoint(1,1:2); %Get coordinates of mouse click
idx = knnsearch([handles.l.XData' handles.l.YData'],coordinates);%Find closest point in line data
IDX_STORE = unique([IDX_STORE idx]); %Store the index.   
mH = findobj(handles.axes1,'tag','markLine');%Add some markers to see what you are doing.
if isempty(mH) %Make the marker plot if it doesn't exist
    plot(handles.axes1, handles.l.XData(IDX_STORE),handles.l.YData(IDX_STORE),'rO','tag','markLine')
else%If it does exist then update the markers
    mH.XData = handles.l.XData(IDX_STORE);    mH.YData = handles.l.YData(IDX_STORE);
end
guidata(hObj,handles); %Save handles structure

我会在GUI中使用
setappdata
getappdata
来存储和检索结果矩阵。嗨,马特,谢谢,我将研究上述两个命令。RegardsI将在GUI中使用
setappdata
getappdata
来存储和检索结果矩阵。嗨,Matt,谢谢,我将研究上述两个命令。RegardsDear Aero Engy(很抱歉找不到您的真实姓名),感谢您的快速回答。刚才我测试过了,效果很好。我将测试更多的数据,然后接受你的答案。此外,是否可以获得单击点的X和Y坐标?另外,我对关闭缩放和平移按钮有点困惑(在这个阶段,我使用的是按钮。你们认为切换将帮助我实现这一点)。对不起,问你的问题太多了。这是非常有帮助的,非常感谢。Regards标记点的坐标只是存储在全局变量中的索引处的原始x和y。如果你还不明白,我可以明天编辑答案。我指的是关闭平移/缩放。如果你使用pan滚动到绘图的一个新区域,你将无法单击更多的点,直到你关闭pan。亲爱的Aero Engy,谢谢。编辑后的答案会很好。此外,我将尝试在我当前的GUI中实现同样的功能,如果有任何进一步的疑问,我将与您联系。谢谢你帮我做这件事。关于Dar Aero Engy,我尝试使用guide在matlab GUI中实现相同的应用程序,但我得到了一个与struct相关的错误:“预期一个大括号或点索引表达式的输出,但有两个结果。”请您指导我如何使用切换按钮在matlab GUI中实现这一点。感谢和regardsAdd将答案编辑成一个简单的GUI。如果有帮助,请接受答案。亲爱的Aero Engy(很抱歉找不到您的真实姓名),谢谢您的快速回答。刚才我测试过了,效果很好。我将测试更多的数据,然后接受你的答案。此外,是否可以获得单击点的X和Y坐标?另外,我对关闭缩放和平移按钮有点困惑(在这个阶段,我使用的是按钮。你们认为切换将帮助我实现这一点)。对不起,问你的问题太多了。这是非常有帮助的,非常感谢。Regards标记点的坐标只是存储在全局变量中的索引处的原始x和y。如果你还不明白,我可以明天编辑答案。我指的是关闭平移/缩放。如果你使用pan滚动到绘图的一个新区域,你将无法单击更多的点,直到你关闭pan。亲爱的Aero Engy,谢谢。编辑后的答案会很好。此外,我将尝试在我当前的GUI中实现同样的功能,如果有任何进一步的疑问,我将与您联系。谢谢你帮我做这件事。关于Dar Aero Engy,我尝试使用guide在matlab GUI中实现相同的应用程序,但我得到了一个与struct相关的错误:“预期一个大括号或点索引表达式的输出,但有两个结果。”请您指导我如何使用切换按钮在matlab GUI中实现这一点。感谢和regardsAdd将答案编辑成一个简单的GUI。如果有帮助,请接受答案。