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

Get subplot number from Ginputc the same way than Ginput (answer with faster Ginput)

我正在尝试用 fileexchange 上的函数 ginputc 替换函数 ginputCustom GINPUT from Jiro。我发现 ginput 第一次调用时启动非常慢。 ginputc 更快。

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

此处针对 ginput 进行了解释:

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

  figure, hAx_mine(1)=subplot(1, 3, 1); hAx_mine(2)=subplot(1, 3, 2);hAx_mine(3)=subplot(1, 3, 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, hAx_mine(1)=subplot(1, 3, 1); hAx_mine(2)=subplot(1, 3, 2);hAx_mine(3)=subplot(1, 3, 3);
  [x, y, button] = ginputc(1);
  [Lia,Locb]=ismember(gca,hAx_mine);
  disp(['Locb gives the subplot number that you have clicked: ' num2str(Locb)])

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

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

但这也不起作用。我想 ginputc 确实以某种方式改变了 gca 但经过几个小时的尝试,我还没有设法找到原因以及如何修复它。

但是...我没有放弃,而是专注于改进ginput,而不是排序ginputc。最初的目标是因为 ginput 很慢,所以为什么不尝试改进它呢?

在该函数中,当它处理新的 Matlab 工具栏时,您的速度很慢 setupFcnsetupFcn 所做的是禁用工具栏,因此当您使用 ginput.

时它不会显示

不过这个工具栏并不讨厌,为什么要隐藏它呢?所以我复制了 ginput 并将其重命名为 ginput_mine,这样我就可以像下面这样对其进行更改:

  1. 我注释了从第 221 行(禁用 AxesToolbar)到第 232 行(12 行)的代码
  2. 我还在第 268 行(Restore axestoolbar)到第 271 行(4 行)restoreFcn 评论了第二名

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

我不确定经过这种调和后,ginput 的所有功能是否仍然有效,但我认为是这样。我的工具是一个用于标记图像的注释界面,我很高兴为我的用户提供了更加流畅的界面:-)

2021 年 3 月 28 日更新: 根据 Cris 的评论,我认为我可以通过添加一个额外的步骤来改进我的解决方案。这个额外的步骤只有在你不再需要图中的工具栏时才有用。 你所做的是(使用上述解决方案)在 ginput 的开头或启动 ginput 之前添加 2 行,用 Fig 你的数字:

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

我可能会做得更快。