2
在Matlab中,我有一個GUI,它可以分析和繪製我的GUI主圖中的圖上的數據。我經常繪製了很多不同的數據集,雖然與它有兩個主要問題:在Matlab GUI或圖例滾動條中調整大小的圖例
- 我不能設置一個固定大小的區域在
- 將建造的傳奇,我不能工作,如何做圖形用戶界面完全屏蔽後的文本和框圖縮放
我想到的一個解決方案是圖例中的滾動條,這可能嗎?希望下面的圖片突出問題:
在Matlab中,我有一個GUI,它可以分析和繪製我的GUI主圖中的圖上的數據。我經常繪製了很多不同的數據集,雖然與它有兩個主要問題:在Matlab GUI或圖例滾動條中調整大小的圖例
我想到的一個解決方案是圖例中的滾動條,這可能嗎?希望下面的圖片突出問題:
這裏是將規模與任何比例因子你的願望的傳說的解決方案:
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得到一些靈感來了解如何進行滾動。