首页 > 解决方案 > 在 Matlab 子图中链接不同的数据源

问题描述

我想将纬度和经度数据与另一种类型的数据(速度)一起绘制,记录在每个纬度经度点。这基本上相当于

figure()
subplot(1,2,1); plot(lat,lon);
subplot(1,2,2); plot(t,y);

其中所有向量具有相同的长度,并且t是每个记录的时间戳(以秒为单位)。我希望能够链接数据,这样当我在第一个子图中突出显示数据时,相应的数据会在第二个子图中突出显示(反之亦然)。

然而,因为这两个子图没有共同的数据源(至少没有名字),我很难开始linkdata工作。

这是我尝试过的(没有linkdata

function linkedexasmple()
close all

t = linspace(-2,2,100);
lat = sin(t);
lon = cos(t);
x = t;
y = exp(t);
M = [lat',lon',x',y'];

figure()
whos

subplot(1,2,1)
plot(M(:,1),M(:,2),'-x','XDataSource','M(:,1)','YDataSource','M(:,2)');
subplot(1,2,2)
plot(M(:,3),M(:,4),'-x','XDataSource','M(:,3)','YDataSource','M(:,4)');

%linkdata on
%linkdata showdialog
end

在此处输入图像描述

但是,如果我 toggle linkdata on,情节就完全改变了。 在此处输入图像描述

如何在启用链接的同时保留原始图?

最后一点:我显然想稍后用参数 ( lat, lon, x, y) 调用该函数。但是对于这个 MWE,我认为这样会更容易。

标签: matlabplot

解决方案


您可以将未记录的BrushData属性与画笔的ActionPostCallback. 该BrushData属性是一个s 和s的uint8数组,其中s 表示选择的数据点。在回调函数中,当两个子图中的任何一个被“刷”时,同时设置它们的 。011BrushData

function linkedexample()
    t = linspace(-2,2,100);
    lat = sin(t);
    lon = cos(t);
    x = t;
    y = exp(t);

    fig = figure();
    subplot(1,2,1)
    p1 = plot(lat,lon);
    subplot(1,2,2)
    p2 = plot(x,y);

    % Bind callback function with the brush
    b = brush(fig);
    b.ActionPostCallback = {@onBrushAction};

    % callback function
    function onBrushAction(~, eventdata)
        set(p1, 'BrushData', eventdata.Axes.Children.BrushData)
        set(p2, 'BrushData', eventdata.Axes.Children.BrushData)
    end
end

结果: 同步子图的画笔高亮

这两篇文章,关于Undocumented Matlab的“访问绘制的绘图数据”及其工作人员的这篇Mathwork 帖子,提供了有关和的更多信息。BrushDataActionPostCallback


推荐阅读