1

GUIDE を使用していくつかの結果を視覚化するスクリプトを作成しようとしていますが、いくつかの問題に遭遇しました。最初にタスクについて説明します (質問が長くなりすぎないように、できるだけ一般的なものにします)。

プロットをグラフ化するスクリプト (main1.m) があり、プロットの領域を選択して分析し (以降、point1 と呼びます)、GUIDE (guide_fun1.m) を使用していくつかのプロットを生成します。関数 guide_fun1 には 2 つのラジオ ボタン (グループとして作成) と x 軸のスライダーが含まれているため、ユーザーは必要に応じて狭い範囲のプロットを表示できます (最初のプロットは x 軸で 0 から 1 ですが、ユーザーが 0 から 0.6 まで見たい場合は、スライダーで表示できます)。

コード main1.m (短くするために詳細ではありませんが、私が達成しようとしていることを示すためです) と guide_fun1.m を以下に示します。ご覧のとおり、main1.m は対話型であり、ユーザーは exit と入力してプログラムを終了するまで、プロットのいくつかのポイントを連続してクリックできます。クリックするすべての点 (point1) に対して、グラフとプロットのいくつかのオプションを含む GUIDE ウィンドウが表示されます。

main1.m 
%---------------
filename='file1.mat'
load(filename)
figure(1)    
plot(data.x,data.y) %data from structure of the mat file

while 1%so that it continues asking for a region
figure(1)
'choose a point or press e to exit'
[x1,y1,key]=ginput(1) %point1(x1,y1) 

[data1y,data2y,datax]=function1(x1,y1) %function1 is an outside function that does    
%the analysis of the points x1,y1 that were picked from the user

guide_fun1(data1y,data2y,datax)

     if (key == 'e')
     display('End')
     break;
     else
     display('click point')
     end

end

GUIDE を使用して作成した関数を以下に示します。

guide_fun1.m
%-------------
function varargout = guide_fun1(varargin)

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
               'gui_Singleton',  gui_Singleton, ...
               'gui_OpeningFcn', @guide_fun1_OpeningFcn, ...
               'gui_OutputFcn',  @guide_fun1_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 guide_fun1 is made visible.
function guide_fun1_OpeningFcn(hObject, eventdata, handles, varargin)
% 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 guide_fun1 (see VARARGIN)
handles.data1y = varargin{1};
handles.data2y = varargin{2};
handles.datax = varargin{3};

% Choose default command line output for guide_fun1
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes guide_fun1 wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = guide_fun1_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
 varargout{1} = handles.output;


% --- Executes when selected object is changed in uipanel1.
function uipanel1_SelectionChangeFcn(hObject, eventdata, handles)
% hObject    handle to the selected object in uipanel1 
% eventdata  structure with the following fields (see UIBUTTONGROUP)
%   EventName: string 'SelectionChanged' (read only)
%   OldValue: handle of the previously selected object or empty if none was selected
%   NewValue: handle of the currently selected object
% handles    structure with handles and user data (see GUIDATA)
switch get(eventdata.NewValue,'Tag') % Get Tag of selected object.

 case 'radiobutton1'
    % Code for when radiobutton1 is selected.
    semilogy(handles.datax,handles.data1y,'-r','LineWidth',4);
    axis([0 1 0. 1]);

 case 'radiobutton2'
    % Code for when radiobutton2 is selected.
    semilogy(handles.datax,handles.data2y,'-g','LineWidth',4)
    axis([0 1 0. 1]);

 end


% --- Executes on slider movement.
function slider1_Callback(hObject, eventdata, handles)
% hObject    handle to slider1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'Value') returns position of slider
%        get(hObject,'Min') and get(hObject,'Max') to determine range of slider
xminval=0;%set min value for x axis
xmaxval=1;%set max value for x axis
xsld_step = [0.01 0.1];%slider step

axis([xminval xmaxval 0 1]);%set axis range for plot

set(hObject,'Min',xminval);
set(hObject,'Max',xmaxval);
set(hObject, 'SliderStep', xsld_step);
new_xmaxval=get(hObject,'Value')

%this is to avoid the error in case the user slides to zero
if new_xmaxval<0.01
    'min value for x axis maximum range is 0.01'
     new_xmaxval=0.01
end


axis([xminval new_xmaxval 0 1]);%set new axis range for plot

% --- Executes during object creation, after setting all properties.
function slider1_CreateFcn(hObject, eventdata, handles)
% hObject    handle to slider1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor',[.9 .9 .9]);
end

修正したい問題が 3 つあります。

  1. スライダーが表示されると、スライダーの位置はゼロになりますが、最初のプロットは 0 から 1 であるため、スライダーの位置を 1 にしたいと思います。スライダーの初期位置を設定する方法はありますか?

  2. スライダーの位置を別の値、たとえば 0.4 に移動してから次のラジオ ボタン (「ボタン 2」) を押すと、グラフは x 軸に 0 から 1 の値で表示されますが、スライダーの位置はそのままです。 0.4 ポイントだったので、正しく見えません。「ボタン 2」を押すと、スライダーが値 1 に戻り、グラフが 0 から 1 までのプロットを表示するか、スライダーが前の位置 (0.4) のままでグラフにスライダーとグラフの両方が一致するように、0 から 0.4 までプロットします。そのためには、スライダーをラジオボタンに接続する方法を見つけなければならないことは理解していますが、その方法はわかりません。

  3. 最初のポイント (point1) をクリックして GUIDE ウィンドウが開くと、グラフが表示されず、ボタンが押されていません (これが必要です)。次に、必要なボタンを押して、調べたい x 軸の範囲にスライダーをスライドさせます。しかし、Figure(1) プロットで調べたい別のポイント (point1) をクリックすると、GUIDE ウィンドウは最後にクリックされたボタンとスライダーが前のポイントの位置のままで、' radio button1' または 'radio button2' は、新しい point1 のグラフに更新されます。新しい point1 をクリックしたときに、GUIDE ウィンドウが最初に開いたときのようになり、プロットが表示されず、ボタンが押されないようにしたい (基本的に前のループからリセットするため)。

これについて何か助けていただければ幸いです。MATLAB に関する私の知識は限られているため、これに関するガイダンスは本当に役に立ちます。


あなたのコメントでいくつかの問題を解決できましたが、残念ながらすべてではありませんでした。

  1. このコマンド set(handles.slider1,'value',1) を guide_fun1_OpeningFcn に追加することでこれを解決し、スライダーは再起動するたびに 1 になるので、動作します

  2. uipanel1_SelectionChangeFcn で変更しました

    case 'radiobutton1' % radiobutton1 が選択されたときのコード。semilogy (handles.datax,handles.data1y,'-r','LineWidth',4); 軸 ([0 1 0.1]);
    set(handles.slider1,'value',1);%NEW LINE

このボタンをクリックするたびに、軸が 0 から 1 になるため、スライダーは値 1 になりますが、機能しません。エラーはありません。最初のボタンをクリックしてもスライダーが更新されません。

3. その方法がわかりません。GUIが再度開くたびに、自動的に再初期化する必要があると思いました。初期化サブルーチンの例を教えてください。

4

1 に答える 1