Specify "plot box" position for tiled layout

13 ビュー (過去 30 日間)
dormant
dormant 2024 年 10 月 8 日
コメント済み: dormant 2024 年 10 月 8 日
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 件のコメント
dormant
dormant 2024 年 10 月 8 日
編集済み: dormant 2024 年 10 月 8 日
Also, the Y dimensions in the saved plot are totally wrong. I need the "plot box" to fill the image from top to bottom.

サインインしてコメントする。

採用された回答

Adam Danz
Adam Danz 2024 年 10 月 8 日
> 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 件のコメント
dormant
dormant 2024 年 10 月 8 日
Thanks very much. I think I can do what I want using your information.

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeAnnotations についてさらに検索

製品


リリース

R2024b

Community Treasure Hunt

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

Start Hunting!

Translated by