0

我想制作一个 gui,它可以导入 excel 数据并像这样绘制三个 y 轴和一个 x 轴。但与 cem 的这个答案相反,当数据改变时,我的轴没有改变。 轴不变

我没有成功缩放 y 轴,因为我不知道如何从弹出回调函数中调用 Y 数据。在我的代码中,我将问题的部分标记为 %%PROBLEM%%. 因此,如果您对此有任何提示,请与我分享。

clear all
clc
pkg load io
% Create the Gui Window which will hold all controls and relevant data.
  GuiWindow = figure()

% Static text element used as a title
  uicontrol ("style", "text", "units", "normalized", "string", "Results of Experiments",'ForegroundColor','w','BackgroundColor',[0 0.4470 0.7410],'Fontweight','bold', "horizontalalignment", "center", "position", [0.03 0.9 0.35 0.08] );
                                    
% A button for importing (excel) data
  uicontrol ("style", "pushbutton", "units", "normalized", "string", "Datei (.xlsx) mitbringen", "callback", { @pushbutton_Callback, GuiWindow }, "position", [0.03 0.8 0.35 0.08], 'tag', 'button' );

% Popupmenus for selecting appropriate X and Y axis to display in plots
  uicontrol("Style","popupmenu", "units", "normalized", "string","X", "callback", { @popupmenuX_Callback, GuiWindow }, "Position",[0.7 0.04 0.2 0.05], 'tag', 'XAxisMenu' );
  uicontrol("Style","popupmenu", "units", "normalized", "string","Y", "callback", { @popupmenuY_Callback, GuiWindow }, "Position",[0.03 0.5 0.2 0.05], 'tag', 'YAxisMenu' );
  uicontrol("Style","popupmenu", "units", "normalized", "string","Y", "callback", { @popupmenuY_1_Callback, GuiWindow }, "Position",[0.03 0.6 0.2 0.05], 'tag', 'YAxisMenu' );
  uicontrol("Style","popupmenu", "units", "normalized", "string","Y Achse", "callback", { @popupmenuY_2_Callback, GuiWindow }, "Position",[0.03 0.7 0.2 0.05], 'tag', 'YAxisMenu_2' );
  %%=============================================================================                              
  %% Functions 
  %%=============================================================================
  
  function pushbutton_Callback(hObject, eventdata, GuiWindow)

    % Read in data from file, graphically selected by user
      fileName      = uigetfile('*.xlsx');
      [num,txt,raw] = xlsread(fileName);
      header        = raw(1,:);
      Data          = xlsread(fileName);
    % Show fileName
      button   = findobj('tag', 'button');
      set( button, 'string', fileName)
    % Populate the menu items for the X and Y Axis from the excel header
      XAxisMenu = findobj( 'tag', 'XAxisMenu' );
      set( XAxisMenu, 'string', header );

      YAxisMenu = findobj( 'tag', 'YAxisMenu' );
      set( YAxisMenu, 'string', header );
          % Populate the menu items for the X and Y Axis from the excel header

      YAxisMenu_1 = findobj( 'tag', 'YAxisMenu_1' );
      set( YAxisMenu_1, 'string', header );

      YAxisMenu_2 = findobj( 'tag', 'YAxisMenu_2' );
      set( YAxisMenu_2, 'string', header );
      
    % Also store headers and data as GuiWindow app data, in case we need them again later.
      setappdata( GuiWindow, 'header', header );
      setappdata( GuiWindow, 'Data'  , Data   );

    % Plot a preliminary plot in the plot area
      XData   = Data(:, 1);
      YData   = Data(:, 1);
      Y_1Data = Data(:, 1);
      Y_2Data = Data(:, 1);

     % An 'axes' object for displaying plots in the Gui Window
      
      axes ('position', [0.45 0.25 0.5 0.5], 'tag', 'plotarea','ycolor','r'); 

     % Normalisierung for axes
      yoff = YData - min(YData);
      ynor = yoff / max(yoff);
      y1off = Y_1Data - min(Y_1Data);
      y1nor = y1off / max(y1off);
      y2off = Y_2Data - min(Y_2Data);
      y2nor = y2off / max(y2off);

      
      %% Plot the data 
      
      plot(XData, ynor, 'r','tag', 'plotobject',...
           XData, y1nor, 'g','tag','plotobject_1', ...
           XData, y2nor, 'b','tag','plotobject_2');
      grid on
      
      %% Axis inforation
      %%%%%%%%%%PROBLEM%%%%%%%
      ##How can I import YData, Y_1Data and Y_2Data from popupmenu Y Callbacks##
      nticks = 5; #Number of ticks
      
      yticks(linspace(0, 1, nticks));
      yticklabels(arrayfun(@(a, b, c) sprintf('\\color{red}%6.2f \\color{green}%6.2f \\color{blue}%6.2f', a, b, c), ...
      linspace(min(YData), max(YData), nticks), ...
      linspace(min(Y_1Data), max(Y_1Data), nticks), ...
      linspace(min(Y_2Data), max(Y_2Data), nticks), ...
      'UniformOutput', false));

  endfunction
  
  %% 2. X Axis Information from excel data import
  
  function popupmenuX_Callback( hObject, eventdata, GuiWindow )
      Axes      = findobj( 'tag', 'plotarea','-or','tag','plotobject_1' );
      Selection = get( hObject, 'value' );
      XData     = [ getappdata( GuiWindow, 'Data' )( :, Selection ) ];
      PlotObj   = findobj( 'tag', 'plotobject','-or','tag','plotobject_1','-or','tag','plotobject_2');
      set( PlotObj, 'xdata', XData )
  endfunction

  %% 3. Y Axis Information from excel data import
  
  function popupmenuY_Callback( hObject, eventdata, GuiWindow )
      Axes      = findobj( 'tag', 'plotarea' );
      Selection = get( hObject, 'value' );
      YData     = [ getappdata( GuiWindow, 'Data' )( :, Selection ) ];
      PlotObj   = findobj( 'tag', 'plotobject' );
      set( PlotObj, 'ydata', YData )
  endfunction
  

  function popupmenuY_1_Callback( hObject, eventdata, GuiWindow )
      Axes      = findobj( 'tag', 'plotarea' );
      Selection = get( hObject, 'value' );
      Y_1Data     = [ getappdata( GuiWindow, 'Data' )( :, Selection ) ];
      PlotObj   = findobj( 'tag', 'plotobject_1' );
      set( PlotObj, 'ydata', Y_1Data )
  endfunction
  
  function popupmenuY_2_Callback( hObject, eventdata, GuiWindow )
      Axes      = findobj( 'tag', 'plotarea' );
      Selection = get( hObject, 'value' );
      Y_2Data     = [ getappdata( GuiWindow, 'Data' )( :, Selection ) ];
      PlotObj   = findobj( 'tag', 'plotobject_2' );
      set( PlotObj, 'ydata', Y_2Data )
  endfunction
4

0 回答 0