Как обновить аннотации и вспомогательные сюжеты по вызовам функций в MATLAB - PullRequest
0 голосов
/ 16 сентября 2011

Я использую MATLAB для анализа данных. В своих сценариях я создаю фигуры с подходящими результатами, чтобы я мог быстро поиграть с подходящими параметрами и посмотреть, как они изменяют мои конечные результаты.

Мой вопрос заключается в том, существует ли простой способ, позволяющий просто обновить мои фигуры вместе с сюжетами и аннотациями без потери позиций и размеров субплотов и аннотаций. Т.е. я хотел бы иметь возможность вручную размещать свои фигуры на своем рабочем пространстве (я использую Linux), вручную настраивать размер / положение фигуры, размеры / позиции подзаговоров и размеры / позиции аннотаций, а затем обновлять их содержимое, когда я перезапущу сценарий, который подходит мне.

Я понимаю, что команда figure (...) делает это хорошо, и это работает, но у меня проблема в том, что когда я изменяю размер / перемещаю субплоты и перемещаю аннотации, они теряют размеры / позиции, когда я перезапущу сценарий.

Я знаю, что мне, вероятно, нужно использовать для этого маркеры подзаговора / аннотации, но вопрос в том, какой самый элегантный и простой способ сделать это? Поскольку мне нужно, чтобы код также работал при первом запуске (т. Е. Пока нет фигур / подзаговоров / аннотаций), понадобится ли много предложений if, чтобы проверить, существуют ли уже дескрипторы?

Я уже давно пользуюсь MATLAB, и почти одинаково долго меня беспокоило, что я не знаю элегантного способа сделать это!

Ответы [ 2 ]

2 голосов
/ 17 сентября 2011

У меня было две идеи:

  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
0 голосов
/ 16 сентября 2011

Я так понимаю, вы имеете в виду, что хотите обновить сами графики, но не что-нибудь еще.

Когда вы выполняете plot(), укажите выходной аргумент для получения дескриптора строки.Затем, когда вы хотите построить другие данные, вручную отрегулируйте ручку этой строки 'XData и YData:

lh = plot(xdata,ydata);

%# do some calculations here
...

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

. Это также относится ко всему, что вы хотите обновить, но не восстановить - получитеобрабатывать соответствующий графический объект и вручную обновлять его свойства на низком уровне.

...