2011-11-24 474 views
1

我希望能够创建一个图例来给出许多列(默认情况下,图例函数在Matlab中具有唯一列)。例如,在下面编写的代码中,我需要在图例中有三列,所以这将有两行行和三列行。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(hplot,2,Ley,'Location','SouthOutside'); 

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

然而,重新更换

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

称为gridlegend由于图例的内容显得重叠并且包含在内,所以得到的结论是无效的,因为情况3是错误的。

P.D.我也尝试过在Matlab File Exchange上叫做columnlegend的应用程序,但我需要那个传说位置是SouthOutside,所以它不适用于我。

回答

0

这里是我的具有“SouthOutside”位置的图例溶液(I已经假定轴的图形对象具有“规范化”单元和它的“位置”为[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