Octave绘图时如何在plot内用char()字符串设置;displayname;图例属性
更新
我已定位到legend()函数失效的原因,相关问题为:legend()是否需要会在不同作用域中丢失的隐式变量。
- 我尝试在
plot函数的";;displayname;"图例属性格式中调用变量(参考官方文档15.2.1 二维绘图章节),但没找到对应的用法说明。 - 受实际代码结构限制,单独调用
legend()没法正常生效;加上我设备上的Octave GUI跑不起来,也不熟悉Octave命令行调试方法,没法排查这个问题。 - 所以我认为,找个方法直接在
plot()函数内部完成图例定义,是目前唯一可行的方案。
测试代码
基础隔离测试代码
cur = char ( ["hi";"he";"le"] ) % 单独调用legend在隔离测试中可正常工作,但在实际程序中失效 loglog ( 3*[1:10].^3 ) legend ( cur(1,:) )
已尝试的无效方案
% 直接传入字符串会原样输出cur(1,:)文本,不会解析变量 loglog ( 3*[1:10].^3, ";cur(1,:);" ) % 直接拼接字符串会抛出语法错误 loglog ( 3*[1:10].^3, ";"cur(1,:)";" ) % 用+拼接字符串会抛出错误"__plt2vv__: vector lengths must match" loglog ( 3*[1:10].^3, (";" + cur(1,:) + ";"))
上述第二种、第三种尝试的写法参考自MATLAB Central的相关帖子
正确实现方法
Octave里的+运算符不支持字符串拼接,会直接对字符串的ASCII值做算术运算,这就是第三种写法报向量长度不匹配错误的原因。要在绘图函数内直接传入带变量的图例名,用方括号做字符串水平拼接就行:
cur = char ( ["hi";"he";"le"] ) % 拼接后生成符合";displayname;"格式的字符串,直接作为绘图参数传入 loglog ( 3*[1:10].^3, [";", cur(1,:), ";"] )
如果要绘制多条曲线,循环绘图时逐组按这个格式传入对应显示名即可,不需要额外单独调用legend(),能完全避开作用域导致的legend失效问题。
内容的提问来源于stack exchange,提问作者user8395964
相关产品推荐
相关产品推荐

