I want to add extra Information to a figure in MATLAB, like this:
Is it possible? (Of course I want it to be more beautiful)
Right click on the figure and select Insert Caption then type out your figure legend. You can apply this also to Tables and Equations.
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.
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.
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
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:
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...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With