【问题标题】:Matlab - How to make a figure current? How to make an axes current?Matlab - 如何使图形成为当前的?如何使轴电流?
【发布时间】:2012-09-28 08:00:13
【问题描述】:

如果f 是图形句柄,我想在其上使用plot3(..),就像我使用plot(..) 一样,但这不起作用:

>> plot3(f, t, real(Y), imag(Y))
Error using plot3
Vectors must be the same lengths.

然后我想出这样做的方法是:

  1. 首先使相关图当前

  2. 然后使用plot3(..)函数。

我可以使用gcf 找到当前人物正在使用的内容,但是如何(通过其句柄)使人物成为当前人物?

【问题讨论】:

  • 顺便说一句,如果我们没有对轴对象的引用,那么我们可以(1)aa = findobj(gcf, 'type', 'axes'),然后(2)cellfun(@(x) disp(x), get(aa, 'position')),从中我们可以知道哪个子图是哪个,然后 (3) axes(aa(2)) 例如,使第二个轴对象 current.
  • (虽然对于数字,当前状态似乎随着焦点而变化。)

标签: matlab matlab-figure


【解决方案1】:

实际上就像将f 反馈回figure(..) 命令一样简单:

figure(f)    %Makes the figure current.

另外,如果我做了这样的事情:

f = figure('IntegerHandle','off');    % With unique, non-reusable handle.
top = subplot(2, 1, 1);
bot = subplot(2, 1, 2);

然后我可以通过发出这样的命令使 axes topbottom 成为当前的:

subplot(top);

这也有效:

axes(top);

但是这两种类型的句柄不能混合使用:axes(..)subplot(..) 作用于坐标轴句柄,而figure(..) 作用于图形句柄。

【讨论】:

  • 该死,Matlab 有时很烂。说真的,Mathworks,为什么不能将 axes_handle 参数添加到 plot3
【解决方案2】:

这个方法有我个人的喜好:

set(0, 'currentfigure', f);  %# for figures
set(f, 'currentaxes', axs);  %# for axes with handle axs on figure f

因为这些命令是它们自己的文档。我发现

figure(f)

第一次阅读时会感到困惑-您是否创建了一个新人物?还是仅仅激活现有的? -> 需要更多地阅读上下文。

【讨论】:

  • 另一个优点是Matlab并没有明确地将可见性设置为'on',而是保留了以前的图形可见性。
  • 我同意你的观点 WRT 可读性,但第一行真的更具可读性吗? WTF是0?我讨厌 Matlab。
  • @ensignr 每种编程语言都有其怪癖,无需开始抨击。好的是0 在最近的 MATLAB 中已被替换为 groot - 图形根对象。更有意义。
【解决方案3】:

给出句柄名称,给你一个小例子

  f1 = figure;
  imshow(image1);
  f2 = figure;
  imshow(image2);
  % edit image 1
  figure(f1);
  text(2,3,'done');

【讨论】:

    【解决方案4】:

    虽然其他人已经为您提供了您所要求的内容(如何制作轴或绘制当前轴)。我首选的处理方式是在调用 plot3 时明确指定绘图的父级。

    如果您查看documentation,您会看到您可以将父轴指定为函数的第一个参数。如果您在示例中尝试这样做,但您提供了 figure 的句柄而不是 axes

    f = figure()
    ax = axes('Parent', f)
    im = plot3(ax, X, Y, Z);
    

    或者,我更喜欢显式解决方案

    im = plot3(X, Y, Z, 'Parent', ax)
    

    这个显式的父参数/值规范的好处是它被所有图形对象所接受。像plotplot3 这样的函数实际上是包装line 的功能的辅助函数,并允许首先传递父级的约定。无论您使用的是更高级别的函数(plotplot3imshow)还是更低级别的对象(lineimage 等),参数/值方法都被广泛接受

    这里的两个好处是您消除了 MATLAB 试图找出放置绘图的位置的开销,而且它还可以防止 MATLAB 不得不更改当前显示的图形,从而强制重新渲染这是 MATLAB 的一个最慢的任务。

    【讨论】:

      猜你喜欢
      • 2017-09-20
      • 1970-01-01
      • 2011-12-26
      • 2015-08-14
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多