Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 在“不可见”属性上同步多个轴 形势_Matlab_Matlab Figure - Fatal编程技术网

Matlab 在“不可见”属性上同步多个轴 形势

Matlab 在“不可见”属性上同步多个轴 形势,matlab,matlab-figure,Matlab,Matlab Figure,假设我有特定时间的位置坐标。假设数据看起来像 data = A[rand(100, 3), sort(rand(100, 1))] 其中,数据(:,1)为x坐标,数据(:,2)为y坐标,数据(:,3)高度,数据(:,4)记录时间 我可以使用 pxy = subplot(2,2,1) % Plot for X-Y-Data plot(data(:,1), data(:,2)) ptx = subplot(2,2,2) % Plot for T-X-Da

假设我有特定时间的位置坐标。假设数据看起来像

data = A[rand(100, 3), sort(rand(100, 1))]
其中,
数据(:,1)
为x坐标,
数据(:,2)
为y坐标,
数据(:,3)
高度,
数据(:,4)
记录时间

我可以使用

pxy = subplot(2,2,1)            % Plot for X-Y-Data
plot(data(:,1), data(:,2))
ptx = subplot(2,2,2)            % Plot for T-X-Data
plot(data(:,4), data(:,1))
pty = subplot(2,2,3)            % ... and so on
plot(data(:,4), data(:,2))
pth = subplot(2,2,4)
plot(data(:,4), data(:,3))
现在,为了查看图形,最好同步轴

关于可能性的初步思考 一个简单的方法是使用
linkaxes
作为时间轴

linkaxes([ptx, pty, pth], 'x')
但是,这使xy绘图保持不变。因此,较弱的问题是如何将
ptx
的y轴连接到
pxy
的x轴

但让我们变得更复杂:

实际问题 假设我只有两个图,
pxy
pth
。现在,每当我放大或平移
pxy
时,
pxy
中可见的时间跨度就会被提取出来,并相应地修改
pth
。类似地,缩放
pth
会改变
pxy
,从而只有正确时间跨度内的数据可见

这种方法应该是可伸缩的,我可以绘制4个可能的图的任意子集,并相应地进行链接

你知道如何做到这一点吗

最佳解决方案仍然允许通过使用
按住
添加更多数据来修改基准图

你想要的(理论上的)问题是pxy应该是可逆的,而在离散域(matlab是离散的),这就变得更不清楚了

假设有两个点P1=(x1,y1)和P2=(x2,y2),它们在pxy中彼此相邻;如果P1和P2在pxy中都可见,您希望pxy的轴窗口对应于pth上的哪个轴窗口?Pth1还是Pth2?您必须为此定义一些决策规则。。可能基于您实际单击的两个(P1或P2)中的哪一个


实际上,当用户更改pxy上的缩放时,您必须运行函数来更改轴,这可以按照此处的说明来完成:

由于Gunthers的提示,我能够自己解决问题。 由于Gunthers的答案仍然需要大量的研究,我在下面提供了我自己的解决方案,以防有人在某个时候遇到类似的问题

首先,我在axis对象中添加了作为UserData所需的大部分数据。我的绘图函数(仅用于两个绘图)大致如下所示:

sb1 = subplot(1, 2, 1);
plot(data(:,1), data(:,2));
axis equal;
sb2 = subplot(1, 2, 2);
plot(data(:,4), data(:,3));
set(sb1, 'UserData', struct('projection', 'xy', 'data', data, 'link', [sb2]));
set(sb2, 'UserData', struct('projection', 'th', 'data', data, 'link', [sb1]));
panzoom(sb1, 'setlimits');   % Those two lines ensure that the zoom limits won't get changed
panzoom(sb2, 'setlimits');   % over time.
现在,我将处理程序设置为缩放功能:

z = zoom;
set(z, 'ActionPostCallback', @Track.synchronizePlots);
z = pan;
set(z, 'ActionPostCallback', @Track.synchronizePlots);
最后,这里是魔法发生的地方:

function synchronizePlots(obj, ax)
    ax = ax.Axes;           
    ud = get(ax, 'UserData');

    if ud.projection == 'xy'
        % That is the part discussed in the comments above,
        % which is, as I freely admit, not very sensible on a strict
        % mathematical point of view. However, the result is good enough for my
        % purpose
        xrange = get(ax, 'XLim');
        yrange = get(ax, 'YLim');
        pointsvisible = ud.data(1,:) >= xrange(1) & ...
                        ud.data(1,:) <= xrange(2) & ...
                        ud.data(2,:) >= yrange(1) & ...
                        ud.data(2,:) <= yrange(2);
        r = [min(ud.data(4, pointsvisible)), max(ud.data(4, pointsvisible))];
        if length(r) == 0  % The trick above may fail if there is no point in the zoom region.
            return         % in that case we just do nothing.
        end
    else
        r = get(ax, 'XLim');  % Straightforward
    end


    for a = ud.link  % The function does not care about the number of figures that have to be changed.
        linkud = get(a, 'UserData');

        if linkud.projection == 'xy'
            % Again, changing the xy-plot is that only part we have to work.
            pointsintime = linkud.data(4,:) >= r(1) & ...
                           linkud.data(4,:) <= r(2);
            xrange = [min(linkud.data(1, pointsintime)), ...
                      max(linkud.data(1, pointsintime))];
            yrange = [min(linkud.data(2, pointsintime)), ...
                      max(linkud.data(2, pointsintime))];
            if length(xrange) > 0
                 set(a, 'XLim', xrange);
                 set(a, 'YLim', yrange);
                 axis(a, 'equal');
            end
        else
            set(a, 'XLim', r);
        end
    end
功能同步程序段(obj、ax)
ax=ax轴;
ud=get(ax,'UserData');
如果ud.projection=='xy'
%这是上面评论中讨论的部分,
%正如我坦率地承认的那样,严格来说,这是不明智的
%数学观点。然而,结果对我来说已经足够好了
%目的
xrange=get(ax,'XLim');
yrange=get(ax,'YLim');
pointsvisible=ud.data(1,:)>=xrange(1)&。。。
ud.数据(1,:)=yrange(1)和。。。
ud.数据(2,:)=r(1)和。。。
linkud.data(4,:)0
设置(a,'XLim',X范围);
集合(a,'YLim',yrange);
轴(a,‘相等’);
结束
其他的
设置(a,'XLim',r);
结束
结束

希望这对某人有所帮助。

谢谢你的回复。我现在正在研究你指给我的技术。关于更多的理论问题:我的方法是使用以下算法:确定
pxy
中可见的所有数据点P_i,并计算min(P_i(t))和max(P_i(t))。这将是
pth
的x轴极限。这种方法肯定不会总是得到最好的结果,但是,我的数据的性质表明,在大多数有趣的情况下,这应该足够了。如果你的数据是单调的,它将很容易反转。因此,您的方法也将是准确的。你可以想到很多可行的案例,也有很多不可行的案例。。