【问题标题】:Default "legend" function overwritten by accident默认的“图例”功能被意外覆盖
【发布时间】:2020-05-07 19:40:48
【问题描述】:

我正在使用 BNT-toolbox,这是一个用 matlab 编写的大型库,用于在贝叶斯网络中进行推理。

我不得不将此工具箱添加到 MATLAB 的路径中。但是在这样做之后,我就不能再使用默认的legend 函数了。

我认为这个库可能有他自己的legend 函数,覆盖了默认的。如何手动告诉 MATLAB 我想要原始工具箱而不是新工具箱中的工具箱?

在 Matlab 2018b 和 2020a 中尝试过

编辑:重现它:

当我运行测试脚本时,它会显示线条和图例。

https://github.com/bayesnet/bnt,这就是我说的工具箱。我下载了它,解压缩然后将它添加到我的路径 Home -> Set path -> add folder with subfolder

当我现在运行脚本时,它显示的是线条而不是图例。

注意:当我尝试另一种绘图方式时(参见测试脚本 2),图例再次显示。所以这是一个有效的“解决方法”

Testscript1:(位置:C:\Users\TomDe\Downloads\FullBNT-1.0.7\bnt\own\testscript1.m)

x = linspace(0,pi);
y1 = cos(x);
plot(x,y1)

hold on 
y2 = cos(2*x);
plot(x,y2)

legend('cos(x)','cos(2x)')

测试脚本2

% Some other code

tiledlayout(2,1) 
nexttile
plot(inputPath)
hold on
plot(sensorPath)
plot(inputInference)
hold off
title('The Input sequence and sensor readings  ')
legend('Path', 'sensor', 'Inference')

【问题讨论】:

    标签: matlab path


    【解决方案1】:

    您可以使用which 函数检查是否确实如此:

    >> which legend -all
    

    掩盖 MATLAB 自己的函数通常是个坏主意。我强烈建议你首先避免这个问题。创建一个MATLAB package,并将这个工具箱的源代码放在那里。


    仅出于演示目的,我将展示如何调用真正的legend.m

    >> wd = pwd;
    >> cd 'C:\Program Files\MATLAB\R2020a\toolbox\matlab\scribe\'
    >> legend(...)
    >> cd(wd);
    

    这是文件在 MATLAB R2020a 安装上的位置。

    【讨论】:

    • 我确实在寻找这样的东西。当我运行它时,它只打印: C:\Program Files\MATLAB\R2020a\toolbox\matlab\scribe\legend.m (所以要在工具箱中执行默认设置并且什么都没有)。尽管如此,当我运行一个小脚本来显示它没有出现的图例时。注意:通过从路径中删除工具箱并运行相同的脚本,会出现图例。对此有什么想法吗?
    • @TomDeConinck when I run a little script 这个脚本有什么作用?请将其添加到问题中。还有这个脚本的完整路径是什么?
    • @TomDeConinck 你能指出这个工具箱的源代码吗?如果你给我复制步骤,我可以尝试复制这个
    • @TomDeConinck 该工具箱中没有legend.m。检查find bnt-master -name "legend.m",所以你的代码一定有问题。运行legend不显示的代码时,命令窗口中是否显示任何警告或错误消息?
    • Testscript1 完全运行,然后显示图形(没有图例)。命令窗口不会引发错误或警告。
    【解决方案2】:

    你可以做两件事:

    1. 您总是希望使用默认的legend,而不是工具箱中的那个:在添加 BNT 工具箱目录时,在您的addpath 调用中使用the -end option,使其功能出现在末尾路径。 MATLAB 将始终通过依次查看路径目录来查找函数,因此路径中较早的目录具有优先权。

    2. 您想同时使用legend 的两个版本,并且想选择使用哪一个:编写一个小支持函数,从路径中删除 BTN 工具箱,调用legend,然后重新添加工具箱。这样函数看起来像这样(将其保存为路径中的某处 original_legend.m,然后以与调用 legend 相同的方式使用它,但改用这个新名称):

      function out = original_legend(varargin)
      rmpath /path/to/bnt/toolbox
      out = legend(varargin{:});
      addpath /path/to/bnt/toolbox
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多