首页 > 解决方案 > 以与 Ginput 相同的方式从 Ginputc 获取子图号(以更快的 Ginput 回答)

问题描述

我正在尝试用 fileexchange 上的函数替换该函数ginputginputc来自 Jiro 的自定义 GINPUT。我发现ginput 第一次调用时启动速度很慢。ginputc是比较快的。

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

此处对此进行了解释ginputget-subplot-number-from-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但经过几个小时的尝试,我还没有找到原因以及如何解决它。

标签: matlabmatlab-figuredata-annotationsginput

解决方案


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

在那个函数中setupFcn,当它处理新的 Matlab 工具栏时,你有一个慢的。什么setupFcn是禁用工具栏,以便在您使用ginput.

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

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

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

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

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

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

我可能会做得更快。


推荐阅读