【问题标题】:Renumber MATLAB figure without saving and opening .fig file重新编号 MATLAB 图而不保存和打开 .fig 文件
【发布时间】:2012-05-09 09:38:46
【问题描述】:

在 MATLAB R2011b 中,我有一个脚本,它明确指定了一个图形编号(例如,图 1)并在其上绘图。我希望保持这个情节打开并使用不同的参数再次运行脚本,以便我可以直观地比较新的和以前的情节。

如何重命名前一个图(例如图 2),以便新图不会覆盖它,从而允许两个图都可见,而无需

  • 修改脚本,或
  • 将上一个图窗另存为 .fig 文件,然后作为另一个图窗重新打开

来自两者

  1. 命令行和
  2. 使用图窗的 GUI?

【问题讨论】:

    标签: matlab matlab-figure


    【解决方案1】:

    您可以使用getobj 将一个图形的内容复制到另一个图形:

    % get handle of the old figure
    oldFigHandle = gcf;
    
    % create new figure 
    newFigHandle = figure+1;
    
    % copy the contents from one figure the other
    copyobj(get(oldFigHandle , 'children'), newFigHandle);
    

    可以使用setget 命令复制其他属性:

    set(newFigHandle, 'color', get(oldFigHandle , 'color'));
    

    【讨论】:

    • 非常感谢,H.Muster。它有效,但并非所有属性都被复制,例如图形背景颜色。我可以手动设置,但有没有办法自动复制所有内容?
    • 我不知道一次复制所有属性的方法,但您可以分别复制每个属性,例如背景:copyobj(get(oldFigHandle , 'background'), newFigureHandle);。有关所有属性,请参阅 get(oldFigHandle)
    • 当我得到“名称‘背景’不是类‘图’实例的可访问属性。”时,我认为您的意思是“颜色”。使用“颜色”我得到“对象图 [1] 不能是父图 [1] 的子图”,即使使用“子图”有效。
    • 你是对的,我错了,copyobj 只适用于句柄。请改用set(newFigureHandle), 'color', get(oldFigHandle , 'color')
    • 谢谢!修正了一个小错字:set(newFigureHandle, 'color', get(oldFigHandle, 'color')),即第一个“)”应该移到最后。
    【解决方案2】:

    根据 H.Muster 的回答,我写了这个函数来克隆一个图:

    %% Clone a figure
    %  clone_figure()     - Clone the current figure to a new figure
    %  clone_figure(N)    - Clone the current figure to figure N
    %  clone_figure(0, M) - Clone figure M to a new figure
    %  clone_figure(N, M) - Clone figure M to a figure N
    function clone_figure(new_index, old_index)
        % Get handle of original figure
        if (exist('old_index', 'var'))
            if (not(ishandle(old_index)))
                error('myApp:argChk', ['Figure ',num2str(old_index),' undefined']);
            end
            figure(old_index);
        end
        old_handle = gcf;
        % Get handle of clone
        if (exist('new_index', 'var') && new_index)
            if (new_index < 0)
                error('myApp:argChk', ['Index ',num2str(new_index),' invalid']);
            end
            figure(new_index);
        else
            figure;
        end
        new_handle = gcf;
        % Copy figure's contents and properties
        copyobj(get(old_handle, 'Children'), new_handle);
        copyobj(get(old_handle, 'CurrentAxes'), new_handle);
        set(new_handle, 'Alphamap', get(old_handle, 'Alphamap'));
        set(new_handle, 'CloseRequestFcn', get(old_handle, 'CloseRequestFcn'));
        set(new_handle, 'Color', get(old_handle, 'Color'));
        set(new_handle, 'Colormap', get(old_handle, 'Colormap'));
        set(new_handle, 'CurrentPoint', get(old_handle, 'CurrentPoint'));
        set(new_handle, 'DockControls', get(old_handle, 'DockControls'));
        set(new_handle, 'FileName', get(old_handle, 'FileName'));
        set(new_handle, 'IntegerHandle', get(old_handle, 'IntegerHandle'));
        set(new_handle, 'InvertHardcopy', get(old_handle, 'InvertHardcopy'));
        set(new_handle, 'KeyPressFcn', get(old_handle, 'KeyPressFcn'));
        set(new_handle, 'KeyReleaseFcn', get(old_handle, 'KeyReleaseFcn'));
        set(new_handle, 'MenuBar', get(old_handle, 'MenuBar'));
        set(new_handle, 'Name', get(old_handle, 'Name'));
        set(new_handle, 'NextPlot', get(old_handle, 'NextPlot'));
        set(new_handle, 'NumberTitle', get(old_handle, 'NumberTitle'));
        set(new_handle, 'PaperUnits', get(old_handle, 'PaperUnits'));
        set(new_handle, 'PaperOrientation', get(old_handle, 'PaperOrientation'));
        set(new_handle, 'PaperPosition', get(old_handle, 'PaperPosition'));
        set(new_handle, 'PaperPositionMode', get(old_handle, 'PaperPositionMode'));
        set(new_handle, 'PaperSize', get(old_handle, 'PaperSize'));
        set(new_handle, 'PaperType', get(old_handle, 'PaperType'));
        set(new_handle, 'Pointer', get(old_handle, 'Pointer'));
        set(new_handle, 'PointerShapeCData', get(old_handle, 'PointerShapeCData'));
        set(new_handle, 'PointerShapeHotSpot', get(old_handle, 'PointerShapeHotSpot'));
        set(new_handle, 'Position', get(old_handle, 'Position'));
        set(new_handle, 'Renderer', get(old_handle, 'Renderer'));
        set(new_handle, 'RendererMode', get(old_handle, 'RendererMode'));
        set(new_handle, 'Resize', get(old_handle, 'Resize'));
        set(new_handle, 'ResizeFcn', get(old_handle, 'ResizeFcn'));
        set(new_handle, 'SelectionType', get(old_handle, 'SelectionType'));
        set(new_handle, 'ToolBar', get(old_handle, 'ToolBar'));
        set(new_handle, 'Units', get(old_handle, 'Units'));
        set(new_handle, 'WindowButtonDownFcn', get(old_handle, 'WindowButtonDownFcn'));
        set(new_handle, 'WindowButtonMotionFcn', get(old_handle, 'WindowButtonMotionFcn'));
        set(new_handle, 'WindowButtonUpFcn', get(old_handle, 'WindowButtonUpFcn'));
        set(new_handle, 'WindowKeyPressFcn', get(old_handle, 'WindowKeyPressFcn'));
        set(new_handle, 'WindowKeyReleaseFcn', get(old_handle, 'WindowKeyReleaseFcn'));
        set(new_handle, 'WindowScrollWheelFcn', get(old_handle, 'WindowScrollWheelFcn'));
        set(new_handle, 'WindowStyle', get(old_handle, 'WindowStyle'));
        set(new_handle, 'WVisual', get(old_handle, 'WVisual'));
        set(new_handle, 'WVisualMode', get(old_handle, 'WVisualMode'));
        set(new_handle, 'ButtonDownFcn', get(old_handle, 'ButtonDownFcn'));
        set(new_handle, 'Clipping', get(old_handle, 'Clipping'));
        set(new_handle, 'CreateFcn', get(old_handle, 'CreateFcn'));
        set(new_handle, 'DeleteFcn', get(old_handle, 'DeleteFcn'));
        set(new_handle, 'BusyAction', get(old_handle, 'BusyAction'));
        set(new_handle, 'HandleVisibility', get(old_handle, 'HandleVisibility'));
        set(new_handle, 'HitTest', get(old_handle, 'HitTest'));
        set(new_handle, 'Interruptible', get(old_handle, 'Interruptible'));
        set(new_handle, 'Parent', get(old_handle, 'Parent'));
        set(new_handle, 'Selected', get(old_handle, 'Selected'));
        set(new_handle, 'SelectionHighlight', get(old_handle, 'SelectionHighlight'));
        set(new_handle, 'Tag', get(old_handle, 'Tag'));
        set(new_handle, 'UIContextMenu', get(old_handle, 'UIContextMenu'));
        set(new_handle, 'UserData', get(old_handle, 'UserData'));
        set(new_handle, 'Visible', get(old_handle, 'Visible'));
        % from get(gcf) but skip CurrentCharacter, CurrentObject, BeingDeleted, Type
    end
    

    【讨论】:

      【解决方案3】:

      刚刚与 Mathworks 员工交谈,并被告知更好的解决方案是将图形的“HandleVisibility”参数设置为“关闭”以保护它。例如,要保留图 1 和图 2,请执行

       set(1:2, 'HandleVisibility', 'off')
      

      然后,MATLAB 会将对这些图的任何引用映射到新图,以使原始图(包括工具设置)保持不变。

      虽然这并不能完全回答问题,但它实现了我想要做的。

      【讨论】:

      • 也复制一个图形是否停靠,例如图 1 到图 3,做 set(3, 'WindowStyle', get(1, 'Windowstyle'))。 (或者,执行 set(0, 'DefaultFigureWindowStyle', 'Docked') 以停靠所有新图形。)
      【解决方案4】:

      http://www.weizmann.ac.il/matlab/techdoc/ref/figure.html

      您只需将句柄保存到current figure

      h = [];
      for i = 1:NumGraphs
          h(i) = gcf;
          figure;
      
          %Your code to create the next graph here
      end
      

      然后取回一个特定的图表:

      figure(h(i));
      

      【讨论】:

      • 谢谢,丹。当我执行“h(i) = gcf;”时,我得到“下标索引必须是真正的正整数或逻辑。”大概我被视为 sqrt(-1)。尝试“h = gcf;”相反,它所做的只是返回具有相同数字的原始图形(图1);如果我现在在图 1 上绘图,我会失去原来的情节。我想要做的是将图 1 重命名为图 2,这样当我绘制到图 1 时,原始图被保留。
      • 是的,首先将 i 声明为变量,因此 i = 1。我假设您想在循环或其他方式中执行此操作,只需将 i 替换为您想要的数字即可。但请务必将每个图形存储在不同的 h 索引中。
      猜你喜欢
      • 2012-08-07
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多