2016-03-16 30 views
2

我很困惑如何調整大小在matlab中使用兩個座標軸的圖。我在結果中發現行爲不一致,具體取決於我是在調試器中單步執行圖形生成代碼(正常工作),還是一次全部運行。在非交互模式下調整Matlab座標軸意外行爲

例如,在下面的函數,我連接我的兩個軸的位置屬性:

  • 如果我把最後一行斷點,單步執行它,第一軸的位置因爲它應該是
  • ,如果我跑,一次就全部,它不會改變,並得到與第二軸

,這是什麼原因錯位自動改變?

我正在使用2015B,如果這件事。

function graph_test 

% set up a horizontal bar plot with a scattre plot on a secondary x-axis 
% at the top 
barh(1:10) 
ax1 = gca; 
set(ax1,'Box','off'); 
ax2 = axes('XAxisLocation','top','Color','none','Position', ax1.Position); 
linkaxes([ax1 ax2],'y'); 
linkprop([ax1 ax2],'Position'); 
set(ax2,'Ytick',[]); 
hold on; 
scatter(ax2,[1:-.1:.1],[1:10]); 
xlabel(ax1,'bottom axis'); 
xlabel(ax2,'top axis'); 


% set title 
% we need to set this on second axis so that it does 
% not overlap with axis legend 
% the secondary axis is not auto resized as per matlab docs 

title(ax2,'My graph'); 

% resize ax2 manually 
ax2.OuterPosition(4) = 1-ax2.OuterPosition(1); 

end 

回答

2

的問題是,你正在聽的Position變化而你明確地更新OuterPosition。在OuterPosition中所做的更改最終會返回到Position中的更改,但是如果處理器或呈現器繁忙,則無法將更改傳播回來(並通知偵聽器),直到處理器空閒。

爲了解決這個問題,你可以明確告訴MATLAB在使用drawnow更改OuterPosition之後立即刷新所有排隊的事件。這將導致Position更新並通知所有潛在的收聽者,在您的情況下,這將導致更新Positionax1

ax2.OuterPosition(4) = 1 - ax2.OuterPosition(1); 
drawnow nocallbacks 

通過它與調試器步進時,你看不到這種現象的原因是,在那個時間點,MATLAB的解釋是空閒的,並且能夠處理實時的所有圖形事件。