Как удалить несколько осей графика, сделанных с помощью подзаголовка на scilab

как дела. Я весь день пытаюсь сделать следующее: я разрабатываю ПИД-регулятор и в зависимости от того, сколько данных я хочу проанализировать, я показываю только один график или четыре графика на одном рисунке (этот последний множественный график сделан с подзаголовком ).

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

Более подробное объяснение проблемы следующее: если я выбираю несколько графиков, а затем хочу один график, то я не знаю, как удалить четыре оси, чтобы очистить фигуру, не закрывая ее, поэтому, когда я хочу активировать простой plot, то программа стирает только один из четырех графиков и печатает простой график поверх оставшихся трех, в то время как оставшиеся три подграфика остаются видимыми. Ниже приведен фрагмент кода, который вызывает у меня проблемы:

grafico=sistem_graf;
disp(grafico);
if(isdef('aa')==%T);
    scf(aa);
    delete(get("current_axes"));
    disp("aa");
end
if(isdef('bb')==%T);
    scf(bb);
    delete(get("current_axes"));
    disp("bb");
end
if(isdef('cc')==%T);
    scf(cc);
    delete(get("current_axes"));
    disp("cc");
end
if(isdef('dd')==%T);
    scf(dd);
    delete(get("current_axes"));
    disp("dd");
end

select ventana
case 0
    tipoG=0;
    plot2d(T,graffta);
    xtitle('Ω(S)/R(S): Respuesta al escalón (Sistema original)','t [s]','Vel [rpm]'); 
    legend(['Original';'C/control P';'C/Control PI';'C/Control PID']);
    aa=get("current_axes");
    aa.axes_bounds = [1/3 0 2/3 1];
case 1
    tipoG=1;        
//        delete(get("current_axes"));        
    plot(T,[graffta;sist_P_ZN;sist_PI_ZN;sist_PID_ZN]);
    xtitle('Ω(S)/R(S): Respuesta al escalón','t [s]','Vel [rpm]'); 
    legend(['Original';'C/control P';'C/Control PI';'C/Control PID']);
    aa=get("current_axes");
    aa.axes_bounds=[1/3 0 2/3 1];
case 2
    tipoG=2;        
    //delete(get("current_axes"));  
    subplot(421);
    plot(T,[graffta;sist_P_ZN;sist_PI_ZN;sist_PID_ZN]);
    xtitle('Ω(S)/R(S): Respuesta al escalón','t [s]','Vel [rpm]'); 
    legend(['Original';'C/control P';'C/Control PI';'C/Control PID']);
    aa=get("current_axes");
    aa.axes_bounds=[1/3,0,1/3,1/2]
    subplot(422);
    plot2d(T,(kt*kp/(j*la))*(1/(afta*bfta))*(1+(1/(afta-bfta))*(bfta*exp(-afta*T)-afta*exp(-bfta*T))));
    xtitle('Ω(t)','t [s]','Vel [rpm]');
    bb=get("current_axes");
    bb.axes_bounds=[2/3,0,1/3,1/2];
    subplot(423);
    plot2d(T,(kt/(j*la))*(1/(afta*bfta))*((1/(afta-bfta))*(bfta*afta*exp(-bfta*T)-afta*bfta*exp(-afta*T))));
    xtitle('Variación de velocidad angular dΩ/dt','t [s]','Ac. [rpm/s^2]');
    cc=get("current_axes");
    cc.axes_bounds=[1/3,1/2,1/3,1/2];
    subplot(424);
    plot(T,[sist_P_ZN;sist_PI_ZN;sist_PID_ZN]);
    xtitle('Controladores','t [s]','Vel [rpm]');
    legend(['C/control P';'C/Control PI';'C/Control PID']);
    dd=get("current_axes");
    dd.axes_bounds=[2/3,1/2,1/3,1/2];
end

четыре if(isdef(variable_name)) никогда не работают, потому что, когда программа входит в функции, эти переменные еще не существуют, они создаются после графиков с подзаголовком.

Если графические свойства отображаются из меню «Правка» рисунка, тогда отображаются все дочерние оси, но если я попытаюсь получить оси, например,

a=get(sistem_graf.Axes(1))

затем отображается консольный дисплей, в котором говорится, что свойство Axes не существует, поэтому я не знаю, как решить проблему.

Пожалуйста помоги!

Заранее спасибо.

Обновление от 06.03.2021:

Я нашел способ, чтобы поведение, которое мне нужно, работало на 90%, оно терпит неудачу только тогда, когда я перехожу от подробного сюжета к простому сюжету (стирает один график), но в обратном направлении он работает нормально, я изменил весь код перед выбором ventana на следующее

if(imps(1) ~= -1)
    if(size(imps) == 1)
        sca(imps(1));
        disp(imps(1));
        delete(get("current_axes"));
    elseif(size(imps) > 1)
        sca(imps(1));
        delete(get("current_axes"));
        sca(imps(2));
        delete(get("current_axes"));
        sca(imps(3));
        delete(get("current_axes"));
        sca(imps(4));
        delete(get("current_axes"));
    end
end

и заполнил массив, содержимое которого представляет собой все оси, построенные в последний раз, когда функция была вызвана, этот массив возвращается из функции в глобальную переменную, и, наконец, эта глобальная переменная передается функции при следующем вызове и присваивается локальной переменной имп.

Я думаю, что это какое-то сумасшествие, но, видимо, scilab не внедрил подход к статической переменной.


person vram    schedule 02.06.2021    source источник


Ответы (1)


Если я понял вашу проблему, небольшой пример ниже должен вам помочь:

function fun(nb)
    ch = gcf().Children;
    delete(ch(ch.type=="Axes"))
    t = linspace(0,1,100);
    if nb==1
        plot(t,t)
    else
        for i=1:nb
            subplot(2,2,i)
            plot(t,t.^i)
        end
    end
endfunction
clf
uicontrol("style","pushbutton","units","normalized","Position",[0.1 0.1 0.4 0.1],"string","one plot","callback","fun(1)");
uicontrol("style","pushbutton","units","normalized","Position",[0.5 0.1 0.4 0.1],"string","four plots","callback","fun(4)");

Я думаю, что механизм, который вам не хватало, заключается в следующем:

ch = gcf().Children;
delete(ch(ch.type=="Axes"))

то есть что-то, что позволяет удалить оси графика и сохранить элементы управления пользовательским интерфейсом. Вышеупомянутая конструкция использует логическое индексирование. Здесь ch.type=="Axes" — это вектор логических значений с компонентами i равными истине, когда поле type соответствующего компонента ch(i) равно Axes. Тогда ch(ch.type=="Axes") является подмножеством компонентов ch, таких что логический индекс имеет значение true. Следовательно, наконец, подмножество компонентов ch относится к типу Axes.

person Stéphane Mottelet    schedule 03.06.2021
comment
Спасибо @Stephane Mottelet, но выдержит ли такое назначение выход из функции? Я спрашиваю об этом, потому что после простого сюжета или подробного сюжета (четыре подзаговора) программа выходит из функции и снова вызывает функцию, только когда я нажимаю кнопка построения системы - person vram; 04.06.2021
comment
Mottelet Я только что попробовал ваше предложение, но, видимо, я подтвердил свой последний комментарий. Я думаю, что теги не переживают выход из функции, в которой они созданы - person vram; 04.06.2021
comment
Я постараюсь лучше объяснить текущую проблему, я последовал вашему ответу, и теперь у осей есть тег, функция завершается, и основная программа берет на себя управление. Затем из основной программы я снова вызываю функцию, но когда я пытаюсь найти теги, созданные ранее внутри функции, эти теги не найдены, и графики все еще отображаются на рисунке. - person vram; 04.06.2021
comment
Появилась новая информация о некоторых достижениях по стиранию сюжетов, читайте со строки с надписью Обновление от 06.03.2021 - person vram; 04.06.2021
comment
Просто чтобы быть уверенным: вы не можете просто использовать clf, чтобы очистить фигуру, потому что у вас есть графики и элементы управления пользовательским интерфейсом, вот и все? Я имею в виду, что в зависимости от выбора, сделанного в uicontrols, у вас есть различное количество графиков на рисунке (следовательно, вам нужно стирать предыдущие графики каждый раз, когда выбор отличается)? - person Stéphane Mottelet; 04.06.2021
comment
Еще раз спасибо, Стефан, именно эти две строки кода сэкономили около 15 строк кода, но есть кое-что, что я не совсем понимаю в строке delete(ch(ch.type==Axes)), я знаю, что это предложение стирает только оси, но я не до конца понимаю код, точнее я не понимаю, почему -ch.type==Axes- в круглых скобках - person vram; 05.06.2021
comment
Я обновил ответ, чтобы объяснить функцию логического индексирования Scilab. - person Stéphane Mottelet; 06.06.2021
comment
Спасибо, Стефан, вы очень помогли, но у меня есть еще один вопрос: такой способ написания предложения с применением ch(ch.type==Axes) является характеристикой scilab или стандартным способом написания предложений в ООП? меня немного смущает тот факт, что я вижу результат логической операции в качестве аргумента для переменной ch, ​​так как я пришел из C и не слишком много кодировал в ООП, вот что заставило меня спросить вас раньше - person vram; 07.06.2021
comment
Это общая черта языков с динамической типизацией, таких как Matlab, Octave, Scilab, Julia. См., например. blogs.mathworks.com/loren/2013/02 /20/ - person Stéphane Mottelet; 07.06.2021
comment
Что ж, еще раз большое спасибо, Стефан. - person vram; 07.06.2021