Matlab GUI或图例滚动条中可调整大小的图例
在Matlab中,我有一个GUI,它可以分析数据并将数据绘制到我的GUI主图形中的一个绘图上。我经常需要绘制许多不同的数据集,尽管使用它,但存在两个主要问题:Matlab GUI或图例滚动条中可调整大小的图例,matlab,user-interface,scroll,legend,scalable,Matlab,User Interface,Scroll,Legend,Scalable,在Matlab中,我有一个GUI,它可以分析数据并将数据绘制到我的GUI主图形中的一个绘图上。我经常需要绘制许多不同的数据集,尽管使用它,但存在两个主要问题: 我无法为要在其中构建的图例设置固定大小的区域 当GUI全屏显示时,我无法确定如何使图例文本和框缩放 我考虑的一个解决方案是在图例中设置滚动条,这可能吗?希望下图能突出问题所在: 这里有一个解决方案,它可以根据您的需要以任意比例缩放图例: close all; % Generate data N = 10; T = 10; x = ran
这里有一个解决方案,它可以根据您的需要以任意比例缩放图例:
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
对象不喜欢被调整到比它认为应该的更小的大小(可能在调整大小时有一些代码这样做,但是对于axes对象没有ResizeFcn
属性,因此除了制作轴的副本之外,我看不到禁用此功能的方法)
轴内唯一需要缩放的是字体大小:由于使用了标准化单位,其余部分将自动缩放
如果这种缩放解决方案不符合您的喜好,那么您可以做类似的事情(复制图例轴子对象),但在新轴上添加一个滚动条(并将其单位设置为非标准化的,以便在调整其大小时不会缩放其内容)。您可能会从中获得一些关于如何进行滚动的灵感