以与 Ginput 相同的方式从 Ginputc 获取子图编号以更快的 Ginput 回答

问题描述

我试图用在 fileexchange 上找到的函数 ginput 替换函数 ginputcCustom GINPUT from Jiro。我发现 ginput 第一次调用时启动很慢。 ginputc 更快。

我在 ginput 中使用的一项功能无法通过 ginputc 进行复制。当鼠标点击它时,我得到了子图编号。

此处针对 ginput 进行了说明: get-subplot-number-from-ginput

但为了更简单,这里有一些简单的代码来复制功能

  figure,hAx_mine(1)=subplot(1,3,1); hAx_mine(2)=subplot(1,2);hAx_mine(3)=subplot(1,3);
  [x,y,button] = ginput(1);
  [Lia,Locb]=ismember(gca,hAx_mine);
  disp(['Locb gives the subplot number that you have clicked: ' num2str(Locb)])
 

如果您在 ginputc 中尝试相同的操作,无论您单击哪个子图,它都会给出最后一个子图:

  figure,button] = ginputc(1);
  [Lia,hAx_mine);
  disp(['Locb gives the subplot number that you have clicked: ' num2str(Locb)])

一个选项可以将斧头作为 ginputc 的额外输出

  ...
  [x,button,ax] = ginputc(1);
  [Lia,Locb]=ismember(ax,hAx_mine);
  ...

但这也行不通。我想 ginputc 确实以某种方式改变了 gca,但经过几个小时的尝试,我还没有找到原因以及如何解决它。

解决方法

然而……我并没有放弃,而是没有对ginputc进行排序,而是专注于改进ginput。最初的目标是因为 ginput 非常慢,所以为什么不尝试改进它?

在该函数中,当处理新的 Matlab 工具栏时,setupFcn 的速度很慢。 setupFcn 的作用是禁用工具栏,以便在您使用 ginput 时它不会出现。

然而这个工具栏并不是很烦人,为什么要隐藏它呢?因此,我将 ginput 复制并重命名为 ginput_mine,以便我可以对其进行如下更改:

  1. 我评论了从第 221 行(禁用 AxesToolbar)到第 232 行(12 行)的代码
  2. 我还在第 268 行(恢复轴工具栏)到第 271 行(4 行)的 restoreFcn 中评论了第二名

它的作用是停止 ginput 以将 toolbarVisible 设置为关闭(并在 2. 恢复工具栏)。这导致更快的功能。我还注意到它的效果更好,因为它改进了我的点击注册,而不是错过了很多点击。

我不确定通过这种调整,ginput 的所有功能是否仍然有效,但我认为是这样。我的工具是一个标注图像的注释界面,我真的很高兴为我的用户让它变得更加流畅:-)

2021 年 3 月 28 日更新: 根据 Cris 的评论,我想我可以通过添加额外的步骤来改进我的解决方案。仅当您不再需要图中的工具栏时,此额外步骤才有用。 您所做的是(使用上述解决方案)在 ginput 的开头或在启动 ginput 之前添加 2 行,并在图中显示:

set(Fig,'MenuBar','none')
set(Fig,'ToolBar','none')

我可能会做得更快。