MATLAB中如何将绘图及其对应图例一同复制到另一幅绘图中?
MATLAB 含图例绘图跨图复制报错解决方案
问题表现
使用如下代码复制已保存的fig图内容到另一幅图时,源图不含图例可正常运行,源图添加图例后调用copyobj会触发输入参数过多的报错:
fig1 = openfig('ABC.fig'); fig2 = openfig('DEF.fig', 'invisible'); copyobj(fig2.Children.Children, fig1.Children);
报错原因是图例属于和坐标轴绑定的特殊图形对象,copyobj不会自动复制图例关联的上下文菜单,直接全量复制子对象时会因图例对象缺少关联依赖触发参数校验错误。
可直接复用的实现方法
方法1:保留目标图原有坐标轴,重生成图例
该方法不会覆盖目标图已有坐标轴配置,兼容性最好,适配R2018b及之后所有版本:
fig1 = openfig('ABC.fig'); fig2 = openfig('DEF.fig', 'invisible'); % 按类型检索源图、目标图的坐标轴对象,避免不同版本图窗子层级差异导致的索引错误 ax_src = findobj(fig2, 'Type', 'axes'); ax_tgt = findobj(fig1, 'Type', 'axes'); % 先复制除图例之外的所有绘图元素 src_children = ax_src.Children; copyobj(src_children(~isa(src_children, 'matlab.graphics.illustration.Legend')), ax_tgt); % 提取源图图例配置,在目标轴上重绘匹配样式的图例 if ~isempty(ax_src.Legend) leg_src = ax_src.Legend; % 匹配支持图例标注的绘图对象类型 tgt_plot_objs = findobj(ax_tgt, '-regexp', 'Type', 'line|bar|scatter|histogram|contour'); legend(ax_tgt, tgt_plot_objs, leg_src.String, ... 'Location', leg_src.Location, ... 'Interpreter', leg_src.Interpreter, ... 'FontSize', leg_src.FontSize, ... 'Box', leg_src.Box); end close(fig2); % 关闭隐形打开的源图释放内存
方法2:直接复制完整坐标轴对象
如果不需要保留目标图原有坐标轴内容,可直接复制包含绑定图例的完整坐标轴对象,MATLAB会自动处理图例的关联依赖,不会触发报错:
fig1 = openfig('ABC.fig'); fig2 = openfig('DEF.fig', 'invisible'); % 直接把源图的坐标轴(含绑定图例)复制到目标图 copyobj(findobj(fig2, 'Type', 'axes'), fig1); close(fig2);
注意:不要直接用
fig2.Children.Children的固定索引取对象,不同MATLAB版本的图窗、坐标轴子对象层级存在差异,用findobj按对象类型检索的写法稳定性更高。
内容的提问来源于stack exchange,提问作者Jonas
相关产品推荐
相关产品推荐

