[英]Matlab App Designer Callback function keeps resetting plot with a double click to position it is first set at
我最近將最初在 GUIDE 中設計的應用程序轉換為應用程序設計器。 我沒有編寫原始代碼,並且由於轉換,我什至不知道如何搜索這個問題的答案。 如果這已在其他地方報道,我深表歉意。
在我的應用程序中,我可以加載包含線性時間尺度上的信號數據的 txt 文件。 使用該應用程序,我可以滾動到感興趣的信號。 然后我使用回調 function 設置“origo”或信號的原點,它在一致的時間尺度上重新繪制信號。
這與舊工具完全一樣,非常棒。 我可以處理信號,然后繼續前進。 問題是當我縮小,然后滾動查找我感興趣的下一個信號時。 If I at all double click anywhere on the plot, the plot zooms once again to the origo position with a consistent timescale created by the setorigo_Callback function. 此外,如果我發現其他感興趣的信號並對其進行處理,包括在 x 軸上設置一個新的 origo 位置,如果我雙擊它,它將縮放到我指定的第一個 origo position。 如果我設置了新的 origo 沒關系,雙擊會在我第一次打開應用程序時將我發送到第一個 origo 進程的位置。
有人知道這里發生了什么嗎? 或者,我該如何阻止它? 我似乎無法清除 origo 有價值的東西,或者擦除第一個 origo 集的情節 memory。 請查看完整代碼。 非常感謝!
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 那里得到一些建議,我制作了一個新按鈕,用於調整軸的 xlim 和其他功能的大小。 現在,根據我最后一次單擊“設置 origo”還是“縮放到數據”,雙擊將分別將我發送到每個范圍。 這意味着我至少可以擺脫設置 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.