对于图

时间:2018-04-27 15:29:53

标签: matlab matlab-figure handle subplot axes

我有一个子图,如下所示:

enter image description here

创建如下:

fig = figure;
nPlots = 3;
for p = 1:nPlots
  ax(p) = subplot(1, nPlots, p);
  x  = 0:10*p;
  y1 = max(x)-x.^1.1;
  y2 = p*max(x)-2*x;
  yyaxis left;
  plot(x, y1);
  yyaxis right;
  plot(x, y2);
end

我希望每一侧的轴分别相同,即我希望所有的图都有:

ylim_left  = [0 30];
ylim_right = [0 90];

但如果我使用linkaxes(ax),我最终只会改变右侧:

enter image description here

如果我尝试yyaxis left; linkaxes(ax);,则它会获取左侧的最高值并将其应用于前两个子图的右侧。

enter image description here

当我检查ax时,我注意到它的所有组件ax(1),ax(2)......将YAxisLocation:属性设置为'right',我想这是这个问题的根源。我不确定如何将手柄直接放到子图的左侧和右侧轴上,以直接将它们连接在一起。任何想法都将不胜感激。

2 个答案:

答案 0 :(得分:1)

通过提取Y轴的NumericRuler个孩子,您可以访问左右限制:

>> [ax.YAxis]

ans = 

  2×3 NumericRuler array:

    NumericRuler    NumericRuler    NumericRuler
    NumericRuler    NumericRuler    NumericRuler

其中第1行是左侧,第2行是右侧。

定义一个辅助函数来同步它们:

function matchyyaxes(ax, ylim_L, ylim_R)
yaxes = [ax.YAxis];

set(yaxes(1,:), 'Limits', ylim_L);
set(yaxes(2,:), 'Limits', ylim_R);
end

您可以将其与样本限制一起使用:

matchyyaxes(ax, [0 30], [0 90]);

yay

您还可以创建自己的property listener来模仿linkaxes

的功能

答案 1 :(得分:0)

只需插入' ylim'情节后的功能。这对我有用:

fig = figure;
nPlots = 3;
ylim_left  = [0 30];
ylim_right = [0 90];
for p = 1:nPlots
  ax(p) = subplot(1, nPlots, p);
  x  = 0:10*p;
  y1 = max(x)-x.^1.1;
  y2 = p*max(x)-2*x;
  yyaxis left;
  plot(x, y1);
  ylim(ylim_left);
  yyaxis right;
  plot(x, y2);
  ylim(ylim_right);
end

enter image description here