Скопируйте рисунок и легенду в графический интерфейс matlab

#matlab

#matlab

Вопрос:

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

 function main_plot_exp_Callback(hObject, eventdata, handles)

f_tmp = figure('visible','off');

set(f_tmp,'Units', 'Normalized', 'OuterPosition', [0 0 1 1]); 

copyobj(handles.main_plot,f_tmp);

set(gca,'Position',[0.16125 0.09 0.684375 0.84],...
    'GridLineStyle','--');


print(f_tmp, '-djpeg', 'name', '-r300');
close(f_tmp);
 

обычно работает как шарм, ЗА исключением проклятой легенды, которая, похоже, теряется в процессе. есть предложения или идеи? заранее спасибо!

(побочный вопрос: есть ли что-нибудь вроде «gcf» только для ОПРЕДЕЛЕННОГО, а не текущего рисунка?)

Комментарии:

1. Почему вы делаете копию main_plot рисунка в f_tmp ? Почему бы просто не сделать print(handles.main_plot,'-djpeg', 'name', '-r300'); ? Что касается вашего побочного вопроса, если у вас есть дескриптор рисунка (который вы можете использовать в handles.main_plot), вы можете использовать этот дескриптор.

2. потому что я добавляю текстовое поле к рисунку (которого нет в графическом интерфейсе), а затем экспортирую. ваше предложение выдает «Дескриптор графического дескриптора должен быть фигурой». сообщение об ошибке также, поскольку handles.main_plot является дескриптором оси, что является проблемой для меня, имеющего дело с графическими изображениями. я не знаю о способе получения фигурных дескрипторов здесь…

3. Поскольку handles.main_plot это дескриптор оси, попробуйте export_fig использовать код из обмена файлами MATLAB — export_fig . Это может сделать то, что вы хотите.

Ответ №1:

Я попробовал вашу процедуру и не столкнулся с проблемой (мой matlab: 8.2.0.701 (R2013b))

Лучшее, что вы могли бы сделать следующим образом

 hSome = findobj(handles.main_plot);
get(hSome,'Tag')
 

Результаты должны давать одну строку «легенды». Если нет, замените findobj на findall . В противном случае ваш дескриптор легенды хранится где-то в другом месте, и вам нужно глубже изучить свой графический интерфейс.

Комментарии:

1. думаю, это в графическом интерфейсе deepspace… ваша процедура либо выдает пустые строки, либо: ‘LegendColorbarLayout’,’LegendColorbarLayout’,’LegendDeleteProxy’ с помощью findall . я получил 8.0.0.783 2012b … на самом деле я не пытаюсь получить отдельную легенду, а скорее получить ВСЕ настройки из main_plot сразу. спасибо за помощь, хотя

2. Я не знаю, сколько у вас времени (я предполагаю, что мало), но я бы посоветовал вам создать все свои графические интерфейсы с нуля, используя ориентированное объектное программирование. В Интернете есть очень хороший пример такого графического интерфейса: blogs.mathworks.com/pick/2012/11/02 /…

Ответ №2:

У меня была такая же проблема с потерей легенды в процессе. Лучшее, что я мог сделать, чтобы преодолеть это, — это воссоздать легенду на новом рисунке перед ее сохранением. Вот пример кода, который я использовал:

 % find the legend(s) - I suppose in the following that there is only one legend in the GUI
L1 = findobj(handles.figure1,'tag','legend'); % where handles.figure1 is the GUI figure handle

% retrieve the legend strings and location
legendstr=get(L1,'String');
legendloc=get(L1,'Location');

% handle to the GUI axes to be saved
ax = handles.axes1;   

% create a new figure
fig = figure('Units','centimeters','outerposition',[2 2 17 17]);

% copy the GUI axes into the new figure
new_axes = copyobj(ax, fig);

set(new_axes,'Units','normalized','Position',[0.1 0.1 0.8 0.8]);

% recreate the legend
legend(new_axes,legendstr,'Location',legendloc);

%save the files in .fig and .format files (.format = .jpg, .png, ...)
hgsave(fig,[pname '' filename]);
hgexport(fig, fname, hgexport('factorystyle'),'Format', format)
close(fig);
 

Ответ №3:

Предполагая, что оси называются main_plot, я обнаружил, что на легенду ссылается: legend(handles.main_plot)

Таким образом, вам нужно будет скопировать легенду с ее родительскими осями (в качестве векторного ввода) на новый рисунок: copyobj([handles.main_plot legend(handles.main_plot],f_tmp);