Временно разверните (разверните) фигуру подзаговора - затем сверните ее обратно

Часто в Matlab мы рисуем фигуру со многими осями подзаговоров, но все они крошечные.

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

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

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

Итак, есть ли способ включить эту функцию в Matlab уже?

1 ответ

Объединяя части этих трех постов, вот что у меня есть:

h = subplot(2,2,1);
line(1:10, rand(1,10));
set(h, 'buttondownfcn', ['h=gca; hc = copyobj(h, gcf);' ...
    'set(hc, ''Units'', ''normal'',' ...
    ' ''Position'', [0.05 0.1 0.8 0.85],' ...
    ' ''buttondownfcn'', ''delete(gca)'');']);

Это не идеально, но это работает.

Нажмите на оси:

Нажмите на развернутые оси, и оно исчезнет:

Обратите внимание, что это по-прежнему позволяет панорамировать, масштабировать и "вращать 3D" результирующих осей. Выбор инструмента со стрелкой фактически вводит "Режим редактирования", поэтому лучше отменить выбор инструмента, который вы используете вместо этого. Например: если вы увеличивали масштаб, снова щелкните значок увеличения, чтобы отменить выбор инструмента. Нажатие затем "свернет" взрыв осей.

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


РЕДАКТИРОВАТЬ Изучение из этого ответа (используя uipanel чтобы не показывать другое содержимое), теперь я превратил решение в это:

gcaExpand.m:

function gcaExpand

    set(copyobj(gca, uipanel('Position', [0 0 1 1])), ...
       'Units', 'normal', 'OuterPosition', [0 0 1 1], ...
       'ButtonDownFcn', 'delete(get(gca, ''Parent''))'); 

end

gcaExpandable.m:

function gcaExpandable

    set(gca, 'ButtonDownFcn', [...
        'set(copyobj(gca, uipanel(''Position'', [0 0 1 1])), ' ...
        '    ''Units'', ''normal'', ''OuterPosition'', [0 0 1 1], ' ...
        '    ''ButtonDownFcn'', ''delete(get(gca, ''''Parent''''))''); ']);

end

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

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

Изначально я собирался написать кастомную версию subplot что применимо gcaExpandable автоматически, но это не сработало, потому что такие команды, как plot стереть ButtonDownFcn свойство (а также все остальные свойства, кроме позиции). Согласно этому ответу, мы можем избежать сброса этих свойств, изменив NextPlot в 'replacechildren', но это имеет побочные эффекты. Например, plot больше не автоматически изменяет масштаб оси. Поэтому самое чистое решение на данный момент выглядит так, как указано выше.

Другие вопросы по тегам