如何为图的传奇添加额外信息?

时间:2013-09-10 10:35:27

标签: matlab matlab-figure

我想在MATLAB中为图形添加额外的信息,如下所示:

enter image description here

有可能吗? (当然我希望它更漂亮)

3 个答案:

答案 0 :(得分:13)

我把合理泛型的东西放在一起,见下文。

我会更多地概括一下并将其发布到文件交换中,我认为这是一个相当不错的工具:)

我打算

  • 自动调整表格大小以适合其内容
  • 使其适合任意图例放置
  • 使用鼠标移动它们时将表格和图例结合在一起
  • 使标题可选
  • 支持各种类型的输入

但是现在:

% Example input

plot(1,1,'r.', 1.1,1.1', 'b.', 1.2,1.2, 'k.');
legendHandle = legend('plot 1', 'plot 2 with longer title', 'plot 3');

tableHead = {'\theta_0' '\phi' 'df/dx'};
tableContent = rand(3);




% Extract information 
legendPosition = get(legendHandle, 'position');
children = get(legendHandle, 'children');
labels   = children(strcmp(get(children, 'type'), 'text'));


% Basic error traps
if size(tableContent,1) ~= numel(labels)
    error('LegendTable:dimension_mismatch',...
        'Each legend entry must have a corresponding row in the table.')
end

if size(tableHead,2) ~= size(tableContent,2)
    error('LegendTable:dimension_mismatch',...
        'Table header dimensions are inconsistent with table data.');
end

% Convert header & content to cell-array when necessary
if isnumeric(tableContent)
    tableContent = cellfun(@num2str, ...
        num2cell(tableContent), 'UniformOutput', false);
end
if isnumeric(tableHead)
    tableHead = cellfun(@num2str, ...
        num2cell(tableHead), 'UniformOutput', false);
end

% Proper tick locations for the table
xticks = linspace(0, 1, numel(tableHead)+1);
yticks = linspace(0, 1, numel(labels)+2);

% Text positions are in the centers of the table cells
txt_xPositions = xticks(1:end-1) + (xticks(2)-xticks(1))/2;
txt_yPositions = fliplr(yticks(1:end-1) + (yticks(2)-yticks(1))/2);

% Derive correct table position
headerHeight  = legendPosition(4)/numel(labels);
tablePosition = legendPosition + [0 -headerHeight 0 headerHeight];

% Shift position of original legend 
set(legendHandle, 'position', legendPosition + [-tablePosition(3) -headerHeight 0 0])

% Create table
table = axes(...     
    'position', tablePosition,...
    'xtick', xticks,...
    'ytick', yticks,...
    'xticklabel', [],...
    'yticklabel', [],...    
    'gridlinestyle', '-',...
    'box', 'on',...
    'tag', 'LegendTable');
grid on


% Print table header & table entries
kk = 1;
tableTexts = zeros(numel(tableHead)+numel(tableContent),1);
for ii = 1:numel(txt_xPositions)

    % Column header
    tableTexts(kk) = text(txt_xPositions(ii), txt_yPositions(1), tableHead{ii},...
            'parent', table,...
            'HorizontalAlignment', 'center');
    kk = kk + 1;

    % Column content  
    for jj = 1:numel(txt_yPositions)-1
        tableTexts(kk) = text(...
            txt_xPositions(ii), txt_yPositions(jj+1), tableContent{jj,ii},...
            'parent', table,...
            'HorizontalAlignment', 'center');
        kk = kk + 1;
    end 
end

结果:

enter image description here

答案 1 :(得分:5)

或许有点矫枉过正:

你可以使用uitable,就像这样

%define your data:
 dat =  {'        green', 1, 2;...
    '        blue', 2,3.1;...   
    '        yellow', 3, 4.8;}
columnname =   {' ', 'Param1', 'Param2'};
columnformat = {'char', 'numeric', 'numeric'}; 
t = uitable('Units','normalized','Position',...
        [0.05 0.05 0.755 0.87], 'Data', dat,... 
        'ColumnName', columnname,...
        'ColumnFormat', columnformat,...
        'RowName',[], 'Parent', gcf);

你只需要知道句柄,如果gcf(获取当前数字)不起作用! 然后你可以调整大小并做任何你想做的事情,让它看起来不错......

答案 2 :(得分:0)

您可以使用num2str功能将参数传递给图例。

  

legend(['red'num2str(param1_red)''num2str(param2_red)],...)