如何使用arrayfun调用set函数设置双Y轴的属性?
用arrayfun批量设置Matlab双轴图的Y轴范围
我来帮你搞定这个问题~你遇到的语法错误,本质是匿名函数里不能直接执行赋值语句(比如x.YAxis(1).Limits = [0 y1max]这种写法在匿名函数里是不被允许的),而set函数刚好能解决这个痛点——它可以把属性设置转化为函数调用的形式,完美适配arrayfun的使用场景。
1. 批量设置单个Y轴(比如所有图的第一个Y轴)
如果你想给所有双轴图的第一个Y轴统一设置范围,用arrayfun结合set的写法如下:
% 假设你已经定义了目标范围和轴对象数组ax y1max = 100; % 示例最大值 arrayfun(@(x) set(x.YAxis(1), 'Limits', [0 y1max]), ax, 'UniformOutput', false);
这里的逻辑很清晰:
@(x)定义了匿名函数的输入是单个轴对象xset(x.YAxis(1), 'Limits', [0 y1max])就是给当前轴的第一个Y轴设置范围'UniformOutput', false是因为set没有返回值,需要关闭统一输出要求
2. 同时批量设置两个Y轴
如果需要同时给每个双轴图的两个Y轴都设置范围,只需要在匿名函数里连续调用两次set即可:
% 先定义两个Y轴的目标范围 y1_lims = [0 100]; % 第一个Y轴的范围 y2_lims = [0 500]; % 第二个Y轴的范围 % 批量设置所有轴的两个Y轴 arrayfun(@(x) ... begin set(x.YAxis(1), 'Limits', y1_lims); set(x.YAxis(2), 'Limits', y2_lims); end, ... ax, 'UniformOutput', false);
3. 每个轴的Y轴范围不同的情况
如果每个双轴图的Y轴范围不一样,你可以把范围存在数组里,结合索引来批量设置:
% 假设你有3个双轴图,每个图的两个Y轴范围都不同 y1_lims_list = [0 100; 20 120; 0 80]; % 每行对应一个图的第一个Y轴范围 y2_lims_list = [0 500; 50 550; 0 400]; % 每行对应一个图的第二个Y轴范围 % 用索引遍历,给每个图设置对应范围 arrayfun(@(idx) ... begin set(ax(idx).YAxis(1), 'Limits', y1_lims_list(idx,:)); set(ax(idx).YAxis(2), 'Limits', y2_lims_list(idx,:)); end, ... 1:length(ax), 'UniformOutput', false);
这种写法和你原来的for循环功能完全一致,但代码更紧凑,尤其当需要封装更复杂的属性设置逻辑时,匿名函数的形式会更灵活。
内容的提问来源于stack exchange,提问作者teepee
相关产品推荐
相关产品推荐

