MATLAB R2020b双纵轴图创建两个独立图例时首次调用legend失效如何解决
问题核心原因
出现图例被覆盖、条目与曲线错配,是MATLAB内置的legend默认交互机制导致的,不属于代码语法错误:
- 同一axes对象上,每次调用
legend函数时,都会自动删除当前axes已绑定的旧图例,替换为新生成的图例对象。两次连续调用legend时,第一次在西北位置生成的图例,会被第二次在东北位置的调用直接删除,最终只剩第二个图例。 - 第二次调用legend时未显式指定要关联的曲线句柄,MATLAB会自动抓取当前激活yyaxis侧的绘图对象生成图例,与左轴的黑色曲线无绑定关系,最终就会出现图例条目和曲线完全不匹配的效果。
R2020b 兼容的修复方案
该版本没有原生支持多图例的快捷参数,可通过三步实现双独立图例,流程如下:
- 绘图时显式存储每条曲线的句柄,避免MATLAB自动抓取句柄时出现错配
- 生成第一个图例后,临时修改它的父容器,把它从axes的绑定关系里移出,避免被后续的legend调用覆盖删除
- 生成第二个图例后无需额外操作,两个图例就会独立存在、分别绑定对应轴的曲线
可直接运行的修正代码
% 补全原始数据范围,可根据实际x/y值替换 x = linspace(0, 2*pi, 100); y3 = 2*sin(x).*cos(x); y4 = sin(x).*cos(x); % 绘制左轴曲线并存句柄 yyaxis left h_curve_left = plot(x, y3); xlabel('x (between 0 and 2\pi)') ylabel('2sin(x)cos(x)') % 绘制右轴曲线并存句柄 yyaxis right h_curve_right = plot(x, y4); ylabel('sin(x)cos(x)') % 生成左轴对应的西北位置图例 lg_left = legend(gca, h_curve_left, '2sin(x)cos(x)', 'Location', 'NorthWest'); % *关键:修改父容器避免被后续legend调用覆盖* set(lg_left, 'Parent', gcf); % 生成右轴对应的东北位置图例 lg_right = legend(gca, h_curve_right, 'sin(x)*cos(x)', 'Location', 'NorthEast');
注意事项
- 不要在每次plot完成后立刻调用legend,必须先把两个轴的曲线都绘制完成、句柄全部存好再生成图例,否则很容易出现yyaxis切换时句柄抓取错位的问题。
- 留意原代码的笔误:右轴实际绘制的曲线是
sin(x)*cos(x),原代码写的图例标签是sin(x)/cos(x),建议核对修正,避免图例含义和实际曲线不匹配。 - 两个图例的位置选择要避开曲线绘图区域,选择的西北、东北两个角点位置刚好不会遮挡核心曲线,是比较合理的布局。
- 该方法完全适配R2020b版本,不需要升级MATLAB,也不会出现后续交互操作中图例突然消失的问题。
内容的提问来源于stack exchange,提问作者Ammar Ahmed
相关产品推荐
相关产品推荐

