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
相关产品推荐
相关产品推荐

