How to change the subplot positioning in an existing figure?

38 次查看(过去 30 天)
Dear experts,
a while ago I created a figure with two subplots in the configuration subplot(1,2,x) (one row, two columns). I saved the figure as 'fig' file for later use. Now I would prefer the plots to be in subplot(2,1) (two rows, one column) configuration. I only have the .fig file and have no access to the relevant data to replot the figure.
Is there a way the accomplish this?
I opened the figure and tried the following:
hF = gcf;
hSub11 = subplot(1,2,1);
hSub12 = subplot(1,2,2);
nF = figure;
hSub21 = subplot(2,1,1);
copyobj(allchild(hSub11),hSub21)
hSub22 = subplot(2,1,2);
copyobj(allchild(hSub12),hSub22)
But besides the legends, titles and axis labels are missing, the plots show white spaces on top and bottom or left and right of the figure, especially when being resized.
Does anyone have an advice or an overall better solution for me?
Thank you very much! (I am using MATLAB 2014b)
  3 个评论
Lenwo
Lenwo 2017-6-25
Thanks for your reply! That's an good idea, I will try this. I hope things won't get more complicated since I am using contour plots.
dpb
dpb 2017-6-25
Can you build a sample that duplicates this that can post that folks can play with easily?
I've not tried Jan's idea; I can see why it didn't do what you expected exactly as is, but it may be able to be made to do so...I'll poke around little and try something.

请先登录,再进行评论。

采纳的回答

Jan
Jan 2017-6-25
编辑:Jan 2017-6-25
This swaps the positions of the two axes:
hFig = gcf;
hAxes = findobj(allchild(hFig), 'flat', 'Type', 'axes');
axesPos = get(hAxes, 'Position');
set(hAxes(1), 'Position', axesPos{2});
set(hAxes(2), 'Position', axesPos{1});
[EDITED] Thismove the first axes to the subplot(2,1,1) position, the 2nd to (2,1,2):
hFig = gcf;
hAxes = findobj(allchild(hFig), 'flat', 'Type', 'axes');
hSub = subplot(2,1,1);
set(hAxes(1), 'Position', get(hSub, 'Position'));
delete(hSub);
hSub = subplot(2,1,2);
set(hAxes(2), 'Position', get(hSub, 'Position'));
delete(hSub);
Please try it and explain, how the legends, white spaces etc. are effects.
Did you try to use the property editor? Open the figure, activate the toolbar, click on the arrow and move the objects around or resize with the mouse.
  5 个评论
Lenwo
Lenwo 2017-6-26
编辑:Lenwo 2017-6-26
Hey Jan and dpb, thank you very much, it worked out for me. I combined your answers and rescaled the axes since the countour legends were cut off. That's what I finally came up with:
hFig = gcf;
hAxes = findobj(allchild(hFig), 'flat', 'Type', 'axes');
hTempFig = figure;
for i=1:2, hAxRef(i)=subplot(2,1,3-i); end % create reference positions
set(hAxes,{'position'},{hAxRef.Position}.')
delete(hTempFig);
axPosition = hAxes(1).Position;
set(hAxes(1), 'Position', [axPosition(1) axPosition(2) axPosition(3)-0.15 axPosition(4)]);
axPosition = hAxes(2).Position;
set(hAxes(2), 'Position', [axPosition(1) axPosition(2) axPosition(3)-0.15 axPosition(4)]);
I bet there is a more efficient way for the rescaling part, but it works just fine!
Thanks again!!
dpb
dpb 2017-6-26
编辑:dpb 2017-6-26
Welcome, Jan got me to realize it would work that way; I initially was thinking about the subplot behavior that would delete the underlying axes if another occludes an existing one's position -- but at the lower level of directly manipulating the 'position' vectors there's no checking that that occurs...

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Axes Appearance 的更多信息

产品

Community Treasure Hunt

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

Start Hunting!

Translated by