0

我正在使用 MATLAB 进行数据分析。在我的脚本中,我创建了具有拟合结果的图形,以便我可以快速使用拟合参数并查看它们如何改变我的最终结果。

我的问题是是否有一种简单的方法可以在丢失子图和注释的位置和大小的情况下刷新我的图形以及子图和注释。即:我希望能够在我的工作区手动定位我的图形(我使用 Linux),手动调整图形大小/位置、子图大小/位置和注释大小/位置,然后在我重新运行脚本时更新它们的内容我的装修。

我确实意识到命令 figure(...) 可以很好地做到这一点并且它可以工作,但是我遇到了问题,当我调整/移动子图和移动注释时,当我重新运行时,它们的大小/位置会丢失剧本。

我知道我可能需要为此使用子图/注释句柄,但问题是,最优雅和最简单的方法是什么?由于我需要代码在第一次运行时也能工作(即不存在图形/子图/注释),我是否需要大量的 if 子句来检查句柄是否已经存在?

我使用 MATLAB 已经有一段时间了,而且几乎同样长时间以来,我一直困扰着我不知道一种优雅的方式来做到这一点!

4

2 回答 2

2

我有两个想法:

  1. 使用“文件 > 生成代码...”功能。MATLAB 将创建一个函数,该函数通过您以交互方式进行的任何修改来重新创建图形。

  2. 手动检索所操作对象的感兴趣属性,并在重新运行脚本时再次应用它们。您可以为这些图形对象维护一个句柄列表,甚至可以 'Tag'结合使用 FINDOBJ 函数来定位这些对象。

我将用一个例子来说明后一种想法:

当脚本第一次运行时,我们让用户有机会以交互方式对图形进行更改。完成后,我们检索'Position'图形的属性以及其中包含的所有子组件。然后将这些值保存到 MAT 文件中。

现在用户调整一些参数并重新运行脚本。我们检查 MAT 文件是否存在。如果存在,我们加载保存的位置值并将它们应用于图形及其后代对象,从而将组件恢复到上次保存的状态。

此解决方案相当简单,因此如果对脚本进行更改会破坏图形句柄的层次结构,则必须删除 MAT 文件,然后再次运行脚本。

%# close all figures
close all

%# your script which creates figures
figure, plot(rand(100,1))
figure
subplot(121), plot( cos(linspace(0,6*pi,100)) )
subplot(122), image, axis image, axis ij

%# check for MAT-file
if exist('script_prefs.mat','file')
    %# load saved values
    load script_prefs.mat

    %# get opened figures, and find objects with a position property
    fig = get(0, 'Children');          %# allchild(0)
    obj = findobj(fig, '-property','position');

    try
        %# apply values to position property
        set(fig, {'Position'},figPos);
        set(obj, {'Position'},objPos);
    catch
        %# delete MAT-file
        delete script_prefs.mat
    end
else
    %# get opened figures, and find objects with a position property
    fig = get(0, 'Children');
    obj = findobj(fig, '-property','position');

    %# wait for the user to finish customizing
    waitFig = figure('Menubar','none', 'Position',[200 200 200 40]);
    h = uicontrol('Units','normalized', 'Position',[0 0 1 1], ...
        'String','Done?', 'Callback','uiresume(gcbf)');
    uiwait(waitFig); 
    close(waitFig);

    %# get position property of figures and tagged objects
    figPos = get(fig, 'Position');
    objPos = get(obj, 'Position');

    %# save values to file
    save script_prefs.mat figPos objPos
end
于 2011-09-17T02:11:42.453 回答
0

我认为你的意思是你想自己刷新情节,而不是别的。

执行 aplot()时,指定输出参数以检索行句柄。然后,当您想要绘制不同的数据时,手动调整该线句柄'XDataYData

lh = plot(xdata,ydata);

%# do some calculations here
...

%# calculated new values: newX and newY
set(lh, 'XData', newx, 'YData', newy);

这同样适用于您想要刷新但不重新创建的任何其他内容 - 获取与图形对象对应的句柄并在低级别手动更新其属性。

于 2011-09-16T19:36:37.947 回答