代码之家  ›  专栏  ›  技术社区  ›  Hojo.Timberwolf

图形中的复制轴

  •  1
  • Hojo.Timberwolf  · 技术社区  · 7 年前

    我原本想把子图的句柄附加到其他图上

    afig = figure;
    a1{1} = axes('Position',[.01,.2,.2,.2], 'color','none','Xlim',[-10,10],'Ylim',[-10,10]);
    a1{2} = a1{1};
    a1{2}.Position = [.3,.2,.2,.2];
    a1{3} = a1{1};
    a1{3}.Position = [.6,.2,.2,.2];
    
    obj = patch('Parent',a1{1},'XData',[1,3,1],'YData',[1,1,3]);
    

    enter image description here

    但这只是移动现有的绘图,而不是复制它。(因为我仍然是指同一个对象,尽管它有不同的名称)

    afig = figure;
    a1{1} = axes('Position',[.01,.2,.2,.2], 'color','none','Xlim',[-10,10],'Ylim',[-10,10]);
    a1{2} = axes('Position',[.3,.2,.2,.2], 'color','none','Xlim',[-10,10],'Ylim',[-10,10]);
    a1{3} = axes('Position',[.6,.2,.2,.2], 'color','none','Xlim',[-10,10],'Ylim',[-10,10]);
    
    obj{1} = patch('Parent',a1{1},'XData',[1,3,1],'YData',[1,1,3]);
    obj{2} = patch('Parent',a1{2},'XData',[1,3,1],'YData',[1,1,3]);
    obj{3} = patch('Parent',a1{3},'XData',[1,3,1],'YData',[1,1,3]);
    

    enter image description here

    有没有办法调用1个子时隙,更新1个子时隙,但让它传播到其他子时隙?

    1 回复  |  直到 7 年前
        1
  •  1
  •   zeeMonkeez    7 年前

    这真的取决于你想在最后做什么,有多复杂的动画,如果你可以提前准备你的情节。

    首先,如果只有几个对象,可以使用 linkprop 链接图形对象属性的函数:

    afig = figure;
    a1{1} = axes('Position',[.01,.2,.2,.2], 'color','none','Xlim',[-10,10],'Ylim',[-10,10]);
    obj = patch('Parent',a1{1},'XData',[1,3,1],'YData',[1,1,3]);
    
    a1{2} = copyobj(a1{1}, afig);
    a1{2}.Position = [.3,.2,.2,.2];
    
    a1{3} = copyobj(a1{1}, afig);
    a1{3}.Position = [.6,.2,.2,.2];
    
    
    linked_objects = [ a1{1}.Children, a1{2}.Children,  a1{3}.Children];
    property_names = {'XData', 'YData', 'ZData'};
    
    hlink = linkprop(linked_objects, property_names);
    
    
    for ii = 1:10
        obj.XData(1) = ii;
        drawnow
        pause(0.01)
    end
    

    在这里,我们首先创建基图,然后复制 axes (请注意,也会复制子对象,但不会复制回调和其他属性,请参见 copyboy 轴线 '查看属性),然后在循环中更改它们。

    轴线 在每个循环迭代中,复制 “把孩子交给别人 之后。由于大量对象被复制和渲染,这种方法的成本可能更高,但另一方面,不必跟踪单个属性。举个例子:

    afig = figure;
    
    a1{1} = axes('Position',[.01,.2,.2,.2], 'color','none','Xlim',[-10,10],'Ylim',[-10,10]);
    obj = patch('Parent',a1{1},'XData',[1,3,1],'YData',[1,1,3]);
    
    a1{2} = copyobj(a1{1}, afig);
    a1{2}.Position = [.3,.2,.2,.2];
    
    a1{3} = copyobj(a1{1}, afig);
    a1{3}.Position = [.6,.2,.2,.2];
    
    for ii = 1:10
    
        obj.XData(1) = ii;
    
        delete(a1{2}.Children);
        delete(a1{3}.Children);
        copyobj(a1{1}.Children, a1{2});
        copyobj(a1{1}.Children, a1{3});
    
        drawnow
        pause(0.01)
    end
    

    最后,它可以作为一个选项来使用 getframe 仅捕获渲染图像并将其显示在副本中 轴线 .