2013-05-04 201 views
2

在Matlab中,我有一個GUI,它可以分析和繪製我的GUI主圖中的圖上的數據。我經常繪製了很多不同的數據集,雖然與它有兩個主要問題:在Matlab GUI或圖例滾動條中調整大小的圖例

  1. 我不能設置一個固定大小的區域在
  2. 將建造的傳奇,我不能工作,如何做圖形用戶界面完全屏蔽後的文本和框圖縮放

我想到的一個解決方案是圖例中的滾動條,這可能嗎?希望下面的圖片突出問題:

http://i42.tinypic.com/6yyzrl.jpg

回答

2

這裏是將規模與任何比例因子你的願望的傳說的解決方案:

close all; 

% Generate data 
N = 10; 
T = 10; 
x = rand(T, N); 

% How much to scale by 
xLegScale = 0.5; 
yLegScale = 0.5; 

% Plot some data 
labels = arrayfun(@(n){sprintf('Legend Entry for Line %i', n)}, 1:N); 
plot(x, 'LineWidth', 2); 
hLeg = legend(labels); 

% Figure out new legend width/height, including a little fudge 
legPos = get(hLeg, 'Position'); 
widthFudgeFactor = 0.1; 
legPosNew = legPos; 
legPosNew(3:4) = legPosNew(3:4) .* [xLegScale yLegScale]; 
legPosNew(3) = legPosNew(3) * (1 + widthFudgeFactor); 

% Create a new axes that matches the legend axes and copy all legend 
% children to it, then delete the legend 
axNew = axes('Parent', gcf); 
xlim(axNew, get(hLeg, 'XLim')); 
ylim(axNew, get(hLeg, 'YLim')); 
box(axNew, 'on'); 
set(axNew, 'Position', legPosNew); 
set(axNew, 'XTick', [], 'YTick', []); 
copyobj(get(hLeg, 'Children'), axNew) 
delete(hLeg); 
hLeg = axNew; 

% Find text objects inside legend 
hLegTexts = findobj('Parent', hLeg, 'Type', 'text'); 

% Scale font size 
legTextFontSize = get(hLegTexts, 'FontSize'); 
fszScale = mean([xLegScale yLegScale]); 
legTextFontSizeNew = cellfun(@(x){fszScale * x}, legTextFontSize); 
arrayfun(@(h, fontSize)set(h, 'FontSize', fontSize{:}), hLegTexts, legTextFontSizeNew); 

這段代碼創建一個新的座標軸是一個傳真的原始圖例軸,並做所有的位置設置工作。原因是legend對象不喜歡被調整大小比它認爲它應該是(可能有一些代碼這樣做時,它調整大小,但沒有ResizeFcn屬性的軸對象,所以我看不到一種方式除了製作軸的副本外,禁用此功能)。

您實際需要縮放的軸內唯一需要縮放的字體是:其餘的縮放將由於使用標準化單位而自動縮放。

如果這種縮放解決方案不會讓你感到癢癢,那麼你可以做類似的事情(複製圖例軸兒童),但添加一個滾動條到新軸(並將其單位設置爲normalized以外的東西,這樣它在調整它的大小時不會縮放它的內容)。你可以從this question得到一些靈感來了解如何進行滾動。