#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);