Другое

Как изменить размер маркеров в MATLAB rltool

Узнайте, как увеличить размер маркеров полюсов и нулей в интерфейсе MATLAB rltool, используя проверенные методы настройки графиков.

Как изменить размер маркеров в rltool MATLAB?

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

matlab
set(0, 'DefaultLineMarkerSize', 8);

Однако это не влияет на маркеры в rltool. Что нужно сделать, чтобы увеличить размер маркеров полюсов и нулей в интерфейсе rltool?

Мой текущий код:

matlab
rltool(w);

После открытия rltool я хочу изменить размер моих полюсов, используя:

matlab
set(0, 'DefaultLineMarkerSize', 8);

Но этот метод не работает как ожидалось. Как правильно увеличить размер маркеров полюсов и нулей в интерфейсе rltool?

Вы можете изменить размер маркеров полюсов и нулей в интерфейсе rltool MATLAB, напрямую обращаясь к объектам графика и меняя их свойства. Подход set(0, 'DefaultLineMarkerSize', 8) не срабатывает, потому что rltool создаёт собственные объекты графика, которые не наследуют настройки по умолчанию.


Содержание


Понимание проблемы

Интерфейс rltool (SISO Design Tool) создаёт собственный графический интерфейс с встроенными графиками, которые не реагируют на стандартные настройки MATLAB, такие как DefaultLineMarkerSize. Каждый полюс и ноль отображается как отдельный объект линии с конкретными свойствами, которые необходимо целенаправленно изменить.

Согласно MATLAB Central Answers, интерфейс rltool использует иной механизм отрисовки, чем стандартные MATLAB‑графики, поэтому требуется альтернативный подход для изменения визуальных свойств.


Метод 1: Использование findobj для поиска и изменения объектов графика

Самый надёжный способ — найти объекты графика, представляющие полюсы и нули, и изменить их свойства напрямую:

matlab
% Открываем rltool с вашей системой
rltool(w);

% После открытия rltool найдём объекты графика
h = findobj(gcf, 'type', 'line');

% Определяем, какие объекты соответствуют полюсам и нулям
% Обычно полюсы и нули отображаются как линии с маркерами
for i = 1:length(h)
    % Проверяем, является ли это маркером полюса или нуля
    if ~isempty(get(h(i), 'Marker'))
        set(h(i), 'MarkerSize', 12, 'MarkerEdgeColor', 'red', 'LineWidth', 2);
    end
end

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


Метод 2: Прямой доступ к дескрипторам графика

Вы также можете получить доступ к дескрипторам графика более напрямую, изучив структуру интерфейса rltool:

matlab
% Открываем rltool
rltool(w);

% Получаем текущую фигуру и оси
fig = gcf;
axes_handles = findobj(fig, 'type', 'axes');

% Находим оси полюс‑нулевой карты (обычно первая ось)
pz_axes = axes_handles(1);

% Находим все объекты линии в полюс‑нулевой карте
line_objects = findobj(pz_axes, 'type', 'line');

% Изменяем свойства маркеров для полюсов и нулей
for i = 1:length(line_objects)
    % Проверяем, содержит ли линия маркеры (полюсы/нули)
    if ~isempty(get(line_objects(i), 'Marker'))
        set(line_objects(i), 'MarkerSize', 15, 'MarkerFaceColor', 'blue');
    end
end

Как отмечено в Electrical Engineering Stack Exchange, можно использовать команды set() для изменения свойств 'MarkerSize', 'MarkerEdgeColor' и других свойств объектов графика.


Метод 3: Ручное изменение через Инспектор свойств

Для мгновенных однократных настроек вы можете изменить маркеры вручную:

  1. Откройте rltool с вашей системой: rltool(w)
  2. Щёлкните правой кнопкой мыши по любому маркеру полюса или нуля
  3. Выберите «Открыть Инспектор свойств»
  4. В Инспекторе свойств выберите маркер
  5. В разделе «2X1 Line» найдите «MarkerSize»
  6. Измените значение на желаемый размер

Согласно MATLAB Central Answers, вы можете изменить размер маркера вручную (и другие настройки) из «Инспектора свойств», щёлкнув по любому маркеру (полюсу или нулю), а затем выбрав «2X1 Line» синего цвета рядом с «Children» слева.


Метод 4: Создание собственного интерфейса rltool

Для большего контроля вы можете создать собственный интерфейс, объединяющий функциональность rltool с настраиваемой pzmap:

matlab
% Открываем rltool, но не показываем его сразу
rltool(w);
rltool_fig = gcf;
set(rltool_fig, 'Visible', 'off');

% Получаем данные системы из rltool
[sys, info] = get rltool_fig;

% Создаём новую фигуру с настраиваемой pzmap
fig2 = figure;
pzmap(sys);
title('Настраиваемая карта полюсов и нулей');

% Теперь можно использовать стандартные методы для изменения маркеров
h = findobj(gca, 'type', 'line');
for i = 1:length(h)
    if ~isempty(get(h(i), 'Marker'))
        set(h(i), 'MarkerSize', 12, 'MarkerFaceColor', 'red');
    end
end

% Показываем обе фигуры
set(rltool_fig, 'Visible', 'on');

Альтернатива: pzmap с пользовательскими размерами маркеров

Если вам не нужен полный интерфейс rltool, вы можете использовать pzmap с пользовательским оформлением:

matlab
% Создаём вашу систему
sys = tf(w);

% Строим график с пользовательскими маркерами
figure;
h = pzmap(sys);

% Находим объекты линии, представляющие полюсы и нули
line_objects = findobj(gca, 'type', 'line');

% Изменяем свойства маркеров
for i = 1:length(line_objects)
    if contains(get(line_objects(i), 'DisplayName'), 'Pole') || ...
       contains(get(line_objects(i), 'DisplayName'), 'Zero')
        set(line_objects(i), 'MarkerSize', 12, 'MarkerEdgeColor', 'black');
    end
end

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


Лучшие практики и устранение неполадок

Частые проблемы и решения:

  1. Маркеры не обновляются: убедитесь, что код выполняется после полной загрузки rltool и его видимости.
  2. Изменяются неверные объекты: используйте get(handle, 'Marker'), чтобы убедиться, что вы целитесь в нужные объекты.
  3. Производительность при большом количестве полюсов/нулей: применяйте изменения только к нужным объектам для улучшения производительности.

Рекомендуемый рабочий процесс:

matlab
% Открываем rltool
rltool(w);

% Ждём, пока интерфейс загрузится
pause(2); % небольшая задержка для гарантии загрузки

% Применяем изменения размера маркеров
modifyRltoolMarkers();

% Определяем функцию
function modifyRltoolMarkers()
    % Находим все объекты линии в текущей фигуре
    h = findobj(gcf, 'type', 'line', 'HandleVisibility', 'on');
    
    % Изменяем только объекты с маркерами
    for i = 1:length(h)
        if ~isempty(get(h(i), 'Marker'))
            set(h(i), 'MarkerSize', 12, 'MarkerEdgeColor', 'red');
        end
    end
end

Как отмечено в ResearchGate, можно использовать set(Hz, ...), set(Hp, ...) для изменения свойств 'Color', 'Marker', 'MarkerSize' и других свойств объектов графика.


Источники

  1. MATLAB Central Answers – Изменить размер маркера в pzmap
  2. MathWorks – Документация PZPlot
  3. MathWorks – Документация pzmap
  4. Electrical Engineering Stack Exchange – Формат pzmap в Octave
  5. ResearchGate – Как изменить график полюсов и нулей в MATLAB
  6. MathWorks Central – rltool SISO Design Tool

Заключение

Изменение размеров маркеров в интерфейсе rltool MATLAB требует целенаправленного обращения к объектам графика, а не к настройкам по умолчанию. Самые эффективные подходы:

  1. Использовать findobj для поиска и изменения объектов линии, представляющих полюсы и нули.
  2. Прямой доступ к дескрипторам графика для более точного контроля.
  3. Ручное изменение через Инспектор свойств для быстрых однократных настроек.
  4. Создание собственного интерфейса, объединяющего функциональность rltool с настраиваемой pzmap.

Для стабильных результатов во всех версиях MATLAB предпочтителен подход с findobj. Не забывайте применять изменения после полной загрузки rltool, так как объекты графика должны существовать, прежде чем их можно будет изменить.

Авторы
Проверено модерацией
Модерация