设置Matlab图中的legend的线长

注:以下代码版本为Matlab2011,在 2015版上进行测试有问题。
有时候我们想调节Matlab图中的legend的线长以达到更好的可视效果。直接举例,做法如下:

plot(1:10,’-*’)
legend(‘a’)
linesInPlot = findobj(‘type’,'line’); % linesInPlot(2)是线的控制句柄
length_leg = get(linesInPlot(2),’XData’); % 返回的结果为 0.1231 0.7385
length_mid = mean(length_leg); %找到中间点
length_line = (length_leg(end) – length_leg(1))/2;
length_chxRatio = 0.5; %!!!想要的线长的调节比,我们设置0.5即表示线长压缩一半
length_leg = [length_mid-length_line*length_chxRatio length_mid+length_line*length_chxRatio];
set(linesInPlot(2),’XData’,length_leg) % 设置更改后的线长

但是此方法仍存在问题就是并没有改变 legend框的大小,有待继续探索。。。

设置Matlab图中的legend的线长》上有 8 条评论

  1. legend(‘boxoff’)可以去掉box,但也不能改变box的大小。。。

    博主你的方法,只能将legend的最后一条线变短?我有三条线,加上博主的代码后,最后一条线变成了原来的1/2,如果三条都要变应该怎么处理了?

    我的代码:
    str_Theta = {‘$\rm\theta^2=0.02$’, ‘$\rm\theta^2=0.2$’,'$\rm\theta^2=2$’};
    IFontName_normal = ‘Times New Roman’;
    Interpreter_type = ‘Latex’;
    FontSize_legend = 10;
    h = legend(str_Theta,’Interpreter’,Interpreter_type,’FontName’,FontName_normal,’EdgeColor’,[1,1,1]);
    set(h,’Fontsize’,FontSize_legend,’Location’,'SouthEast’);
    linesInPlot = findobj(‘type’,'line’); % linesInPlot(2)是线的控制句柄
    length_leg = get(linesInPlot(2),’XData’);
    length_mid = mean(length_leg); %找到中间点
    length_line = (length_leg(end) – length_leg(1))/2;
    length_chxRatio = 0.5; %!!!想要的线长的调节比,我们设置0.5即表示线长压缩一半
    length_leg = [length_mid-length_line*length_chxRatio length_mid+length_line*length_chxRatio];
    set(linesInPlot(2),’XData’,length_leg) % 设置更改后的线长
    legend(‘boxoff’);

    • 你好,不好意思。目前我的matlab版本为2015,在此版本上测试,原代码中第3行 linesInPlot 参数只返回一个值,没有返回第二个Legend线的句柄。

      是的,如你所说Legend可以隐藏,但是并没有找到合适的办法缩小框的大小。当时我的最终选择是多个子图合并共享一个Legend,并将其放到外面。

  2. 受到您方法的启发,在我的应用中我找到了其他两条线的坐标,而且实现了把线的长度变短的做法,这里附上一个例子,长度变成了原来的0.5倍。

    clear;clc;close all;
    x = linspace(0,100,1000);
    y1 = x;
    y2 = x.^2;
    y3 = x.^3;
    loglog(x,y1,’r');
    hold on;
    loglog(x,y2,’b');
    loglog(x,y3,’g');

    [h_legend ,object_h,plot_h,text_strings] = legend({‘a’,'b’,'c’},’Location’,'North’);

    hh = findobj(‘type’,'line’)
    xxx1 = get(hh(1),’XData’);
    xxx2 = get(hh(2),’XData’);
    xxx3 = get(hh(3),’XData’);
    xxx4 = get(hh(4),’XData’);
    xxx5 = get(hh(5),’XData’);
    xxx6 = get(hh(6),’XData’);
    xxx7 = get(hh(7),’XData’);
    xxx8 = get(hh(8),’XData’);
    xxx9 = get(hh(9),’XData’);
    length(xxx1)
    length(xxx2)
    length(xxx3)
    length(xxx4)
    length(xxx5)
    length(xxx6)
    length(xxx7)
    length(xxx8)
    length(xxx9)

    xxx2(1) = xxx2(1)+(xxx2(2)-xxx2(1))/2; %%起始点向前走0.5个原来的长度。。
    set(hh(2),’XData’,xxx2)
    set(hh(4),’XData’,xxx2)
    set(hh(6),’XData’,xxx2)
    legend(‘boxoff’)

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>