I am working on a GUI in Matlab. I have an axes there, and two buttons. Pushing the button1 I load an Excel sheet in it (Contains 3 columns and various number of rows - always). I need to store the data in a variable, then pressing button2 I want to plot the data (I want to be able to specify which column will be plotted). I'm struggelling with passing the data insine button1 to a variable. Could you please give me a hint?
This is the code:
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[filename, pathname] = uigetfile('MultiSelect','on');
if isequal(filename,0) || isequal(pathname,0)
return
end
guidata(hObject, handles);
fullpathname = strcat(pathname, filename);
set(handles.text3,'String', fullpathname);
fileID = fopen(strcat(pathname, filename), 'r'); % read-only permission
handles.fileData = fscanf(fileID,'%d');
handles = guidata(hObject);
handles.y = 'HERE I WANT TO STORE THE DATA.';
guidata(hObject, handles);
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
handles = guidata(hObject);
handles.x = handles.y
guidata(hObject, handles);
plot(handles.x);
grid on

6 Comments

Adam
Adam on 10 Feb 2017
Edited: Adam on 10 Feb 2017
This line looks suspicious:
handles.x = handles.y
Why would you ever want to do that at the start of your 2nd pushbutton?
Also what data exactly is it you want to store in handles.y? You already have your handles.fileData which seems to contain the data you read in.
Your question is titled 'Plotting in Matlab GUI' so I am assuming that the reading in of the data is not part of the question, otherwise it is a different question independent of plotting.
Also don't overdo the calls to
guidata( hObject, handles )
It doesn't especially do any harm apart from take time needlessly, but you only need it at the end of a callback normally, after you have set some data on the handles structure, so that this handles structure is written to the GUI in-place of the one you had at the start of the callback.
So there is no need to put this on the first line of a callback as you haven't edited the 'handles' struct at all before that.
Franta Cymorek
Franta Cymorek on 10 Feb 2017
Edited: Franta Cymorek on 10 Feb 2017
By pressing button2, I want to plot the data. Data are stored in an Excel sheet. I want to choose which column will be plotted. Respectivly, in handle.y store the loaded data. Later, in handle.x I want to specify which column.
And yes, reading is part of it, but I assume I have done it correctly (hopefully).
Adam
Adam on 10 Feb 2017
So what is handles.fileData then? If that is loaded in correctly can't you just choose your column from that?
You have access to handles.fileData in pushbutton2 callback so I still don't understand what handles.y needs to contain.
Franta Cymorek
Franta Cymorek on 10 Feb 2017
Edited: Franta Cymorek on 10 Feb 2017
GUI has two buttons. Button1: Load data Button2: Plot ECG Data Pressing Button1 loads the data, pressing Button2 plots selected data. Inside a code of Button2, I want to specify which column. Why? Because later I will be customizing it for plotting all 3 columns (3 ECG signals). And reason why storing it inside a variable is due to clarity, because I am working on a bigger project and later it will be usefull.
Could you please give me any hint how to solve this out?
Surely
col = 2;
data = handles.fileData(:,2);
is all you need if your data is loaded in correctly?
It's still not what I meant, but thanks for your help.

Sign in to comment.

 Accepted Answer

Hi, the approach using guidata to store and retrieve data is correct. The general structure should be like
function dataimport_Callback(hObject, eventdata, handles)
x = 0:100;
y = -100:0;
handles.x =x;
handles.y =y;
guidata(hObject, handles) % here you store x and y in "handles"
function drawing_Callback(hObject, eventdata, handles)
plot(handles.x,handles.y)
What problem are you having exactly? With the above workflow using guidata(hObject) to retrieve data and guidata(hObject, handles) to store data in handles you should be good to go.

1 Comment

Franta Cymorek
Franta Cymorek on 10 Feb 2017
Edited: Franta Cymorek on 10 Feb 2017
By pressing button2, I want to plot the data. Data are stored in an Excel sheet. I want to choose which column will be plotted. Respectivly, in handle.y store the loaded data. Later, in handle.x I want to specify which column.

Sign in to comment.

More Answers (0)

Categories

Find more on Interactive Control and Callbacks in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!