簡體   English   中英

MATLAB:即使在平移等之后,如何也可以連續存儲時間序列圖中的單擊坐標(峰值)。

[英]MATLAB: How to store clicked coordinates (peakpoints) continuosly from time series plot even after panning etc.

我目前正在使用matlab GUI,需要單擊不需要的峰點(而不是刪除它們)並將結果存儲在矩陣中(連續)。 我正在使用帶有以下代碼的按鈕來收集點並存儲結果。 但是,當我單擊這些點時,只會存儲最后單擊的結果(而不是所有單擊的點)。 另外,由於它是連續繪圖,因此我使用PAN按鈕移動數據。 因此,我想執行以下操作:

1)對於按鈕單擊(從getpts函數收集峰),我想單擊並收集幾個點(每次單擊連續存儲和附加值)。 另外,即使我使用PAN按鈕移動繪圖,我也希望陣列處於活動狀態。 2)我想創建另一個按鈕來結束任務(要求用戶“是否要停止收集峰點”,停止收集點並將整個單擊的結果存儲在數組中)

axes(handles.axes1);
[ptsx1,ptsy1] = getpts(gcf);
idx = knnsearch([t',fbsum],[ptsx1 ptsy1],'k',1)
if evalin('caller', 'exist(''xArray'',''var'')')
  xArray = evalin('caller','xArray');
 else 
  xArray = [];
 end
 xArray = [xArray; idx] %
 assignin('caller','xArray',xArray); `% save to base`
 save('xArray.mat','xArray');

抱歉,這是我的第一篇帖子,請接受我的道歉,並請澄清是否不清楚。 提前致謝。

編輯:使用基於GUIDE的GUI代替

在Matlab命令窗口中定義您的X和Y

>> x = 0:.1:4*pi;
>> y = sin(x);
>> y(10:10:end) = 2; %With some bad points to mark

然后運行GUI,選擇“開始標記”,標記一些點,在“ Pan”周圍平移等:

>> plotTest(x,y)

退出GUI后,查看globla IDX_STORE:

>> 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM