MATLAB:从按钮循环创建的复选框中导出数据

MATLAB: export data from checkboxes created by a loop for from a pushbutton

在编写代码创建 window 后,其中包含一个图形和一些 (ii) 复选框加载一些数据(每个复选框一个数据),我想仅在复选框匹配时通过按钮导出它们一组数据打勾

首先,我创建了(在 "il_raffa" 的帮助下)一些需要灵活的复选框(ii:循环的输入),从我的代码中可以总结出原则通过类似的东西:

图形界面window

N=500;
M=300;

handles.fig=figure('Units', 'Pixels','Position',[100 100 N M]);

handles.axes=axes('Units', 'Pixels','tag','axes_tag','Position',[25 25 N-200     M-50]);

for ii=1:4; %input exemple

   handles.check{ii}=uicontrol('style','checkbox','string', ...
      ['Display_file_' num2str(ii)],'tag',['c_b_' num2str(ii)], ...
      'position',[N-150 M/2-ii*20 100 25],'callback','plot_sel_cb(handles.axes)');
end

复选框回调

function plot_sel_cb(ax_h)
cb_id=get(gcbo,'string')
cb_pos=get(gcbo,'position')
val=get(gcbo,'value')
path=get(gcbo,'userdata');
axes(ax_h)
hold on

if val

   x=1:10;
   y=[1:10].*cb_pos(2)/100;
   plot(x,y,'color,[rand(1) rand(1) rand(1)])
   legend(cb_id)

    set(h,'tag',cb_id)


else 
    delete(findobj('tag',cb_id))
end

根据这段代码,我想创建一个按钮,该按钮仅使用勾选复选框中的 [x,y] 来创建一个包含所有这些数据的变量。

第二个问题是,我还没有设法为 "plot(x,y,'color,[rand(1) rand(1) rand(1)])" 创建一个图例,在勾选与数据匹配的复选框时添加名称 "cb_id"。

帮助

谢谢

让我从你的第二期开始:添加一个图例。

checkbox callback中根据复选框的status(选中/未选中)添加/删除行。

要在图例中添加项目非常简单,您只需将所需的字符串(在您的情况下为 cb_id)插入 cellarray 并将其设置为 legend函数。

当您取消选中一个复选框而保留另一个复选框时,要从图例中删除一个项目可能会有点困难。

考虑到您似乎没有那么多线条可以绘制,最简单的(即使不是 "optimal")方法可能是更改 checkbox callbak 的工作方式。

你可以对其进行编码,以便每次调用它时,它:

  • 删除之前绘制的所有线条
  • 删除当前图例
  • 根据复选框状态绘制(循环)所有线条
  • 创建正确的图例

在下文中,您可以找到已实现此方法的回调 uin 的更新版本。

为了交换数据​​(例如复选框的句柄),您可以将它们分配给图形的 userdata 属性.

例如,它可能用作结构,因此您可以将数据分配给它的字段。

例如,您在主函数中有 ii 个复选框句柄;使用以下代码,您可以分配复选框的数量及其句柄:

figure_data.n_cb=ii;
figure_data.cb_handles=handles.check;
set(handles.fig,'userdata',figure_data)

我已经在您可以在下面找到的所有函数中使用了这个方法。

关于第一个问题:pushbutton 提取 (x,y) 值。

您可以在主函数中添加 pushbutton uicontrol(根据复选框)。

pushbutton是:

  • 开始时禁用(在主 GUI 功能中)
  • 至少选中一个复选框时启用(在复选框回调中)
  • 否则禁用(在复选框回调中)

有几种方法可以获取 (x,y) 值,其中两种是: - 您可以将它们分配给复选框回调中的变量(在这种情况下您实际上不需要按钮) - 您可以利用这样一个事实,即轴上绘制的每条线的数据也存储在图句柄的属性 xdataydata 中。

axes uicontrol 您可以通过 children 属性 访问它们:它返回轴上绘制的每个元素的句柄,因此您可以编写一个循环遍历这些处理并获取数据。

因为,原则上,您的数据可能大小不同(与 checkbox_1 相关的图可能比 checkbox_2 的图有更多的数据),您不应该使用矩阵来保存所有这些。

最好使用cellarraystruct

的数组

在下面您可以找到主函数的更新版本,其中添加了 pushbutonpushbutton callback.

主要GUI功能

N=500;
M=300;
% Added ",'toolbar','figure'" to show the figure toolbar (zoom, rotate,
% ...)
handles.fig=figure('Units', 'Pixels','Position',[100 100 N M],'toolbar','figure');


handles.axes=axes('Units', 'Pixels','tag','axes_tag','Position',[25 25 N-200 M-50]);

for ii=1:4; %input exemple

% Changed definition of "handles.check" from "cellarray" to "array"
% Added setting of each checkbox "userdata" to the value of loop index (a
% way to automatically identify the checkboxes)
%
%    handles.check{ii}=uicontrol('style','checkbox','string', ...
   handles.check(ii)=uicontrol('style','checkbox','string', ...
      ['Display_file_' num2str(ii)],'tag',['c_b_' num2str(ii)], ...
      'position',[N-150 M/2-ii*20 100 25],'userdata',ii, ...
      'callback','plot_sel_cb(handles.axes)');

end
% Add the pushbutton (it is disabled at creation), it will be enabled by
% the checkbox callback if any checkbox set
handles.button=uicontrol('style','pushbutton','string','Export data', ...
   'enable','off','position',[N-150 M/2+50 100 25], ...
   'callback','export_data');
%
% Store info into figure "userdata"
%    number of checkboxes
%    status of the checkboxes (all unchecked at the beginning)
%    pushbuton handle
figure_data.n_cb=ii;
figure_data.selected_cb=zeros(1,ii);
figure_data.cb_handles=handles.check;
figure_data.button=handles.button;
%
set(handles.fig,'userdata',figure_data)

已更新checkbox callback

function plot_sel_cb(ax_h)
% Get the checkbox id
cb_id=get(gcbo,'userdata');
% Check if current checkbox has been checked (val=1) or unchecked (val=0)
val=get(gcbo,'value');
% Get the number of checkbox in the GUI
figure_data=get(gcf,'userdata');
n_cb=figure_data.n_cb;
cb_handles=figure_data.cb_handles;

% path=get(gcbo,'userdata');
axes(ax_h);

% Clear axes (delete plot) and delete the legend
p_h=get(gca,'children');
if(~isempty(p_h))
   delete(p_h);
   delete(figure_data.leg_h)
end

hold on

% Update current checkbox status in the checkbox info
figure_data.selected_cb(cb_id)=val;
% Initialize legend string, counter and plot handles array
legend_str={};
cnt=0;
p_h=[];
% Loop throught the checkbox to plot
for i=1:n_cb
   if(figure_data.selected_cb(i))
      cnt=cnt+1;
      x=1:10;
      % Get checkbox position (to generate exmple data to plot)
      cb_pos=get(cb_handles(i),'position');
      % Get checkbox id
      curr_cb=get(cb_handles(i),'userdata');
      y=[1:10].*cb_pos(2)/100;
      % Plot and store plot handle
      p_h(cnt)=plot(x,y,'color',[rand(1) rand(1) rand(1)],'linewidth',2);
      % Set the plot tag to the index of the checkbox (it will be used in
      % the pushbutton callback as index of the cellarray in which to store
      % the data plottd
      set(p_h(cnt),'userdata',curr_cb)
      % Get the string of the current chceckbox
      cb_string=get(cb_handles(i),'string');
      % Replace "_" with "_-" for the correct visualization
      cb_string=strrep(cb_string,'_','_-');
      % Build the legend's string
      legend_str{cnt}=cb_string;
   end
end
% Add the updated legend and store its handle in figure_data
if(~isempty(legend_str))
   figure_data.leg_h=legend(p_h,legend_str);
end
% Manage "Export data" pushbutton enabling
if(any(figure_data.selected_cb))
   set(figure_data.button,'enable','on')
else
   set(figure_data.button,'enable','off')
end
% Update figure data
set(gcf,'userdata',figure_data);

按钮回调

function export_data
% Get plotted data and set store them into a variable
%    the vaaible can be either a "cellarray" or an array of "struct"
% The data of each line plotted are stored in the "xdata" and "ydata"
% property of each "children" of the axis
p_h=get(gca,'children');
n_plot=length(p_h);
% Loop through the children to retreive the data
for i=1:n_plot
   cb_id=get(p_h(i),'userdata');
   x_data=get(p_h(i),'xdata');
   y_data=get(p_h(i),'ydata');
   % Create the cellarray "exported_data_cell_array"
   exported_data_cell_array{cb_id}=[x_data;y_data];
   % Create the struct "exported_data_struct"
   exported_data_struct(cb_id).checkbox_id=cb_id;
   exported_data_struct(cb_id).x_data=y_data;
   exported_data_struct(cb_id).y_data=y_data;
end
% Store the extractged data into th e figure_data
figure_data=get(gcf,'userdata');
figure_data.exported_data_cell_array=exported_data_cell_array;
figure_data.exported_data_struct=exported_data_struct;
set(gcf,'userdata',figure_data);

希望这对您有所帮助。