You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matlab多子图分别统一左右Y轴范围的实现问题

统一设置双Y轴子图的左右轴范围

这个问题我之前也碰到过——linkaxes确实不太适配双Y轴的场景,因为它默认只对当前活动的轴生效,而双Y轴的每个子图其实包含两个独立的轴对象。咱们直接针对每个子图的左右轴分别设置范围就好,不用绕弯子。

修改后的完整代码

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); 
    yyaxis right; plot(x, y2); 
    
    % 统一设置当前子图的左右轴范围
    yyaxis left;
    ylim(ylim_left);
    yyaxis right;
    ylim(ylim_right);
end

为什么这个方法有效?

  • 每个subplot创建的ax对象,在切换yyaxis left/right时,会激活对应的轴对象
  • 直接在循环里创建完子图后,立刻切换到左右轴分别设置ylim,能精准控制每个轴的范围
  • 如果后续还想调整,也可以单独遍历ax数组来修改:
for each_ax = ax
    yyaxis(each_ax, 'left');
    ylim(ylim_left);
    yyaxis(each_ax, 'right');
    ylim(ylim_right);
end

关于linkaxes的补充说明

如果想用linkaxes实现联动缩放(比如拖动一个子图,其他子图同步缩放),需要分别对左右轴的轴对象进行链接:

% 先收集所有左轴和右轴的对象
left_axes = [];
right_axes = [];
for each_ax = ax
    yyaxis(each_ax, 'left');
    left_axes = [left_axes, gca];
    yyaxis(each_ax, 'right');
    right_axes = [right_axes, gca];
end
% 链接所有左轴,链接所有右轴
linkaxes(left_axes, 'xy');
linkaxes(right_axes, 'xy');

这样拖动任意子图的左轴或右轴,其他子图对应的轴都会同步缩放,同时保持你设置的初始范围。

内容的提问来源于stack exchange,提问作者teepee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:09:21