在Matlab中,我有一个GUI,可以在GUI的主图中分析和绘制数据。我经常需要绘制很多不同的数据集,并且有两个主要问题:
我想到的一个解决方案是图例中的滚动条,这可能吗?希望下面的图片突出显示问题:
答案 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滚动来吸取一些灵感。