Matlab 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

在Matlab中,我有一个GUI,它可以分析数据并将数据绘制到我的GUI主图形中的一个绘图上。我经常需要绘制许多不同的数据集,尽管使用它,但存在两个主要问题:

  • 我无法为要在其中构建的图例设置固定大小的区域
  • 当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
    对象不喜欢被调整到比它认为应该的更小的大小(可能在调整大小时有一些代码这样做,但是对于axes对象没有
    ResizeFcn
    属性,因此除了制作轴的副本之外,我看不到禁用此功能的方法)

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

    如果这种缩放解决方案不符合您的喜好,那么您可以做类似的事情(复制图例轴子对象),但在新轴上添加一个滚动条(并将其单位设置为非
    标准化的
    ,以便在调整其大小时不会缩放其内容)。您可能会从中获得一些关于如何进行滚动的灵感