MATLAB GUI使用多个图表进行缩放

时间:2013-09-29 14:33:37

标签: matlab plot

我在MATLAB gui中有2个绘图,我想将它们链接在一起,因此一个绘图上的缩放放大另一个。

与我在链接图中看到的类似问题不同,我的x数据或y数据都不会被任何图表共享,但它是相关的。


我的数据包括在5秒钟内飞过它们的飞机所测量的土地高度。

情节1 :土地的高度

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

Plot 2 :土地坐标

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

如果用户放大Plot 1上的x轴,例如显示前3秒的飞行,我想缩放Plot 2的x和y轴所以只有前3个经度&纬度和经度中的纬度坐标显示纬度数组。

这可能吗?

2 个答案:

答案 0 :(得分: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

然后,您可以获得高度v时间图,以便在缩放或平移时调用此函数。

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函数并利用时间,lat&amp;直接长数据。你也可以将这些数据传递给syncLimits函数,这个函数也会少一些,但你只需要编写一次syncLimits(我已经完成了!)。

答案 1 :(得分: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

{{1}}中的任何更改都会改变另一个。