2011-11-24 57 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