Matlab GUI或Legend滚动条中的可调整大小的图例

时间:2013-05-04 08:50:24

标签: matlab user-interface scroll legend scalable

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

  1. 我无法为
  2. 中构建的图例设置固定大小的区域
  3. 我无法弄清楚当GUI完全屏蔽时如何制作图例文本和框缩放
  4. 我想到的一个解决方案是图例中的滚动条,这可能吗?希望下面的图片突出显示问题:

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

1 个答案:

答案 0 :(得分: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属性,所以除了制作轴的副本之外,我看不到禁用此功能的方法。

您实际需要缩放的轴内唯一的东西是字体大小:由于使用了标准化单位,其余部分将自动缩放。

如果这种缩放解决方案没有引起您的兴趣,那么您可以做类似的事情(复制图例轴子项)但是向新轴添加滚动条(并将其单位设置为{{1}以外的其他值所以当你调整它的大小时它不会缩放它的内容)。您可以从如何从this question滚动来吸取一些灵感。