2015-01-31 3 views
0

Я пытаюсь настроить размер фигуры при использовании 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]); 

пример показывает, что процедура работает хорошо для сюжета, но не для plotyy. Кажется, что когда я использую сюжет, TightInset учитывает текст внизу и сверху (как следует), но он не учитывает их, когда я использую сюжет. Но я не понимаю, почему это так и как это исправить. Есть идеи?

[Код ниже связан с моим комментарием к выбранному ответу]

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 

ответ

0

Лично я стараюсь избегать plotyy, потому что всегда есть свойство, которое не ведет себя, как ожидалось. Если мне нужно, я обычно создаю второй axes и задаю свойства вручную, скопировав то, что мне нужно, с первого axes, конечно, и связывая несколько свойств.

Если вы посмотрите на код для plotyy, вы увидите, что он делает то же самое ... с некоторыми дополнительными.

Приятный дополнительный способ - это как бы согласовать тики на обеих осях y, даже когда их диапазон отличается (но вы можете скопировать эту часть и по-прежнему использовать ручное решение с двумя осями).

Еще одна дополнительная информация, и, как я подозреваю, несет ответственность за поведение, которое вы наблюдаете, заключается в том, что он устанавливает слушатели и обратный вызов для перенастройкисвойств обеих осей. Где-то в очереди он должен убить некоторую автоматическую переадресацию axes, потому что, если вы заметили в своем коде, даже если вы не попытались вручную изменить position, axes не были перенастроены при вызове xlabel и title (как это обычно бывает при выполнении что на стандартном одном axes).

Вот почему TightInset вы пытаетесь использовать, чтобы перенастроить ваш axes не работает ... потому что 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]) 

и все должно быть снова плотно ;-)

+0

Отлично! Я также попробовал другое предложение установить другую ось вручную. Удивительно, но не нужно было настраивать положение, чтобы совсем не повредить! Я совершенно не знаю, почему это произошло «волшебным образом». Вы знаете, почему это произошло? (Так как я не могу поставить код здесь, я добавил его к вопросу) – capadocia

Смежные вопросы