代码之家  ›  专栏  ›  技术社区  ›  Peter

如何替换Matlab图形中的x轴?

  •  3
  • Peter  · 技术社区  · 7 年前

    在不影响y轴值的情况下,我需要什么命令来移动开放Matlab图形中的x轴值?(如下图所示)

    到目前为止,我最好的猜测是:

    LineH = get(gca, 'Children');
    x = get(LineH, 'XData');
    y = get(LineH, 'YData');
    
    offset=20;
    
    nx = numel(x);
    for i=1:nx
        x_shifted{i} = x{i} + offset;
    end
    
    set(LineH,'XData',x_shifted')
    

    这给了我一个错误:

    Error using matlab.graphics.chart.primitive.Line/set
    While setting the 'XData' property of Line:
    Value must be a vector of numeric type
    

    谢谢

    non_shifted_axis shifted_axis

    2 回复  |  直到 7 年前
        1
  •  3
  •   gnovice    7 年前

    您必须封装 'XData' property 在单元格中命名,以一次更新多个打印对象。从 set 文档:

    set(H,NameArray,ValueArray) 使用单元格数组指定多个特性值 NameArray ValueArray . 设置 n 每个 m 图形对象,指定 ValueArray 作为一个 m -由- n 单元阵列,其中 m = length(H) n 等于中包含的属性名称数 .

    因此,要修复错误,只需将最后一行更改为:

    set(LineH, {'XData'}, x_shifted');
    

    如果你感兴趣,这里有一个解决方案 cellfun

    hLines = get(gca, 'Children');
    xData = get(hLines, 'XData');
    offset = 20;
    
    set(hLines, {'XData'}, cellfun(@(c) {c+offset}, xData));
    
        2
  •  3
  •   Luis Mendo    7 年前

    显然你不能设置 'XData' 具有单元格数组的所有行的属性。

    可以进行编辑;看见 @gnovice's answer .

    你能做的就是移动 set 语句进入循环:

    LineH = get(gca, 'Children');
    x = get(LineH, 'XData');
    y = get(LineH, 'YData');
    
    offset=20;
    
    nx = numel(x);
    for i=1:nx
        x_shifted{i} = x{i} + offset;
        set(LineH(i),'XData',x_shifted{i}); % set statement with index i
    end