2

在 Matlab 中,我有一个 GUI,可以分析数据并将其绘制到我的 GUI 主图中的一个图中。我经常不得不用它绘制很多不同的数据集,并且有两个主要问题:

  1. 我无法为要构建的图例设置固定大小的区域
  2. 当 GUI 全屏显示时,我无法弄清楚如何使图例文本和框缩放

我正在考虑的一个解决方案是图例中的滚动条,这可能吗?希望下图能突出问题:

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

4

1 回答 1

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不缩放调整大小时的内容)。您可能会从这个问题中获得一些关于如何进行滚动的灵感。

于 2013-05-04T12:04:17.970 回答