Specify "plot box" position for tiled layout

20 views (last 30 days)
I am creating a png file from a plot and I need to specify the exact size of the figure and the plot area in pixels. I am using a tiled layout and set(gcf, 'Position', ...) doesn't seem to work.
Here a test.
The function figSave2 is a modified version of a function I found here in the Community. I added the 'InnerPosition' argument.
X = 1:100;
Y = 1:100;
figure;
tiledlayout(3,1,'TileSpacing','None');
for i=1:3
nexttile(i);
plot(X,Y,'b-');
end
figSave2(gcf,'testFileSave2.png',[2400 900],[166 0 2100 900]);
close( gcf );
function figSave2(fig,file,rez,plotbox,txt,bak)
%Save figure as image, with custom resolutions and text scaling.
% figsave(fig,file,rez,plotbox,txt,bak)
%
%Example:
% clf,text(0.1,0.5,{'This text should be';'50 pixels high';'and the image';'900W x 600H pix'},'FontSize',50)
% figSave(gcf,'Figure.jpg',[900 600],[100 100 700 400])
%
%
% https://www.mathworks.com/matlabcentral/answers/272767-how-to-set-exact-figure-size-in-pixels
if nargin<1 || isempty(fig), fig = gcf; end %figure handle
if nargin<2 || isempty(file), file = 'Figure.jpg'; end %output file name
if nargin<3 || isempty(rez), rez = [900 600]; end %resolution [horizontal vertical]
if nargin<4 || isempty(plotbox), plotbox = [100 100 700 400]; end %resolution [horizontal vertical]
if nargin<5 || isempty(txt), txt = 1; end %text scale factor
if nargin<6 || isempty(bak), bak = 0; end %dont preserve background colour
set(fig,'PaperPosition',[0 0 rez/(100*txt)],'InnerPosition',plotbox/(100*txt),'PaperUnits','inches'); %set paper size (does not affect display)
if bak
set(fig,'InvertHardcopy','off'); %preserve background colour
end
imwrite(print(gcf,'-RGBImage',['-r' num2str(100*txt,'%f')]),file) %print RGB image to file (slow)
end
The resulting plot does not have the specified offset of 166 pixels to the Y axes, it's more like 140.
How can I set the postion of the "plot box" that is made up from the three tiled plots?
  1 Comment
dormant
dormant on 8 Oct 2024
Edited: dormant on 8 Oct 2024
Also, the Y dimensions in the saved plot are totally wrong. I need the "plot box" to fill the image from top to bottom.

Sign in to comment.

Accepted Answer

Adam Danz
Adam Danz on 8 Oct 2024
> How can I set the postion of the "plot box" that is made up from the three tiled plots?
The position property for axes in a TiledChartLayout cannot be set. However, since want to control the global position that encompasses all three axes, you could set the position of the TiledChartLayout and use the full area of the tiled layout by setting padding to tight. However, this won't frame the global plot box area since the x tick and y tick labels will be within the frame.
tcl = tiledlayout(3,1,'units','pixels','position', [50 50 300 300],'padding','tight','TileSpacing','none');
ax(1) = nexttile(tcl);
ax(2) = nexttile(tcl);
ax(3) = nexttile(tcl);
box(ax,'on')
Show the position of the tiled layout with a red dashed line.
annotation('rectangle',...
'units',tcl.Units,...
'Position',tcl.Position,...
'LineWidth',2,...
'Color','r',...
'lineStyle','--')
  1 Comment
dormant
dormant on 8 Oct 2024
Thanks very much. I think I can do what I want using your information.

Sign in to comment.

More Answers (0)

Products


Release

R2024b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!