сделать оси невидимыми или полностью удалить график

У меня есть графический интерфейс Matlab, который должен содержать 4 графика. Первый график должен быть обновлен, если в списке выбран другой файл. остальные 3 должны быть видны (и вычисляться) только по запросу.

Однако мне не удается сделать графики 2-4 невидимыми после того, как они были построены один раз.

Я пытался

set(handles.axesImage, 'Visible', 'off');

но это удаляет только ось, а не весь сюжет.

РЕДАКТИРОВАТЬ: Вместо того, чтобы делать вещи невидимыми, возможно ли удалить контент? Обычно я называю close(hfig);, но здесь у меня нет цифры.

Я пытался

handles2hide = [axisObj;cell2mat(get(axisObj,'Children'))]; 
delete(handles2hide);

Но это не работает для незавершенных осей (после запуска)

РЕДАКТИРОВАТЬ: я изменил код на:

axisObj = handles.axesContour;
if ishandle(axisObj)
    handles2delete = get(axisObj,'Children');
    delete(handles2delete);
    set(axisObj,'visible','off') 
end
if (isfield(handles,'contour') && isfield(handles.contour,'hColorbar'))
    delete(handles.contour.hColorbar);
    delete(handles.contour.hColorbarLabel);
end

Однако цветная полоса остается не удаленной, и handles.contour.hColorbar терпит неудачу с Invalid handle object.


person Matthias Pospiech    schedule 08.08.2012    source источник
comment
Удаление работает для меня. Возможно, вы хотите убедиться, что вы удаляете только действительные дескрипторы, т.е. delete(handles2hide(ishandle(handles2hide)))   -  person Jonas    schedule 08.08.2012
comment
Перед этим получаю ошибку: ??? Cell contents reference from a non-cell array object. в строке handles2hide = [cell2mat(get(axisObj,'Children'))];. Мне пришлось удалить axisObj из списка удаления, потому что я больше не могу рисовать на удаленной оси...   -  person Matthias Pospiech    schedule 09.08.2012
comment
Я удалил cell2mat, и теперь график удален, однако цветная полоса и цветовая метка все еще остаются. И даже если я сохраню их дескрипторы, чтобы удалить их, это не сработает, потому что удаление не удастся, потому что они не распознаются как дескрипторы.   -  person Matthias Pospiech    schedule 09.08.2012


Ответы (4)


Вы хотите скрыть не только оси, но и все их дочерние элементы:

handles2hide = [handles.axesImage;cell2mat(get(handles.axesImage,'Children'))];
set(handles2hide,'visible','off')

Cell2mat нужен только в том случае, если в handles.axesImage хранится более одного дескриптора.

Обратите внимание, что вам понадобится полный список дескрипторов, чтобы все снова стало видимым.

ИЗМЕНИТЬ

Если вы хотите удалить все оси (включая цветные полосы) и их дочерние элементы на фигуре, вы можете сделать следующее (если вам нужно исключить определенные оси, вы можете использовать setdiff в списках ручек):

ah = findall(yourFigureHandle,'type','axes')
if ~isempty(ah)
   delete(ah)
end
person Jonas    schedule 08.08.2012

Я использую это:

    set(allchild(handles.axes1),'visible','off'); 
    set(handles.axes1,'visible','off'); 

за то, что спрятал мои топоры. Я нашел решение здесь: Видимые оси выключены

person dibrut    schedule 03.01.2013

Вы использовали дескрипторы для подзаголовков и сюжетов:

h(1)=subplot(221);
    p(1)=plot(rand(10,1));
h(2)=subplot(222);
    p(2)=plot(rand(10,1));
h(3)=subplot(223);
    p(3)=plot(rand(10,1));
h(4)=subplot(224);
    p(4)=plot(rand(10,1));


set([h(2) p(2)],'visible','off')

скрывает 2-й сюжет. Однако ответ @Jonas кажется более полным. Это, конечно, проще, потому что вам не придется самостоятельно собирать детей вручную, как это сделал я здесь.

person Gunther Struyf    schedule 08.08.2012
comment
h(2)=subplot(222);plot(rand(10)); set(h(2),'visible','off') это проблема, если я правильно понимаю ОП - person Jonas; 08.08.2012
comment
@ Джонас, да, я тоже столкнулся с этой проблемой, когда расширял свои тесты ... обновить ^^ - person Gunther Struyf; 08.08.2012
comment
Я добавил подзаголовок к своему графическому интерфейсу в коде: это только испортит весь графический интерфейс и сделает все оси осей недействительными -> без дальнейшей работы (чего я не знаю) непригодной для использования. - person Matthias Pospiech; 09.08.2012

Теперь я решил это с помощью

function z_removePlots(handles)

if (isfield(handles,'image') && isfield(handles.image,'hplot'))
    if ishandle(handles.image.hplot)
        delete(handles.image.hplot);
        delete(findall(gcf,'tag','Colorbar'));
        handles.image.hplot = 0;
        set(handles.axesImage, 'Visible', 'off');
    end
end
if (isfield(handles,'contour') && isfield(handles.contour,'hplot'))
    if ishandle(handles.contour.hplot)
        delete(handles.contour.hplot);
        handles.contour.hplot = 0;
        ClearLinesFromAxes(handles.axesContour)
        set(handles.axesContour, 'Visible', 'off');
    end
end
guidata(handles.output,handles);

с участием

function ClearLinesFromAxes(axisObj)
if ishandle(axisObj)
    handles2delete = get(axisObj,'Children');
    delete(handles2delete);
end
person Matthias Pospiech    schedule 09.08.2012