Показатель экономии Matlab с предопределенным размером

У меня есть фигура с двумя графиками на ней. Я пытаюсь сохранить фигуру как png с большей шириной.

%%%%%%%%%%%%First%%%%%%%%%%%%%%%%%%
a=figure('Name','First Structure');
load C:\Users\William\workspace\P5\FirstAdd.txt
n=FirstAdd(:,1);
t=FirstAdd(:,2);
subplot(1,2,1);
plot(n,t);
xlabel('n');
ylabel('Time');
title('First Structure' Add');
grid on

load C:\Users\William\workspace\P5\FirstContains.txt
n=FirstContains(:,1);
t=FirstContains(:,2);
subplot(1,2,2);
plot(n,t);
xlabel('n');
ylabel('Time');
title('First Structure' Contains');
grid on

rect=[250,250,1080,480];
set(a, 'OuterPosition',rect);
print(a,'-dpng','First Structure.png');

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

Что мне не хватает?

Ответ 1

Свойство OuterPosition изменяется только там, где на экране отображается окно с рисунком; он не изменяет способ его печати. ​​

Matlab использует PaperSize, PaperUnits, PaperPosition и подобные свойства фигуры при "печати" фигуры, даже если они действительно не имеют смысла, например, при создании растрового файла. (Настройки PaperUnits до pixels будут логичными, но это не сработает.)

Процедура получения определенного размера изображения в пикселях - установить PaperPosition на некоторый размер в дюймах (или на другой физический блок), а затем указать желаемое разрешение в точках на дюйм, используя опцию -r для print

r = 150; % pixels per inch
set(gcf, 'PaperUnits', 'inches', 'PaperPosition', [0 0 1080 480]/r);
print(gcf,'-dpng',sprintf('-r%d',r), 'bar.png');

Некоторые из этих особенностей обсуждаются в справке print.

Вы также можете попробовать опцию -r0, которая сообщает Matlab использовать разрешение дисплея.

Ответ 2

Следуя примеру @nibot, я написал следующую функцию:

function save_as_png(handle, filename, dpi, width, height);
    set(handle, 'PaperUnits', 'inches', 'PaperPosition', [0 0 width height] / dpi);
    print(handle, '-dpng', ['-r' num2str(dpi)], filename);
end