使用plotyy时如何调整图形大小?
How to adjust figure size when using plotyy?
我正在尝试在使用 plotyy 时调整图形大小:
clc;
clear all;
t = 0:.1:4*pi;
y = sin(t);
figure(1);
set(gcf,'units','inches','renderer', 'painters');
pos = get(gcf,'pos');
set(gcf,'Units','inches',...
'Position',[pos(1) pos(2) 4 2]);
plot(t,y)
xlabel('Time(s)')
ylabel('y(t)')
title('Sin function')
legend('y=sin(t)')
axis([0 t(end) -1.5 1.5])
set(gca,...
'Units','normalized',...
'YTick',-1.5:.5:1.5,...
'XTick',0:t(end)/4:t(end),...
'FontUnits','points',...
'FontWeight','normal',...
'FontSize',9,...
'FontName','Times')
set(gca, 'Position', get(gca, 'OuterPosition') - ...
get(gca, 'TightInset') * [-1 0 1 0; 0 -1 0 1; 0 0 1 0; 0 0 0 1]);
figure(2);
set(gcf,'units','inches','renderer', 'painters');
pos = get(gcf,'pos');
set(gcf,'Units','inches',...
'Position',[pos(1) pos(2) 4 2]);
[haxes,hline1,hline2]=plotyy(t,y,t,t);
ylabel(haxes(1),'sin(t)')
ylabel(haxes(2),'45degree')
xlabel(haxes(1),'Time(s)')
title('Sin function')
set(haxes,...
'Units','normalized',...
'FontUnits','points',...
'FontWeight','normal',...
'FontSize',9,...
'FontName','Times')
set(haxes(1), 'Position', get(haxes(1), 'OuterPosition') - ...
get(haxes(1), 'TightInset') * [-1 0 1 0; 0 -1 0 1; 0 0 0 0; 0 0 0 1]-...
get(haxes(2), 'TightInset') * [0 0 0 0; 0 0 0 0; 0 0 1 0; 0 0 0 0]);
该示例表明该过程适用于 plot 但不适用于 plotyy。似乎当我使用 plot 时,TightInset 会考虑底部和顶部的文本(应该如此),但当我使用 plotyy 时它不会考虑它们。但我不明白为什么会这样以及如何解决。有什么想法吗?
[下面的代码与我对所选答案的评论有关]
figure(3);
set(gcf,'units','inches','renderer', 'painters');
pos = get(gcf,'pos');
set(gcf,'Units','inches',...
'Position',[pos(1) pos(2) 4 2]);
plot(t,y,'b');
set(gca,'YColor','b')
xlabel('Time(s)')
ylabel('y(t)')
title('Sin function')
axis([0 t(end) -1.5 1.5]);
set(gca,...
'Units','normalized',...
'YTick',-1.5:.5:1.5,...
'XTick',0:t(end)/4:t(end),...
'FontUnits','points',...
'FontWeight','normal',...
'FontSize',9,...
'FontName','Times')
axesPosition = get(gca,'Position');
hNewAxes = axes('Position',axesPosition,...
'Color','none',...
'YLim',[0 10],...
'YAxisLocation','right',...
'XTick',[],...
'Box','off');
set(gca,'YColor',[0 .5 0]);
ylabel(hNewAxes,'45degree');
hold all
plot(hNewAxes,t,t,'color',[0 .5 0]);
hold off
我个人尽量避免使用 plotyy
,因为总有一个 属性 的行为与预期不符。如果我需要,我通常会创建第二个 axes
并手动设置属性,当然是从第一个 axes
复制我需要的内容,然后链接一些属性。
如果您查看 plotyy
的代码,您会发现它的作用相同...还有一些额外的内容。
一个不错的额外功能是它如何尝试匹配两个 y
轴上的刻度,即使它们的跨度不同(但您可以复制该部分并仍然使用手动双轴解决方案)。
另一个额外的,我怀疑是你观察到的行为的原因,是它设置了监听器和回调来重新调整两个轴的 position
属性。在线的某个地方它必须终止 axes
的一些自动重新调整,因为如果您在代码中注意到,即使在您尝试手动更改 position
之前,当您称为 xlabel
和 title
(当您在标准单曲 axes
上这样做时它们通常是这样)。
这就是为什么您尝试用来重新调整 axes
的 TightInset
不起作用的原因...因为当您添加文本对象时 axes
没有重新调整,(所以垂直 TightInset
是错误的)。
现在对于你的情况,幸运的是这似乎只影响 TightInset
的垂直部分,所以一个快速的解决方法是使用 OuterPosition
属性 用于垂直部分(在从 TightInset
获得水平部分的边距后)。
所以在你的代码中,只需将你最后一次调用 set(haxes,'Position', ...)
替换为:
margin = get(haxes(1),'TightInset') * [0;0;1;0] ;
set(haxes,'OuterPosition',[-margin 0 1+margin 1])
而且一切都应该再次变紧 ;-)
我正在尝试在使用 plotyy 时调整图形大小:
clc;
clear all;
t = 0:.1:4*pi;
y = sin(t);
figure(1);
set(gcf,'units','inches','renderer', 'painters');
pos = get(gcf,'pos');
set(gcf,'Units','inches',...
'Position',[pos(1) pos(2) 4 2]);
plot(t,y)
xlabel('Time(s)')
ylabel('y(t)')
title('Sin function')
legend('y=sin(t)')
axis([0 t(end) -1.5 1.5])
set(gca,...
'Units','normalized',...
'YTick',-1.5:.5:1.5,...
'XTick',0:t(end)/4:t(end),...
'FontUnits','points',...
'FontWeight','normal',...
'FontSize',9,...
'FontName','Times')
set(gca, 'Position', get(gca, 'OuterPosition') - ...
get(gca, 'TightInset') * [-1 0 1 0; 0 -1 0 1; 0 0 1 0; 0 0 0 1]);
figure(2);
set(gcf,'units','inches','renderer', 'painters');
pos = get(gcf,'pos');
set(gcf,'Units','inches',...
'Position',[pos(1) pos(2) 4 2]);
[haxes,hline1,hline2]=plotyy(t,y,t,t);
ylabel(haxes(1),'sin(t)')
ylabel(haxes(2),'45degree')
xlabel(haxes(1),'Time(s)')
title('Sin function')
set(haxes,...
'Units','normalized',...
'FontUnits','points',...
'FontWeight','normal',...
'FontSize',9,...
'FontName','Times')
set(haxes(1), 'Position', get(haxes(1), 'OuterPosition') - ...
get(haxes(1), 'TightInset') * [-1 0 1 0; 0 -1 0 1; 0 0 0 0; 0 0 0 1]-...
get(haxes(2), 'TightInset') * [0 0 0 0; 0 0 0 0; 0 0 1 0; 0 0 0 0]);
该示例表明该过程适用于 plot 但不适用于 plotyy。似乎当我使用 plot 时,TightInset 会考虑底部和顶部的文本(应该如此),但当我使用 plotyy 时它不会考虑它们。但我不明白为什么会这样以及如何解决。有什么想法吗?
[下面的代码与我对所选答案的评论有关]
figure(3);
set(gcf,'units','inches','renderer', 'painters');
pos = get(gcf,'pos');
set(gcf,'Units','inches',...
'Position',[pos(1) pos(2) 4 2]);
plot(t,y,'b');
set(gca,'YColor','b')
xlabel('Time(s)')
ylabel('y(t)')
title('Sin function')
axis([0 t(end) -1.5 1.5]);
set(gca,...
'Units','normalized',...
'YTick',-1.5:.5:1.5,...
'XTick',0:t(end)/4:t(end),...
'FontUnits','points',...
'FontWeight','normal',...
'FontSize',9,...
'FontName','Times')
axesPosition = get(gca,'Position');
hNewAxes = axes('Position',axesPosition,...
'Color','none',...
'YLim',[0 10],...
'YAxisLocation','right',...
'XTick',[],...
'Box','off');
set(gca,'YColor',[0 .5 0]);
ylabel(hNewAxes,'45degree');
hold all
plot(hNewAxes,t,t,'color',[0 .5 0]);
hold off
我个人尽量避免使用 plotyy
,因为总有一个 属性 的行为与预期不符。如果我需要,我通常会创建第二个 axes
并手动设置属性,当然是从第一个 axes
复制我需要的内容,然后链接一些属性。
如果您查看 plotyy
的代码,您会发现它的作用相同...还有一些额外的内容。
一个不错的额外功能是它如何尝试匹配两个 y
轴上的刻度,即使它们的跨度不同(但您可以复制该部分并仍然使用手动双轴解决方案)。
另一个额外的,我怀疑是你观察到的行为的原因,是它设置了监听器和回调来重新调整两个轴的 position
属性。在线的某个地方它必须终止 axes
的一些自动重新调整,因为如果您在代码中注意到,即使在您尝试手动更改 position
之前,当您称为 xlabel
和 title
(当您在标准单曲 axes
上这样做时它们通常是这样)。
这就是为什么您尝试用来重新调整 axes
的 TightInset
不起作用的原因...因为当您添加文本对象时 axes
没有重新调整,(所以垂直 TightInset
是错误的)。
现在对于你的情况,幸运的是这似乎只影响 TightInset
的垂直部分,所以一个快速的解决方法是使用 OuterPosition
属性 用于垂直部分(在从 TightInset
获得水平部分的边距后)。
所以在你的代码中,只需将你最后一次调用 set(haxes,'Position', ...)
替换为:
margin = get(haxes(1),'TightInset') * [0;0;1;0] ;
set(haxes,'OuterPosition',[-margin 0 1+margin 1])
而且一切都应该再次变紧 ;-)