2

MATLAB GUI に 2 つのプロットがあり、それらをリンクして、一方のプロットをズームすると他方がズームされるようにしたいと考えています。

プロットのリンクで見た同様の質問とは異なり、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];

ユーザーが で x 軸をズームすると、Plot 1たとえば、飛行の最初の 3 秒間を表示する場合、x 軸と y 軸をズームしたいPlot 2ので、経度と緯度の配列の最初の 3 つの経度と緯度の座標のみが表示されます。

これは可能ですか?

4

2 に答える 2

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 関数をネストして、時間、緯度、経度のデータを直接利用できるため、プロットが関数によって生成される場合、コードはより単純になります。このデータを syncLimits 関数に渡すこともできますが、これも少しコードが少なくなりますが、syncLimits を 1 回記述するだけで済みます (既に実行済みです!)。

于 2013-09-30T05:24:13.370 に答える
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を変更すると、もう一方も変更されます。

于 2013-09-29T15:18:38.607 に答える