【问题标题】:Multicolumn legend in MatlabMatlab中的多列图例
【发布时间】:2012-01-05 23:00:48
【问题描述】:

我希望能够创建一个图例以给出多个列(默认情况下,图例函数在 Matlab 中有一个唯一列)。例如,在下面编写的代码中,我需要在图例中添加三列,所以这将有两行和三列。

X = 0:pi/100:0.25*pi;
Y1 = sin(X);
Y2 = cos(X);
Y3 = tan(X);
Y4 = 0.5;
fh = figure('toolbar','none','menubar','none','Units','characters');
Pan1 = uipanel(fh,'Units','normalized','Position',[0 0 0.5 1],'title',...
    'Panel1');
Pan2 = uipanel(fh,'Units','normalized','Position',[0.5 0 0.5 1],'title',...
    'Panel2');
haxes = axes('Parent',Pan2,'Units', 'normalized','Position',...
[0.125 0.1 0.75 0.75]);
hplot = plot(haxes,X,Y1,X,Y2,X,Y3,X,Y4);
xlabel(haxes,'Time (second)');
ylabel(haxes,'Amplitude (meter)');
title(haxes,'Trigonometric functions');
Ley = {'Sine function','Cosine function','Tangent function','Constant'};
legend(haxes,Ley,'Location','SouthOutside');

我曾尝试在Matlab File Exchange 上使用名为gridlegend 的应用程序替换

legend(haxes,Ley,'Location','SouthOutside');

gridLegend(hplot,2,Ley,'Location','SouthOutside');

gridLegend(hplot,3,Ley,'Location','SouthOutside');

但是,由于图例的内容出现重叠和包容,得到的结果是无效的,对于情况3,是错误的。

P.D.我还在Matlab File Exchange 上尝试了名为columnlegend 的应用程序,但我需要将图例位置设置为SouthOutside,所以它对我不起作用。

【问题讨论】:

    标签: matlab multiple-columns legend-properties


    【解决方案1】:

    这是我对具有“SouthOutside”位置的图例的解决方案(我假设轴图形对象具有“标准化”单位,其“位置”为 [0.1 0.1 0.8 0.8]):

    function CLegend(hax,numcol,Ley)
    %# Inputs
    % hax : handle of the axes object to which belongs the legend
    % numcol: number of columns for the legend
    % Ley: text strings (labels) for the legend
    
    set(hax,'Units','normalized','Position',[0.1 0.1 0.8 0.8]);
    set(hax,'Units','characters');
    posAx = get(hax,'Position');
    insAx = get(hax,'TightInset');
    
    [legend_h,object_h] = legend(hax,Ley,'Units','characters','Location',...
        'South','Orientation','vertical');
    posl = get(legend_h,'Position');
    numlines = length(Ley);
    if (numlines<numcol)
        numcol = numlines;
    end
    
    numpercolumn = ceil(numlines/numcol);
    
    if (mod(numlines,numpercolumn) == 0)
        numcol = numlines/numpercolumn;
    end
    
    l = zeros(1,numlines);
    a = zeros(1,numlines);
    h = zeros(1,4);
    for j=1:numlines
        h = get(object_h(j),'Extent');
        l(j) = h(3);
        a(j) = h(4);
        set(object_h(j),'Units','characters');
    end
    
    lmax = posl(3)*max(l);
    hmax = posl(4)*max(a);
    hLine = object_h(numlines+1);
    xdata = get(hLine, 'xdata');
    dx = xdata(2)-xdata(1);
    di = 2;
    
    sheight = hmax;     
    height = hmax*numpercolumn-sheight/2;            
    line_width = dx*posl(3);                
    spacer = xdata(1)*posl(3);              
    delta1 = spacer + line_width + spacer + lmax;
    delta2 = line_width + spacer + lmax + spacer;
    delta3 = lmax + spacer + line_width + spacer;
    factx = 1/(posl(3)*numcol);
    facty = 1/(hmax*numpercolumn);
    width_l = numcol*delta1;
    
    set(legend_h, 'Position', [posAx(1) + 0.5*(posAx(3)-width_l) posl(2) ...
       width_l  numpercolumn*hmax]);
    
    col_ind = -1;
    row_ind = -1;
    j = 0;
    for i=1:numlines,
    
        if strcmpi(orient,'horizontal'),
            if mod(i,numcol)==1,
                row_ind = row_ind+1;
            end
            col_ind = mod(i,numcol)-1;
            if col_ind == -1,
                 col_ind = numcol-1;
            end
    
        else
            if numpercolumn==1 || mod(i,numpercolumn)==1,
                col_ind = col_ind+1;
            end
    
            row_ind = mod(i,numpercolumn)-1;
            if row_ind == -1,
                 row_ind = numpercolumn-1;
            end   
        end
    
        if (i==1)
            linenum = i+numlines;
        else
            linenum = linenum+di;
        end
        labelnum = i;
    
        set(object_h(linenum), 'ydata',facty*[height-row_ind*sheight ...
            height-row_ind*sheight]);
        set(object_h(linenum), 'xdata', factx*[spacer + j*delta2 ...
                    spacer + j*delta2 + line_width]);
        set(object_h(linenum+1), 'ydata',facty*(height-row_ind*sheight));
        set(object_h(linenum+1), 'xdata', factx*(spacer+line_width/2));
        set(object_h(labelnum), 'Position', [j*delta3+spacer*2+line_width ...
            height-row_ind*sheight]);
        if (mod(i,numpercolumn)== 0)
            j = j + 1;   
        end
    end
    opl = get(legend_h,'OuterPosition');
    set(hax, 'Position',[posAx(1) posAx(2)+opl(4) posAx(3) posAx(4)-opl(4)]);
    
    set(legend_h, 'OuterPosition',[opl(1) (posAx(2)-insAx(2))/2 opl(3) opl(4)]);
    set([hax,legend_h],'Units','normalized');
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-01
      • 1970-01-01
      • 2018-02-03
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      相关资源
      最近更新 更多