I put together something fairly general, see below.
I will generalize this a bit more and post it to File Exchange, I think this is a pretty good tool:
I intend to
- automatically adjusts the size of the table to fit its contents
- makes it suitable for placing symbols
- tie the table and the legend together by moving them with the mouse
- make the title optional
- support for various input types
But for now:
% 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
Result:
