Может ли MATLAB динамически генерировать, сохранять, а затем загружать оси в объект осей управления? - PullRequest
1 голос
/ 17 ноября 2010

Отредактировано для ясности:

У меня есть графический интерфейс, который управляет сценарием, который генерирует приблизительно 40 графиков.Я хочу отобразить любой данный график в окне графического интерфейса пользователя, выбрав его номер в раскрывающемся списке.Проблема заключается в том, что для создания графиков требуется некоторое время, поэтому я бы предпочел сделать их один раз, а затем загрузить их по мере необходимости в объект оси в графическом интерфейсе.Каждый из графиков имеет разные свойства, метки, легенды и т. Д.

Я попытался сгенерировать фигуры, а затем сохранить их и попытаться загрузить их в объект осей в графическом интерфейсе, но это не сработало.1006 * Если я изначально создаю графики, используя объект осей в графическом интерфейсе в качестве целевых осей, я не могу сохранить график и легенды и т. Д.

Возможно ли это в MATLAB?

Ответы [ 3 ]

1 голос
/ 17 ноября 2010

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

Самый простой способ справиться с этой проблемой - не помещать объект осив ваш графический интерфейс, но использовать графический интерфейс с двумя окнами, где одно окно имеет все элементы управления, а другое - это фигура, на которую вы наносите материал.Это выгодно по нескольким причинам: сохранение / загрузка становится проще, у вас есть доступ к панели инструментов рисунка, и вы можете изменять размеры фигуры и т. Д. По своему усмотрению (изменение размера графического интерфейса пользователя обычно затруднительно).Вы можете сохранить дескриптор по осям фигуры в структуре дескриптора GUI через SETAPPDATA и получить доступ к нему через GETAPPDATA .Обратите внимание, что вы захотите поставить небольшую проверку в начале обратного вызова построения, где вы проверите, существует ли фигура с помощью ISHANDLE на дескрипторе осей, и откройте новую фигуру, если проверка вернется false.

Если вы действительно хотите иметь объект оси в своем графическом интерфейсе, проще всего просто сохранить данные x и y, а также другие свойства графика, которые пользователь может настроить.(независимо от того, включена или выключена легенда, или свойство position легенды), чтобы вы могли восстановить его на лету.

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

0 голосов
/ 17 ноября 2010

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

Один из способов решения этой проблемы - использовать UIPANELs и 'Visible' свойство графических объектов.Вы можете создать одну панель для каждого элемента меню, добавить оси для каждой из них вместе с любыми данными, которые вы хотите отобразить, а затем просто переключать видимость панелей с помощью команды SET вместо того, чтобы заново планировать все, когда появляется новый элемент меню.выбран.Вот пример:

hFigure = figure;                     %# Create a figure

hPanelA = uipanel('Parent',hFigure);  %# Add panel A to the figure
hAxesA = axes('Parent',hPanelA);      %# Add an axes to panel A
plot(hAxesA,1:10,rand(1,10),'r');     %# Plot a red line
text(5,0.5,'hello','Parent',hAxesA);  %# Plot some text
legend(hAxesA,'red line');            %# Add a legend

hPanelB = uipanel('Parent',hFigure);  %# Add panel B to the figure
hAxesB = axes('Parent',hPanelB);      %# Add an axes to panel B
plot(hAxesB,1:10,rand(1,10),'b');     %# Plot a blue line
text(5,0.5,'world','Parent',hAxesB);  %# Plot some text
legend(hAxesB,'blue line');           %# Add a legend

Теперь вы можете сделать панель A видимой и панель B невидимой, выполнив следующие действия:

set([hPanelA hPanelB],{'Visible'},{'on'; 'off'});

И вы можете сделать обратное (скрыть панель A ипокажите панель B), выполнив это:

set([hPanelA hPanelB],{'Visible'},{'off'; 'on'});

Вы должны заметить, что переключение между двумя панелями с двумя отдельными осями происходит быстро и плавно, что, скорее всего, было бы не так, если бы вам пришлось стирать иРеплотируйте данные в одном наборе осей каждый раз, когда вы хотите посмотреть на новый график.Создание всех графических объектов, которые вам нужны, при создании графического интерфейса, а затем изменение видимости (или других свойств) при необходимости с помощью команды SET обеспечивает более эффективный графический интерфейс.

Также обратите внимание, чтовы все еще можете изменять свойства объекта, даже когда они невидимы, поэтому (продолжая из моего примера выше) я мог бы сделать что-то вроде этого:

set([hPanelA hPanelB],{'Visible'},{'on'; 'off'});  %# Hide panel B
set(hPanelB,'BackgroundColor','b');                %# Change the color of panel B
set([hPanelA hPanelB],{'Visible'},{'off'; 'on'});  %# Show panel B

И теперь вы должны увидеть, что цвет фона панели B синий,Если вы также сохранили дескрипторы в нанесенных строках и тексте, вы можете обновить их новыми значениями, прежде чем снова сделать их видимыми.

0 голосов
/ 17 ноября 2010

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

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

close all

subplot(2,1,1)
subplot(2,1,2)

hAxes = get(gcf, 'Children')

get(hAxes(1)) %shows axes properties of one axes obj
get(hAxes(2)) %shows axes properties of the other

set(hAxes(1), 'YTickLabel', ['a';'b';'c';'d';'e';'f']) %set an axis property
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...