2013-09-29 52 views
2

我有一個MATLAB gui中的2個圖,我想將它們鏈接在一起,因此一個圖上的縮放放大了其他圖。MATLAB GUI縮放多個圖

與我在鏈接圖上看到的類似問題不同,我的x數據或y數據都由任一圖共享,但它是相關的。


我的數據包括飛機在5秒鐘內飛過的飛機的高度。

劇情1:土地的高度

y: height = [10,9,4,6,3]; 
x: time = [1,2,3,4,5]; 

劇情2:土地座標

y: latitude = [10,20,30,40,50]; 
x: longitude = [11,12,13,14,15]; 

如果用戶放大Plot 1 x軸,例如示出了前3秒的航班我想放大Plot 2的x軸和y軸,所以只有前3個經度&經度緯度座標&顯示緯度數組。

這可能嗎?

回答

3

您將需要一個函數來執行高度&時間到緯度&的映射,然後根據映射的值設置限制。

下面的函數來完成這個工作:

function syncLimits(masterAxes,slaveAxes) 
% Sync a slave axes that is plot related data. 
% Assumes each data point in slave corresponds with the data point in the 
% master at the same index. 

% Find limits of controlling plot 
xRange = xlim(masterAxes); 
% Get x data 
x1Data = get(get(masterAxes,'children'),'XData'); 
% Find data indices corresponding to these limits 
indices = x1Data >= xRange(1) & x1Data <= xRange(2); 
if any(indices) 
    % Set the limits on the slave plot to show the same data range (based 
    % on the xData index) 
    x2Data = get(get(slaveAxes,'children'),'XData'); 
    y2Data = get(get(slaveAxes,'children'),'YData'); 
    minX = min(x2Data(indices)); 
    maxX = max(x2Data(indices)); 
    minY = min(y2Data(indices)); 
    maxY = max(y2Data(indices)); 
    % Set limits +- eps() so that if a single point is selected 
    % x/ylim min/max values aren't identical 
    xlim(slaveAxes,[ minX - eps(minX) maxX + eps(maxX) ]); 
    ylim(slaveAxes,[ minY - eps(minY) maxY + eps(maxY) ]); 
end 

end 

然後,您可以得到高度對時間的情節調用此函數時,它被放大或平移。

height = [10,9,4,6,3]; 
time = [1,2,3,4,5]; 

latitude = [10,20,30,40,50]; 
longitude = [11,12,13,14,15]; 

% Plot Height v Time 
h1 = figure; 
a1 = gca; 
plot(time,height); 
title('Height v Time'); 


% Plot Lat v Long 
figure; 
a2 = gca; 
plot(longitude, latitude); 
title('Lat v Long') 

% Set-up Callback to sync limits 
zH = zoom(h1); 
pH = pan(h1); 
set(zH,'ActionPostCallback',@(figHandle,axesHandle) syncLimits(axesHandle.Axes,a2)); 
set(pH,'ActionPostCallback',@(figHandle,axesHandle) syncLimits(axesHandle.Axes,a2)); 

如果通過函數直接生成您的地塊作爲您能巢syncLimits功能和使用的時間,經緯度&長數據的代碼會更簡單。您也可以將這些數據傳遞到syncLimits函數中,該函數再少一點代碼,但只需編寫一次syncLimits(並且我已經完成了它!)。

1

如果你已經發布,x軸確實是相同的,即使它們不是相同的變量名,所以你仍然可以使用linkaxes鏈接它們,它只連接限制,而不是使用的變量繪圖。

h_height = figure(1); 
plot(h_height,time,height) 
h_location = figure(2); 
plot(h_location,longitude,latitude) 

linkaxes([h_height h_location],'x') 

任何一個xlim的變化都會改變另一個。

+0

我並不想要經度數組與時間數組相同。你的答案現在仍然有效嗎? – Edd

+0

如果有某種方式,我可以從一個繪圖中獲得極限,我可以通過某種onClick函數更新其他繪圖 – Edd

+0

在我看來,您可以處理以下兩種方法之一。首先,您可以按照您的建議進行操作,並在每個圖中插入一個回調函數,以獲得一個極限,然後適當縮放另一個。其次,如果限制總是被縮放或相互移動,您可以定義一個比例和/或移位參數,並將其應用於其中一個「x」變量,然後使用「get」和「set」更改軸標籤'。有了這個選項,我不知道鏈接軸是否也會鏈接這些屬性,而我的MATLAB副本正在工作,所以我無法測試它。 – craigim