Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add extra information to figure's legend?

I want to add extra Information to a figure in MATLAB, like this:

enter image description here

Is it possible? (Of course I want it to be more beautiful)

like image 675
nazemian Avatar asked Sep 10 '13 10:09

nazemian


People also ask

How do I add a legend to a figure caption?

Right click on the figure and select Insert Caption then type out your figure legend. You can apply this also to Tables and Equations.

What makes a good figure legend?

Key Features of a Good Figure LegendIt can be either descriptive (stating the process or type of analysis of the experiment) or declarative (stating the key findings or summarizing the results of the experiment). Materials and Methods– This is the section to describe the techniques used in the experiment.

How long should a figure legend be?

Limit it to one or a few sentences that describe the key findings that are seen in the figure. Example: Patch-clamp recording on Prox1::eGFP-expressing neurons showed spontaneous postsynaptic currents. Side note: You might not have a choice to keep the legends short.


2 Answers

I put together something reasonably generic, see below.

I will generalize this a bit more and post it to the File Exchange, I think it's a fairly nice tool to have around :)

I intend to

  • automatically adjust the table size to fit its contents
  • make it suited for arbitrary legend placement
  • couple the table and legend together when moving them with the mouse
  • make the header optional
  • support various types of input

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:

enter image description here

like image 97
Rody Oldenhuis Avatar answered Oct 10 '22 03:10

Rody Oldenhuis


Well perhaps a bit of an overkill:

You could use uitable, like this

%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);

you just need to know the handle, if gcf (get current figure) doesnt work! you can then resize and do whatever you want, to make it look nice...

like image 5
Lucius II. Avatar answered Oct 10 '22 01:10

Lucius II.