0

データ分析にMATLABを使用しています。スクリプトでは、フィット結果を使用してフィギュアを作成し、フィットパラメータをすばやく試して、最終結果がどのように変化するかを確認できるようにします。

私の質問は、サブプロットと注釈の位置とサイズを失うことなく、サブプロットと注釈とともに図を更新できる簡単な方法があるかどうかです。つまり、ワークスペースにフィギュアを手動で配置し(Linuxを使用)、フィギュアのサイズ/位置、サブプロットのサイズ/位置、注釈のサイズ/位置を手動で調整してから、スクリプトを再実行したときにコンテンツを更新できるようにしたいと思います。私のフィッティングを行います。

コマンドfigure(...)がこれをうまく実行し、機能することはわかっていますが、サブプロットのサイズ変更/移動と注釈の移動を行うと、サイズ/位置が失われるという問題があります。スクリプト。

私はおそらくこれにサブプロット/注釈ハンドルを使用する必要があることを知っていますが、問題は、これを行うための最もエレガントで簡単な方法は何ですか?初めて実行するときにも機能するコードが必要なので(つまり、図/サブプロット/注釈がまだ存在しない)、ハンドルがすでに存在するかどうかを確認するために、多くのif句が必要になりますか?

私はかなり長い間MATLABを使用してきましたが、ほぼ同じくらい長い間、これを行うためのエレガントな方法がわからないことに悩まされてきました。

4

2 に答える 2

2

私には2つのアイデアがありました:

  1. 「ファイル>コードの生成...」機能を使用します。MATLABは、インタラクティブに行った変更を加えて図を再作成する関数を作成します。

  2. 操作されたオブジェクトの対象となるプロパティを手動で取得し、スクリプトを再実行するときにそれらを再度適用します。これらのグラフィックスオブジェクトのハンドルのリストを維持するか 'Tag'、FINDOBJ関数と組み合わせてそのようなオブジェクトを見つけることもできます。

後者のアイデアを例を挙げて説明します。

スクリプトを初めて実行するときに、ユーザーがインタラクティブに図を変更できるようにします。完了したら、'Position'Figureとその中に含まれるすべての子コンポーネントのプロパティを取得します。これらの値は、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

プロット自体を更新したいが、他には何も更新したくないという意味だと思います。

を実行するときはplot()、出力引数を指定して行ハンドルを取得します。XData次に、別のデータをプロットする場合は、そのラインハンドルを手動で調整しますYData

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 に答える