You need to enable JavaScript to run this app. MATLAB R2020b双纵轴图创建两个独立图例时首次调用legend失效如何解决
优惠活动
大模型
产品
解决方案
定价
更多

MATLAB R2020b双纵轴图创建两个独立图例时首次调用legend失效如何解决

问题核心原因

出现图例被覆盖、条目与曲线错配,是MATLAB内置的legend默认交互机制导致的,不属于代码语法错误:

  • 同一axes对象上,每次调用legend函数时,都会自动删除当前axes已绑定的旧图例,替换为新生成的图例对象。两次连续调用legend时,第一次在西北位置生成的图例,会被第二次在东北位置的调用直接删除,最终只剩第二个图例。
  • 第二次调用legend时未显式指定要关联的曲线句柄,MATLAB会自动抓取当前激活yyaxis侧的绘图对象生成图例,与左轴的黑色曲线无绑定关系,最终就会出现图例条目和曲线完全不匹配的效果。
R2020b 兼容的修复方案

该版本没有原生支持多图例的快捷参数,可通过三步实现双独立图例,流程如下:

  1. 绘图时显式存储每条曲线的句柄,避免MATLAB自动抓取句柄时出现错配
  2. 生成第一个图例后,临时修改它的父容器,把它从axes的绑定关系里移出,避免被后续的legend调用覆盖删除
  3. 生成第二个图例后无需额外操作,两个图例就会独立存在、分别绑定对应轴的曲线
可直接运行的修正代码
% 补全原始数据范围,可根据实际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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.07 12:24:10