Matlab App Designer 回调函数通过双击将绘图定位到最初设置的位置,从而保持重置绘图
Matlab App Designer Callback function keeps resetting plot with a double click to position it is first set at
我最近将一个最初在 GUIDE 中设计的应用程序转换为应用程序设计工具。我没有编写原始代码,并且由于转换,我什至不知道如何搜索这个问题的答案。如果这已在其他地方涵盖,我深表歉意。
在我的应用程序中,我可以加载包含线性时间尺度信号数据的 txt 文件。使用该应用程序,我可以滚动到感兴趣的信号。然后我设置 'origo' 或带有回调函数的信号源,它会在一致的时间尺度上重新绘制信号。
这与旧工具完全一样,很棒。我可以处理信号,然后继续前进。问题是当我缩小然后滚动找到我感兴趣的下一个信号时。如果我在绘图上的任何地方双击,绘图将再次缩放到原始位置,并具有由 setorigo_Callback 函数创建的一致时间刻度。此外,如果我发现其他感兴趣的信号并对其进行处理,包括在 x 轴上设置新的原点位置,如果我双击它,它将缩放到我指定的第一个原点位置。不管我是否设置了新的origo,双击都会将我发送到我第一次打开应用程序时第一个origo进程的位置。
有人知道这里发生了什么吗?或者,我该如何阻止它?我似乎无法清除 origo 有价值的东西,或者抹去第一个 origo 集的情节记忆。请查看完整代码。
非常感谢!
Sample data: 1990.txt
Minute microsec cycles SPL_Pa kHz Bandwidth end kHz
14/5/2019 13:11 3220245 6 97 149 2 185
14/5/2019 13:11 4479150 11 16 55 5 83
14/5/2019 13:11 4479650 4 54 61 0 64
... and so on.
classdef cpodcalibrate_App < matlab.apps.AppBase
% Properties that correspond to app components
properties (Access = public)
figure1 matlab.ui.Figure
Untitled_1 matlab.ui.container.Menu
loaddata matlab.ui.container.Menu
loadmatdata matlab.ui.container.Menu
savedata matlab.ui.container.Menu
uitoolbar1 matlab.ui.container.Toolbar
uitoggletool1 matlab.ui.container.toolbar.ToggleTool
uitoggletool2 matlab.ui.container.toolbar.ToggleTool
uitoggletool3 matlab.ui.container.toolbar.ToggleTool
removeechoes matlab.ui.control.Button
Addtotable matlab.ui.control.Button
podnumber matlab.ui.control.EditField
datatable matlab.ui.control.Table
Frequencyselect matlab.ui.control.ListBox
angleselect matlab.ui.control.ListBox
removefromtable matlab.ui.control.Button
setorigo matlab.ui.control.Button
divisionline matlab.ui.control.Button
edit2 matlab.ui.control.EditField
clickplot matlab.ui.control.UIAxes
thresholdplot matlab.ui.control.UIAxes
nixplot matlab.ui.control.UIAxes
end
methods (Access = private)
function updateplot(app, handles)
global data t
axes(handles.clickplot);
cla;
t=((data.datetime(:,4)*60+data.datetime(:,5))-(data.datetime(1,4)*60-data.datetime(1,5)))*60+data.rectime*1e-6;
plot(t,log10(data.nix),'.')
end
function resetInteractions(app, event)
% This function resets the states of the toggle tools that
% impact user interactions. It also resets the figure interactions.
% Find all tools to reset. Exclude the tool associated
% with the event.
interactiveTools = [app.uitoggletool1, app.uitoggletool2, app.uitoggletool3];
interactiveTools(event.Source == interactiveTools) = [];
% Set the state of the tools to 'off'.
[interactiveTools.State] = deal('off');
% Set figure interactions to 'off'.
datacursormode(app.figure1, 'off')
rotate3d(app.figure1, 'off');
pan(app.figure1, 'off');
zoom(app.figure1,'off');
end
% Update components that require runtime configuration
function addRuntimeConfigurations(app)
% Set component properties that require runtime configuration
app.datatable.BackgroundColor = [1 1 1;0.9608 0.9608 0.9608];
app.datatable.ColumnFormat = {[] [] [] [] [] [] [] [] []};
end
end
% Callbacks that handle component events
methods (Access = private)
% Code that executes after component creation
function cpodcalibrate_OpeningFcn(app, varargin)
% Add runtime required configuration - Added by Migration Tool
addRuntimeConfigurations(app);
% Create GUIDE-style callback args - Added by Migration Tool
[hObject, eventdata, handles] = convertToGUIDECallbackArguments(app); %#ok<ASGLU>
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to cpodcalibrate (see VARARGIN)
% Choose default command line output for cpodcalibrate
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
end
% Button pushed function: Addtotable
function Addtotable_Callback(app, event)
% Create GUIDE-style callback args - Added by Migration Tool
[hObject, eventdata, handles] = convertToGUIDECallbackArguments(app, event); %#ok<ASGLU>
%add line to table
global threshold
axes(handles.nixplot)
regline=lsline;
for angle=1:4
y=get(regline(angle),'Ydata');
sensitivity(angle)=y(1);
end;
%keyboard
datastring=cell(1,9);
datastring(1)=num2cell(str2double(get(handles.podnumber,'string')));
for n=1:4
datastring(1+n)=num2cell(sensitivity(n));
datastring(5+n)=num2cell(threshold(n));
end
table=get(handles.datatable,'data');
%keyboard;
if size(table,1)==0
table=datastring;
else
table=[table;datastring];
end
set(handles.datatable,'data',table);
save('Calibration.mat','table');
end
% Button pushed function: divisionline
function divisionline_Callback(app, event)
% Create GUIDE-style callback args - Added by Migration Tool
[hObject, eventdata, handles] = convertToGUIDECallbackArguments(app, event); %#ok<ASGLU>
% hObject handle to divisionline (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global divider
axes(handles.clickplot)
divider=gline;
end
% Menu selected function: loaddata
function loaddata_Callback(app, event)
% Create GUIDE-style callback args - Added by Migration Tool
[hObject, eventdata, handles] = convertToGUIDECallbackArguments(app, event); %#ok<ASGLU>
%Load C-POD export data
global data clicks meannix newfilename
[filename, pathname] = uigetfile('*.txt');
raw=readtable([pathname filename]);
%If there is an extra column on the older text files, this will
%sort the columnns correctly.
if width(raw)>7
rr=1;
else
rr=0;
end
headers = raw.Properties.VariableNames;
%% Extract variables from file content
%Removes last line in data, as often incomplete.
raw(end,:)=[];
data.datetime=datevec(datetime(raw.(1)));
set(handles.podnumber,'string',filename(1:4));
data.podid=str2double(filename(1:4));
data.recdate=char(raw.(1));
data.rectime=raw.(2+rr); %useconds after whole minute
data.cycles=raw.(3+rr); % cycles
data.nix=raw.(4+rr); % peak pressure, Nick-units
data.frq=raw.(5+rr); % Instantaneous frequency
data.bandwidth=raw.(6+rr); % Bandwidth, Nick-unit
data.endfrq=raw.(7+rr); % End-frequency in sweep
newfilename=[filename(1:end-4), '.mat'];
%keyboard
save(newfilename,'data');
updateplot(app, handles);
%initiate results arrays and clear plots
clicks=zeros(31,4); %number of clicks detected
meannix=zeros(31,4); %mean nix per block of 10 clicks
axes(handles.thresholdplot);
axes(handles.nixplot);
end
% Button pushed function: removeechoes
function removeechoes_Callback(app, event)
% Create GUIDE-style callback args - Added by Migration Tool
[hObject, eventdata, handles] = convertToGUIDECallbackArguments(app, event); %#ok<ASGLU>
%Insert line and remove echoes
global data t origo clicks meannix divider threshold newfilename
axes(handles.clickplot)
x=get(divider,'Xdata');
y=get(divider,'Ydata');
alpha=(y(1)-y(2))/(x(1)-x(2));
beta=y(1)-alpha*x(1);
xlim=get(handles.clickplot,'xlim');
clicksinplotx=t(t>xlim(1)&t<xlim(2));
clicksinploty=data.nix(t>xlim(1)&t<xlim(2));
divideline=(clicksinplotx)*alpha+beta;
hold on
plot(clicksinplotx,divideline)
selectedclicksx=clicksinplotx(log10(clicksinploty)>divideline)-origo;
selectedclicksy=clicksinploty(log10(clicksinploty)>divideline);
%plot and analyze
angle=get(handles.angleselect,'value');
breaks=(0.0485:0.012:0.425)'; %Create breaks to separate blocks
for n=1:31
clicks(n,angle)=sum(selectedclicksx>breaks(n)&selectedclicksx<breaks(n+1));
meannix(n,angle)=mean(selectedclicksy(selectedclicksx>breaks(n)&selectedclicksx<breaks(n+1)));
end
axes(handles.thresholdplot);
att=0:30;
plot(att,clicks,'o-')
above=att(clicks(:,angle)>=5);
below=att(clicks(:,angle)<5);
%keyboard
if isempty(above) %all levels below threshold
threshold(angle)=NaN;
else
threshold(angle)=(above(end)+below(1))/2;
end
legend('0','90','180','270');
axes(handles.nixplot)
plot(att,20*log10(meannix),'.')
legend('0','90','180','270');
save(newfilename,'clicks','meannix','-append')
end
% Menu selected function: savedata
function savedata_Callback(app, event)
% Create GUIDE-style callback args - Added by Migration Tool
[hObject, eventdata, handles] = convertToGUIDECallbackArguments(app, event); %#ok<ASGLU>
% Save spreadsheet to excelfile
table=get(handles.datatable,'data');
xlswrite('Calibration.xls',table);
save('Calibraton.mat','table');
end
% Button pushed function: setorigo
function setorigo_Callback(app, event)
% Create GUIDE-style callback args - Added by Migration Tool
[hObject, eventdata, handles] = convertToGUIDECallbackArguments(app, event); %#ok<ASGLU>
% set t-axis zero at first sync pulse
global origo t data
axes(handles.clickplot)
[origo,y]=ginput(1);
cla;
plot(t,log10(data.nix),'.');
%Origo for click file without calib tones
%set(handles.clickplot,'xlim',[origo origo+0.425],'xtick',[origo+0.0005:0.012:origo+0.425]','xgrid','on');
set(handles.clickplot,'xlim',[origo origo+0.425],'xtick',[origo+0.0485:0.012:origo+0.425]','xgrid','on');
hold on
plot(origo,y,'or');
end
% Clicked callback: uitoggletool3
function uitoggletool3_ClickedCallback(app, event)
% Reset the states of interactive tools and reset all figure
% interactions.
app.resetInteractions(event);
% Enable or disable pan based on the
% tool's current state.
state = app.uitoggletool3.State;
pan(app.figure1, char(state));
end
% Clicked callback: uitoggletool2
function uitoggletool2_ClickedCallback(app, event)
% Reset the states of interactive tools and reset all figure
% interactions.
app.resetInteractions(event);
% Enable or disable zoom-out based on the
% tool's current state.
state = app.uitoggletool2.State;
zoomModeObject = zoom(app.figure1);
if state
zoomModeObject.Direction = 'out';
zoomModeObject.Enable = 'on';
else
zoomModeObject.Enable = 'off';
end
end
% Clicked callback: uitoggletool1
function uitoggletool1_ClickedCallback(app, event)
% Reset the states of interactive tools and reset all figure
% interactions.
app.resetInteractions(event);
% Enable or disable zoom-in based on the
% tool's current state.
state = app.uitoggletool1.State;
zoomModeObject = zoom(app.figure1);
if state
zoomModeObject.Direction = 'in';
zoomModeObject.Enable = 'on';
else
zoomModeObject.Enable = 'off';
end
end
end
% Component initialization
methods (Access = private)
% Create UIFigure and components
function createComponents(app)
% Create figure1 and hide until all components are created
app.figure1 = uifigure('Visible', 'off');
app.figure1.Colormap = [0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 1;0 0.0625 1;0 0.125 1;0 0.1875 1;0 0.25 1;0 0.3125 1;0 0.375 1;0 0.4375 1;0 0.5 1;0 0.5625 1;0 0.625 1;0 0.6875 1;0 0.75 1;0 0.8125 1;0 0.875 1;0 0.9375 1;0 1 1;0.0625 1 1;0.125 1 0.9375;0.1875 1 0.875;0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;1 1 0.0625;1 1 0;1 0.9375 0;1 0.875 0;1 0.8125 0;1 0.75 0;1 0.6875 0;1 0.625 0;1 0.5625 0;1 0.5 0;1 0.4375 0;1 0.375 0;1 0.3125 0;1 0.25 0;1 0.1875 0;1 0.125 0;1 0.0625 0;1 0 0;0.9375 0 0;0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;0.5625 0 0];
app.figure1.Position = [520 157 1142 644];
app.figure1.Name = 'cpodcalibrate';
app.figure1.Resize = 'off';
app.figure1.HandleVisibility = 'on';
app.figure1.Tag = 'figure1';
% Create Untitled_1
app.Untitled_1 = uimenu(app.figure1);
app.Untitled_1.Text = 'File';
app.Untitled_1.Tag = 'Untitled_1';
% Create loaddata
app.loaddata = uimenu(app.Untitled_1);
app.loaddata.MenuSelectedFcn = createCallbackFcn(app, @loaddata_Callback, true);
app.loaddata.Text = 'Open CPOD file';
app.loaddata.Tag = 'loaddata';
% Create loadmatdata
app.loadmatdata = uimenu(app.Untitled_1);
app.loadmatdata.Text = 'Open mat-file';
app.loadmatdata.Tag = 'loadmatdata';
% Create savedata
app.savedata = uimenu(app.Untitled_1);
app.savedata.MenuSelectedFcn = createCallbackFcn(app, @savedata_Callback, true);
app.savedata.Text = 'save';
app.savedata.Tag = 'savedata';
% Create uitoolbar1
app.uitoolbar1 = uitoolbar(app.figure1);
app.uitoolbar1.Tag = 'uitoolbar1';
% Create uitoggletool1
app.uitoggletool1 = uitoggletool(app.uitoolbar1);
app.uitoggletool1.Tag = 'uitoggletool1';
app.uitoggletool1.Tooltip = 'Zoom In';
app.uitoggletool1.ClickedCallback = createCallbackFcn(app, @uitoggletool1_ClickedCallback, true);
app.uitoggletool1.Icon = 'uitoggletool1_image.png';
% Create uitoggletool2
app.uitoggletool2 = uitoggletool(app.uitoolbar1);
app.uitoggletool2.Tag = 'uitoggletool2';
app.uitoggletool2.Tooltip = 'Zoom Out';
app.uitoggletool2.ClickedCallback = createCallbackFcn(app, @uitoggletool2_ClickedCallback, true);
app.uitoggletool2.Icon = 'uitoggletool2_image.png';
% Create uitoggletool3
app.uitoggletool3 = uitoggletool(app.uitoolbar1);
app.uitoggletool3.Tag = 'uitoggletool3';
app.uitoggletool3.Tooltip = 'Pan';
app.uitoggletool3.ClickedCallback = createCallbackFcn(app, @uitoggletool3_ClickedCallback, true);
app.uitoggletool3.Icon = 'uitoggletool3_image.png';
% Create removeechoes
app.removeechoes = uibutton(app.figure1, 'push');
app.removeechoes.ButtonPushedFcn = createCallbackFcn(app, @removeechoes_Callback, true);
app.removeechoes.Tag = 'removeechoes';
app.removeechoes.BackgroundColor = [0.925490196078431 0.913725490196078 0.847058823529412];
app.removeechoes.FontSize = 11;
app.removeechoes.Position = [250 605 94 22];
app.removeechoes.Text = 'Remove echoes';
% Create Addtotable
app.Addtotable = uibutton(app.figure1, 'push');
app.Addtotable.ButtonPushedFcn = createCallbackFcn(app, @Addtotable_Callback, true);
app.Addtotable.Tag = 'Addtotable';
app.Addtotable.BackgroundColor = [0.925490196078431 0.913725490196078 0.847058823529412];
app.Addtotable.FontSize = 11;
app.Addtotable.Position = [970 344 69 22];
app.Addtotable.Text = 'Add';
% Create podnumber
app.podnumber = uieditfield(app.figure1, 'text');
app.podnumber.Tag = 'podnumber';
app.podnumber.HorizontalAlignment = 'center';
app.podnumber.FontSize = 11;
app.podnumber.Position = [971 394 49 20];
app.podnumber.Value = '0';
% Create datatable
app.datatable = uitable(app.figure1);
app.datatable.ColumnName = {'POD'; 'Sens 0'; 'Sens 90'; 'Sens 180'; 'Sens 270'; 'Thr 0'; 'Thr 90'; 'Thr 180'; 'Thr 270'};
app.datatable.ColumnEditable = [false false false false false false false false false];
app.datatable.Tag = 'datatable';
app.datatable.FontSize = 11;
app.datatable.Position = [709 44 422 251];
% Create Frequencyselect
app.Frequencyselect = uilistbox(app.figure1);
app.Frequencyselect.Items = {'110 kHz', '120 kHz', '130 kHz', '140 kHz'};
app.Frequencyselect.Tag = 'Frequencyselect';
app.Frequencyselect.FontSize = 11;
app.Frequencyselect.Position = [970 532 72 62];
app.Frequencyselect.Value = '130 kHz';
% Create angleselect
app.angleselect = uilistbox(app.figure1);
app.angleselect.Items = {'0 degrees', '90 degrees', '180 degrees', '270 degrees'};
app.angleselect.Tag = 'angleselect';
app.angleselect.FontSize = 11;
app.angleselect.Position = [970 444 89 63];
app.angleselect.Value = '0 degrees';
% Create removefromtable
app.removefromtable = uibutton(app.figure1, 'push');
app.removefromtable.Tag = 'removefromtable';
app.removefromtable.BackgroundColor = [0.925490196078431 0.913725490196078 0.847058823529412];
app.removefromtable.FontSize = 11;
app.removefromtable.Position = [1051 344 69 22];
app.removefromtable.Text = 'Remove';
% Create setorigo
app.setorigo = uibutton(app.figure1, 'push');
app.setorigo.ButtonPushedFcn = createCallbackFcn(app, @setorigo_Callback, true);
app.setorigo.Tag = 'setorigo';
app.setorigo.BackgroundColor = [0.925490196078431 0.913725490196078 0.847058823529412];
app.setorigo.FontSize = 11;
app.setorigo.Position = [50 606 69 22];
app.setorigo.Text = 'Set origo';
% Create divisionline
app.divisionline = uibutton(app.figure1, 'push');
app.divisionline.ButtonPushedFcn = createCallbackFcn(app, @divisionline_Callback, true);
app.divisionline.Tag = 'divisionline';
app.divisionline.BackgroundColor = [0.925490196078431 0.913725490196078 0.847058823529412];
app.divisionline.FontSize = 11;
app.divisionline.Position = [150 605 69 22];
app.divisionline.Text = 'Division Line';
% Create edit2
app.edit2 = uieditfield(app.figure1, 'text');
app.edit2.Tag = 'edit2';
app.edit2.HorizontalAlignment = 'center';
app.edit2.FontSize = 11;
app.edit2.Position = [517 606 89 20];
app.edit2.Value = 'Edit Text';
% Create clickplot
app.clickplot = uiaxes(app.figure1);
app.clickplot.Colormap = [0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 1;0 0.0625 1;0 0.125 1;0 0.1875 1;0 0.25 1;0 0.3125 1;0 0.375 1;0 0.4375 1;0 0.5 1;0 0.5625 1;0 0.625 1;0 0.6875 1;0 0.75 1;0 0.8125 1;0 0.875 1;0 0.9375 1;0 1 1;0.0625 1 1;0.125 1 0.9375;0.1875 1 0.875;0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;1 1 0.0625;1 1 0;1 0.9375 0;1 0.875 0;1 0.8125 0;1 0.75 0;1 0.6875 0;1 0.625 0;1 0.5625 0;1 0.5 0;1 0.4375 0;1 0.375 0;1 0.3125 0;1 0.25 0;1 0.1875 0;1 0.125 0;1 0.0625 0;1 0 0;0.9375 0 0;0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;0.5625 0 0];
app.clickplot.FontSize = 13;
app.clickplot.NextPlot = 'replace';
app.clickplot.Tag = 'clickplot';
app.clickplot.Position = [24 322 937 280];
% Create thresholdplot
app.thresholdplot = uiaxes(app.figure1);
app.thresholdplot.Colormap = [0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 1;0 0.0625 1;0 0.125 1;0 0.1875 1;0 0.25 1;0 0.3125 1;0 0.375 1;0 0.4375 1;0 0.5 1;0 0.5625 1;0 0.625 1;0 0.6875 1;0 0.75 1;0 0.8125 1;0 0.875 1;0 0.9375 1;0 1 1;0.0625 1 1;0.125 1 0.9375;0.1875 1 0.875;0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;1 1 0.0625;1 1 0;1 0.9375 0;1 0.875 0;1 0.8125 0;1 0.75 0;1 0.6875 0;1 0.625 0;1 0.5625 0;1 0.5 0;1 0.4375 0;1 0.375 0;1 0.3125 0;1 0.25 0;1 0.1875 0;1 0.125 0;1 0.0625 0;1 0 0;0.9375 0 0;0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;0.5625 0 0];
app.thresholdplot.FontSize = 13;
app.thresholdplot.NextPlot = 'replace';
app.thresholdplot.Tag = 'thresholdplot';
app.thresholdplot.Position = [25 22 336 280];
% Create nixplot
app.nixplot = uiaxes(app.figure1);
app.nixplot.Colormap = [0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 1;0 0.0625 1;0 0.125 1;0 0.1875 1;0 0.25 1;0 0.3125 1;0 0.375 1;0 0.4375 1;0 0.5 1;0 0.5625 1;0 0.625 1;0 0.6875 1;0 0.75 1;0 0.8125 1;0 0.875 1;0 0.9375 1;0 1 1;0.0625 1 1;0.125 1 0.9375;0.1875 1 0.875;0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;1 1 0.0625;1 1 0;1 0.9375 0;1 0.875 0;1 0.8125 0;1 0.75 0;1 0.6875 0;1 0.625 0;1 0.5625 0;1 0.5 0;1 0.4375 0;1 0.375 0;1 0.3125 0;1 0.25 0;1 0.1875 0;1 0.125 0;1 0.0625 0;1 0 0;0.9375 0 0;0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;0.5625 0 0];
app.nixplot.FontSize = 13;
app.nixplot.NextPlot = 'replace';
app.nixplot.Tag = 'nixplot';
app.nixplot.Position = [375 22 336 280];
% Show the figure after all components are created
app.figure1.Visible = 'on';
end
end
% App creation and deletion
methods (Access = public)
% Construct app
function app = cpodcalibrate_App(varargin)
runningApp = getRunningApp(app);
% Check for running singleton app
if isempty(runningApp)
% Create UIFigure and components
createComponents(app)
% Register the app with App Designer
registerApp(app, app.figure1)
% Execute the startup function
runStartupFcn(app, @(app)cpodcalibrate_OpeningFcn(app, varargin{:}))
else
% Focus the running singleton app
figure(runningApp.figure1)
app = runningApp;
end
if nargout == 0
clear app
end
end
% Code that executes before app deletion
function delete(app)
% Delete UIFigure when app is deleted
delete(app.figure1)
end
end
end
因此,根据@Hoki 的一些建议,我制作了一个新按钮,用于调整轴的 xlims 和其他功能的大小。现在,根据我上次单击的是 'set origo' 还是 'zoom to data',双击会分别将我发送到每个范围。这意味着我至少可以摆脱 set origo 确定的轴限制。我没有花时间摆脱 auto xgrid,因为老实说,我可以忍受它。
% Button pushed function: ZoomtoDataButton
function ZoomtoDataButtonPushed(app, event)
[hObject, eventdata, handles] = convertToGUIDECallbackArguments(app, event); %#ok<ASGLU>
axes(handles.clickplot)
cla;
updateplot(app, handles)
xlim('auto')
xticks('auto')
ylim('auto')
end
我最近将一个最初在 GUIDE 中设计的应用程序转换为应用程序设计工具。我没有编写原始代码,并且由于转换,我什至不知道如何搜索这个问题的答案。如果这已在其他地方涵盖,我深表歉意。
在我的应用程序中,我可以加载包含线性时间尺度信号数据的 txt 文件。使用该应用程序,我可以滚动到感兴趣的信号。然后我设置 'origo' 或带有回调函数的信号源,它会在一致的时间尺度上重新绘制信号。
这与旧工具完全一样,很棒。我可以处理信号,然后继续前进。问题是当我缩小然后滚动找到我感兴趣的下一个信号时。如果我在绘图上的任何地方双击,绘图将再次缩放到原始位置,并具有由 setorigo_Callback 函数创建的一致时间刻度。此外,如果我发现其他感兴趣的信号并对其进行处理,包括在 x 轴上设置新的原点位置,如果我双击它,它将缩放到我指定的第一个原点位置。不管我是否设置了新的origo,双击都会将我发送到我第一次打开应用程序时第一个origo进程的位置。
有人知道这里发生了什么吗?或者,我该如何阻止它?我似乎无法清除 origo 有价值的东西,或者抹去第一个 origo 集的情节记忆。请查看完整代码。 非常感谢!
Sample data: 1990.txt
Minute microsec cycles SPL_Pa kHz Bandwidth end kHz
14/5/2019 13:11 3220245 6 97 149 2 185
14/5/2019 13:11 4479150 11 16 55 5 83
14/5/2019 13:11 4479650 4 54 61 0 64
... and so on.
classdef cpodcalibrate_App < matlab.apps.AppBase
% Properties that correspond to app components
properties (Access = public)
figure1 matlab.ui.Figure
Untitled_1 matlab.ui.container.Menu
loaddata matlab.ui.container.Menu
loadmatdata matlab.ui.container.Menu
savedata matlab.ui.container.Menu
uitoolbar1 matlab.ui.container.Toolbar
uitoggletool1 matlab.ui.container.toolbar.ToggleTool
uitoggletool2 matlab.ui.container.toolbar.ToggleTool
uitoggletool3 matlab.ui.container.toolbar.ToggleTool
removeechoes matlab.ui.control.Button
Addtotable matlab.ui.control.Button
podnumber matlab.ui.control.EditField
datatable matlab.ui.control.Table
Frequencyselect matlab.ui.control.ListBox
angleselect matlab.ui.control.ListBox
removefromtable matlab.ui.control.Button
setorigo matlab.ui.control.Button
divisionline matlab.ui.control.Button
edit2 matlab.ui.control.EditField
clickplot matlab.ui.control.UIAxes
thresholdplot matlab.ui.control.UIAxes
nixplot matlab.ui.control.UIAxes
end
methods (Access = private)
function updateplot(app, handles)
global data t
axes(handles.clickplot);
cla;
t=((data.datetime(:,4)*60+data.datetime(:,5))-(data.datetime(1,4)*60-data.datetime(1,5)))*60+data.rectime*1e-6;
plot(t,log10(data.nix),'.')
end
function resetInteractions(app, event)
% This function resets the states of the toggle tools that
% impact user interactions. It also resets the figure interactions.
% Find all tools to reset. Exclude the tool associated
% with the event.
interactiveTools = [app.uitoggletool1, app.uitoggletool2, app.uitoggletool3];
interactiveTools(event.Source == interactiveTools) = [];
% Set the state of the tools to 'off'.
[interactiveTools.State] = deal('off');
% Set figure interactions to 'off'.
datacursormode(app.figure1, 'off')
rotate3d(app.figure1, 'off');
pan(app.figure1, 'off');
zoom(app.figure1,'off');
end
% Update components that require runtime configuration
function addRuntimeConfigurations(app)
% Set component properties that require runtime configuration
app.datatable.BackgroundColor = [1 1 1;0.9608 0.9608 0.9608];
app.datatable.ColumnFormat = {[] [] [] [] [] [] [] [] []};
end
end
% Callbacks that handle component events
methods (Access = private)
% Code that executes after component creation
function cpodcalibrate_OpeningFcn(app, varargin)
% Add runtime required configuration - Added by Migration Tool
addRuntimeConfigurations(app);
% Create GUIDE-style callback args - Added by Migration Tool
[hObject, eventdata, handles] = convertToGUIDECallbackArguments(app); %#ok<ASGLU>
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to cpodcalibrate (see VARARGIN)
% Choose default command line output for cpodcalibrate
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
end
% Button pushed function: Addtotable
function Addtotable_Callback(app, event)
% Create GUIDE-style callback args - Added by Migration Tool
[hObject, eventdata, handles] = convertToGUIDECallbackArguments(app, event); %#ok<ASGLU>
%add line to table
global threshold
axes(handles.nixplot)
regline=lsline;
for angle=1:4
y=get(regline(angle),'Ydata');
sensitivity(angle)=y(1);
end;
%keyboard
datastring=cell(1,9);
datastring(1)=num2cell(str2double(get(handles.podnumber,'string')));
for n=1:4
datastring(1+n)=num2cell(sensitivity(n));
datastring(5+n)=num2cell(threshold(n));
end
table=get(handles.datatable,'data');
%keyboard;
if size(table,1)==0
table=datastring;
else
table=[table;datastring];
end
set(handles.datatable,'data',table);
save('Calibration.mat','table');
end
% Button pushed function: divisionline
function divisionline_Callback(app, event)
% Create GUIDE-style callback args - Added by Migration Tool
[hObject, eventdata, handles] = convertToGUIDECallbackArguments(app, event); %#ok<ASGLU>
% hObject handle to divisionline (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global divider
axes(handles.clickplot)
divider=gline;
end
% Menu selected function: loaddata
function loaddata_Callback(app, event)
% Create GUIDE-style callback args - Added by Migration Tool
[hObject, eventdata, handles] = convertToGUIDECallbackArguments(app, event); %#ok<ASGLU>
%Load C-POD export data
global data clicks meannix newfilename
[filename, pathname] = uigetfile('*.txt');
raw=readtable([pathname filename]);
%If there is an extra column on the older text files, this will
%sort the columnns correctly.
if width(raw)>7
rr=1;
else
rr=0;
end
headers = raw.Properties.VariableNames;
%% Extract variables from file content
%Removes last line in data, as often incomplete.
raw(end,:)=[];
data.datetime=datevec(datetime(raw.(1)));
set(handles.podnumber,'string',filename(1:4));
data.podid=str2double(filename(1:4));
data.recdate=char(raw.(1));
data.rectime=raw.(2+rr); %useconds after whole minute
data.cycles=raw.(3+rr); % cycles
data.nix=raw.(4+rr); % peak pressure, Nick-units
data.frq=raw.(5+rr); % Instantaneous frequency
data.bandwidth=raw.(6+rr); % Bandwidth, Nick-unit
data.endfrq=raw.(7+rr); % End-frequency in sweep
newfilename=[filename(1:end-4), '.mat'];
%keyboard
save(newfilename,'data');
updateplot(app, handles);
%initiate results arrays and clear plots
clicks=zeros(31,4); %number of clicks detected
meannix=zeros(31,4); %mean nix per block of 10 clicks
axes(handles.thresholdplot);
axes(handles.nixplot);
end
% Button pushed function: removeechoes
function removeechoes_Callback(app, event)
% Create GUIDE-style callback args - Added by Migration Tool
[hObject, eventdata, handles] = convertToGUIDECallbackArguments(app, event); %#ok<ASGLU>
%Insert line and remove echoes
global data t origo clicks meannix divider threshold newfilename
axes(handles.clickplot)
x=get(divider,'Xdata');
y=get(divider,'Ydata');
alpha=(y(1)-y(2))/(x(1)-x(2));
beta=y(1)-alpha*x(1);
xlim=get(handles.clickplot,'xlim');
clicksinplotx=t(t>xlim(1)&t<xlim(2));
clicksinploty=data.nix(t>xlim(1)&t<xlim(2));
divideline=(clicksinplotx)*alpha+beta;
hold on
plot(clicksinplotx,divideline)
selectedclicksx=clicksinplotx(log10(clicksinploty)>divideline)-origo;
selectedclicksy=clicksinploty(log10(clicksinploty)>divideline);
%plot and analyze
angle=get(handles.angleselect,'value');
breaks=(0.0485:0.012:0.425)'; %Create breaks to separate blocks
for n=1:31
clicks(n,angle)=sum(selectedclicksx>breaks(n)&selectedclicksx<breaks(n+1));
meannix(n,angle)=mean(selectedclicksy(selectedclicksx>breaks(n)&selectedclicksx<breaks(n+1)));
end
axes(handles.thresholdplot);
att=0:30;
plot(att,clicks,'o-')
above=att(clicks(:,angle)>=5);
below=att(clicks(:,angle)<5);
%keyboard
if isempty(above) %all levels below threshold
threshold(angle)=NaN;
else
threshold(angle)=(above(end)+below(1))/2;
end
legend('0','90','180','270');
axes(handles.nixplot)
plot(att,20*log10(meannix),'.')
legend('0','90','180','270');
save(newfilename,'clicks','meannix','-append')
end
% Menu selected function: savedata
function savedata_Callback(app, event)
% Create GUIDE-style callback args - Added by Migration Tool
[hObject, eventdata, handles] = convertToGUIDECallbackArguments(app, event); %#ok<ASGLU>
% Save spreadsheet to excelfile
table=get(handles.datatable,'data');
xlswrite('Calibration.xls',table);
save('Calibraton.mat','table');
end
% Button pushed function: setorigo
function setorigo_Callback(app, event)
% Create GUIDE-style callback args - Added by Migration Tool
[hObject, eventdata, handles] = convertToGUIDECallbackArguments(app, event); %#ok<ASGLU>
% set t-axis zero at first sync pulse
global origo t data
axes(handles.clickplot)
[origo,y]=ginput(1);
cla;
plot(t,log10(data.nix),'.');
%Origo for click file without calib tones
%set(handles.clickplot,'xlim',[origo origo+0.425],'xtick',[origo+0.0005:0.012:origo+0.425]','xgrid','on');
set(handles.clickplot,'xlim',[origo origo+0.425],'xtick',[origo+0.0485:0.012:origo+0.425]','xgrid','on');
hold on
plot(origo,y,'or');
end
% Clicked callback: uitoggletool3
function uitoggletool3_ClickedCallback(app, event)
% Reset the states of interactive tools and reset all figure
% interactions.
app.resetInteractions(event);
% Enable or disable pan based on the
% tool's current state.
state = app.uitoggletool3.State;
pan(app.figure1, char(state));
end
% Clicked callback: uitoggletool2
function uitoggletool2_ClickedCallback(app, event)
% Reset the states of interactive tools and reset all figure
% interactions.
app.resetInteractions(event);
% Enable or disable zoom-out based on the
% tool's current state.
state = app.uitoggletool2.State;
zoomModeObject = zoom(app.figure1);
if state
zoomModeObject.Direction = 'out';
zoomModeObject.Enable = 'on';
else
zoomModeObject.Enable = 'off';
end
end
% Clicked callback: uitoggletool1
function uitoggletool1_ClickedCallback(app, event)
% Reset the states of interactive tools and reset all figure
% interactions.
app.resetInteractions(event);
% Enable or disable zoom-in based on the
% tool's current state.
state = app.uitoggletool1.State;
zoomModeObject = zoom(app.figure1);
if state
zoomModeObject.Direction = 'in';
zoomModeObject.Enable = 'on';
else
zoomModeObject.Enable = 'off';
end
end
end
% Component initialization
methods (Access = private)
% Create UIFigure and components
function createComponents(app)
% Create figure1 and hide until all components are created
app.figure1 = uifigure('Visible', 'off');
app.figure1.Colormap = [0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 1;0 0.0625 1;0 0.125 1;0 0.1875 1;0 0.25 1;0 0.3125 1;0 0.375 1;0 0.4375 1;0 0.5 1;0 0.5625 1;0 0.625 1;0 0.6875 1;0 0.75 1;0 0.8125 1;0 0.875 1;0 0.9375 1;0 1 1;0.0625 1 1;0.125 1 0.9375;0.1875 1 0.875;0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;1 1 0.0625;1 1 0;1 0.9375 0;1 0.875 0;1 0.8125 0;1 0.75 0;1 0.6875 0;1 0.625 0;1 0.5625 0;1 0.5 0;1 0.4375 0;1 0.375 0;1 0.3125 0;1 0.25 0;1 0.1875 0;1 0.125 0;1 0.0625 0;1 0 0;0.9375 0 0;0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;0.5625 0 0];
app.figure1.Position = [520 157 1142 644];
app.figure1.Name = 'cpodcalibrate';
app.figure1.Resize = 'off';
app.figure1.HandleVisibility = 'on';
app.figure1.Tag = 'figure1';
% Create Untitled_1
app.Untitled_1 = uimenu(app.figure1);
app.Untitled_1.Text = 'File';
app.Untitled_1.Tag = 'Untitled_1';
% Create loaddata
app.loaddata = uimenu(app.Untitled_1);
app.loaddata.MenuSelectedFcn = createCallbackFcn(app, @loaddata_Callback, true);
app.loaddata.Text = 'Open CPOD file';
app.loaddata.Tag = 'loaddata';
% Create loadmatdata
app.loadmatdata = uimenu(app.Untitled_1);
app.loadmatdata.Text = 'Open mat-file';
app.loadmatdata.Tag = 'loadmatdata';
% Create savedata
app.savedata = uimenu(app.Untitled_1);
app.savedata.MenuSelectedFcn = createCallbackFcn(app, @savedata_Callback, true);
app.savedata.Text = 'save';
app.savedata.Tag = 'savedata';
% Create uitoolbar1
app.uitoolbar1 = uitoolbar(app.figure1);
app.uitoolbar1.Tag = 'uitoolbar1';
% Create uitoggletool1
app.uitoggletool1 = uitoggletool(app.uitoolbar1);
app.uitoggletool1.Tag = 'uitoggletool1';
app.uitoggletool1.Tooltip = 'Zoom In';
app.uitoggletool1.ClickedCallback = createCallbackFcn(app, @uitoggletool1_ClickedCallback, true);
app.uitoggletool1.Icon = 'uitoggletool1_image.png';
% Create uitoggletool2
app.uitoggletool2 = uitoggletool(app.uitoolbar1);
app.uitoggletool2.Tag = 'uitoggletool2';
app.uitoggletool2.Tooltip = 'Zoom Out';
app.uitoggletool2.ClickedCallback = createCallbackFcn(app, @uitoggletool2_ClickedCallback, true);
app.uitoggletool2.Icon = 'uitoggletool2_image.png';
% Create uitoggletool3
app.uitoggletool3 = uitoggletool(app.uitoolbar1);
app.uitoggletool3.Tag = 'uitoggletool3';
app.uitoggletool3.Tooltip = 'Pan';
app.uitoggletool3.ClickedCallback = createCallbackFcn(app, @uitoggletool3_ClickedCallback, true);
app.uitoggletool3.Icon = 'uitoggletool3_image.png';
% Create removeechoes
app.removeechoes = uibutton(app.figure1, 'push');
app.removeechoes.ButtonPushedFcn = createCallbackFcn(app, @removeechoes_Callback, true);
app.removeechoes.Tag = 'removeechoes';
app.removeechoes.BackgroundColor = [0.925490196078431 0.913725490196078 0.847058823529412];
app.removeechoes.FontSize = 11;
app.removeechoes.Position = [250 605 94 22];
app.removeechoes.Text = 'Remove echoes';
% Create Addtotable
app.Addtotable = uibutton(app.figure1, 'push');
app.Addtotable.ButtonPushedFcn = createCallbackFcn(app, @Addtotable_Callback, true);
app.Addtotable.Tag = 'Addtotable';
app.Addtotable.BackgroundColor = [0.925490196078431 0.913725490196078 0.847058823529412];
app.Addtotable.FontSize = 11;
app.Addtotable.Position = [970 344 69 22];
app.Addtotable.Text = 'Add';
% Create podnumber
app.podnumber = uieditfield(app.figure1, 'text');
app.podnumber.Tag = 'podnumber';
app.podnumber.HorizontalAlignment = 'center';
app.podnumber.FontSize = 11;
app.podnumber.Position = [971 394 49 20];
app.podnumber.Value = '0';
% Create datatable
app.datatable = uitable(app.figure1);
app.datatable.ColumnName = {'POD'; 'Sens 0'; 'Sens 90'; 'Sens 180'; 'Sens 270'; 'Thr 0'; 'Thr 90'; 'Thr 180'; 'Thr 270'};
app.datatable.ColumnEditable = [false false false false false false false false false];
app.datatable.Tag = 'datatable';
app.datatable.FontSize = 11;
app.datatable.Position = [709 44 422 251];
% Create Frequencyselect
app.Frequencyselect = uilistbox(app.figure1);
app.Frequencyselect.Items = {'110 kHz', '120 kHz', '130 kHz', '140 kHz'};
app.Frequencyselect.Tag = 'Frequencyselect';
app.Frequencyselect.FontSize = 11;
app.Frequencyselect.Position = [970 532 72 62];
app.Frequencyselect.Value = '130 kHz';
% Create angleselect
app.angleselect = uilistbox(app.figure1);
app.angleselect.Items = {'0 degrees', '90 degrees', '180 degrees', '270 degrees'};
app.angleselect.Tag = 'angleselect';
app.angleselect.FontSize = 11;
app.angleselect.Position = [970 444 89 63];
app.angleselect.Value = '0 degrees';
% Create removefromtable
app.removefromtable = uibutton(app.figure1, 'push');
app.removefromtable.Tag = 'removefromtable';
app.removefromtable.BackgroundColor = [0.925490196078431 0.913725490196078 0.847058823529412];
app.removefromtable.FontSize = 11;
app.removefromtable.Position = [1051 344 69 22];
app.removefromtable.Text = 'Remove';
% Create setorigo
app.setorigo = uibutton(app.figure1, 'push');
app.setorigo.ButtonPushedFcn = createCallbackFcn(app, @setorigo_Callback, true);
app.setorigo.Tag = 'setorigo';
app.setorigo.BackgroundColor = [0.925490196078431 0.913725490196078 0.847058823529412];
app.setorigo.FontSize = 11;
app.setorigo.Position = [50 606 69 22];
app.setorigo.Text = 'Set origo';
% Create divisionline
app.divisionline = uibutton(app.figure1, 'push');
app.divisionline.ButtonPushedFcn = createCallbackFcn(app, @divisionline_Callback, true);
app.divisionline.Tag = 'divisionline';
app.divisionline.BackgroundColor = [0.925490196078431 0.913725490196078 0.847058823529412];
app.divisionline.FontSize = 11;
app.divisionline.Position = [150 605 69 22];
app.divisionline.Text = 'Division Line';
% Create edit2
app.edit2 = uieditfield(app.figure1, 'text');
app.edit2.Tag = 'edit2';
app.edit2.HorizontalAlignment = 'center';
app.edit2.FontSize = 11;
app.edit2.Position = [517 606 89 20];
app.edit2.Value = 'Edit Text';
% Create clickplot
app.clickplot = uiaxes(app.figure1);
app.clickplot.Colormap = [0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 1;0 0.0625 1;0 0.125 1;0 0.1875 1;0 0.25 1;0 0.3125 1;0 0.375 1;0 0.4375 1;0 0.5 1;0 0.5625 1;0 0.625 1;0 0.6875 1;0 0.75 1;0 0.8125 1;0 0.875 1;0 0.9375 1;0 1 1;0.0625 1 1;0.125 1 0.9375;0.1875 1 0.875;0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;1 1 0.0625;1 1 0;1 0.9375 0;1 0.875 0;1 0.8125 0;1 0.75 0;1 0.6875 0;1 0.625 0;1 0.5625 0;1 0.5 0;1 0.4375 0;1 0.375 0;1 0.3125 0;1 0.25 0;1 0.1875 0;1 0.125 0;1 0.0625 0;1 0 0;0.9375 0 0;0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;0.5625 0 0];
app.clickplot.FontSize = 13;
app.clickplot.NextPlot = 'replace';
app.clickplot.Tag = 'clickplot';
app.clickplot.Position = [24 322 937 280];
% Create thresholdplot
app.thresholdplot = uiaxes(app.figure1);
app.thresholdplot.Colormap = [0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 1;0 0.0625 1;0 0.125 1;0 0.1875 1;0 0.25 1;0 0.3125 1;0 0.375 1;0 0.4375 1;0 0.5 1;0 0.5625 1;0 0.625 1;0 0.6875 1;0 0.75 1;0 0.8125 1;0 0.875 1;0 0.9375 1;0 1 1;0.0625 1 1;0.125 1 0.9375;0.1875 1 0.875;0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;1 1 0.0625;1 1 0;1 0.9375 0;1 0.875 0;1 0.8125 0;1 0.75 0;1 0.6875 0;1 0.625 0;1 0.5625 0;1 0.5 0;1 0.4375 0;1 0.375 0;1 0.3125 0;1 0.25 0;1 0.1875 0;1 0.125 0;1 0.0625 0;1 0 0;0.9375 0 0;0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;0.5625 0 0];
app.thresholdplot.FontSize = 13;
app.thresholdplot.NextPlot = 'replace';
app.thresholdplot.Tag = 'thresholdplot';
app.thresholdplot.Position = [25 22 336 280];
% Create nixplot
app.nixplot = uiaxes(app.figure1);
app.nixplot.Colormap = [0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 1;0 0.0625 1;0 0.125 1;0 0.1875 1;0 0.25 1;0 0.3125 1;0 0.375 1;0 0.4375 1;0 0.5 1;0 0.5625 1;0 0.625 1;0 0.6875 1;0 0.75 1;0 0.8125 1;0 0.875 1;0 0.9375 1;0 1 1;0.0625 1 1;0.125 1 0.9375;0.1875 1 0.875;0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;1 1 0.0625;1 1 0;1 0.9375 0;1 0.875 0;1 0.8125 0;1 0.75 0;1 0.6875 0;1 0.625 0;1 0.5625 0;1 0.5 0;1 0.4375 0;1 0.375 0;1 0.3125 0;1 0.25 0;1 0.1875 0;1 0.125 0;1 0.0625 0;1 0 0;0.9375 0 0;0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;0.5625 0 0];
app.nixplot.FontSize = 13;
app.nixplot.NextPlot = 'replace';
app.nixplot.Tag = 'nixplot';
app.nixplot.Position = [375 22 336 280];
% Show the figure after all components are created
app.figure1.Visible = 'on';
end
end
% App creation and deletion
methods (Access = public)
% Construct app
function app = cpodcalibrate_App(varargin)
runningApp = getRunningApp(app);
% Check for running singleton app
if isempty(runningApp)
% Create UIFigure and components
createComponents(app)
% Register the app with App Designer
registerApp(app, app.figure1)
% Execute the startup function
runStartupFcn(app, @(app)cpodcalibrate_OpeningFcn(app, varargin{:}))
else
% Focus the running singleton app
figure(runningApp.figure1)
app = runningApp;
end
if nargout == 0
clear app
end
end
% Code that executes before app deletion
function delete(app)
% Delete UIFigure when app is deleted
delete(app.figure1)
end
end
end
因此,根据@Hoki 的一些建议,我制作了一个新按钮,用于调整轴的 xlims 和其他功能的大小。现在,根据我上次单击的是 'set origo' 还是 'zoom to data',双击会分别将我发送到每个范围。这意味着我至少可以摆脱 set origo 确定的轴限制。我没有花时间摆脱 auto xgrid,因为老实说,我可以忍受它。
% Button pushed function: ZoomtoDataButton
function ZoomtoDataButtonPushed(app, event)
[hObject, eventdata, handles] = convertToGUIDECallbackArguments(app, event); %#ok<ASGLU>
axes(handles.clickplot)
cla;
updateplot(app, handles)
xlim('auto')
xticks('auto')
ylim('auto')
end