11

I have a figure with 2 plots on it. I am trying to save the figure as a png with a longer width.

%%%%%%%%%%%%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''s 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''s Contains');
grid on

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

In the last 3 lines I set the figure window such that the 2 plots are wide enough. However, when I try to save the figure, the image is its default size in which the plots are squished.

What am I missing?

SeriousTyro
  • 934
  • 3
  • 10
  • 16
  • 2
    possible duplicate of [Printing a MATLAB plot in exact dimensions on paper](http://stackoverflow.com/questions/3600945/printing-a-matlab-plot-in-exact-dimensions-on-paper), [How to save custom-sized figures in MATLAB](http://stackoverflow.com/questions/6508233/how-to-save-custom-sized-figures-in-matlab-closed) – Amro Aug 28 '11 at 14:36

2 Answers2

12

The OuterPosition figure property only changes where the figure window is on the screen; it doesn't change how it will print.

Matlab uses the PaperSize, PaperUnits, PaperPosition and similar figure properties when "printing" a figure, even when they don't really make sense, such as when producing a bitmap file. (Settings PaperUnits to pixels would be logical, but it doesn't work.)

The procedure for getting a particular image size in pixels is to set PaperPosition to some size in inches (or another physical unit) and then specify the desired resolution in dots per inch using the -r option to 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');

Some of these peculiarities are discussed in the help for the print function.

You could also try the -r0 option which tells Matlab to use the display resolution.

nibot
  • 14,428
  • 8
  • 54
  • 58
5

Following @nibot's example, I wrote the following function:

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
ellisbben
  • 6,352
  • 26
  • 43