Как добавить дополнительную информацию в легенду рисунка?

Я хочу добавить дополнительную информацию к фигуре в MATLAB, например:

введите здесь описание изображения

Является ли это возможным? (Конечно хочется, чтобы было красивее)


person nazemian    schedule 10.09.2013    source источник
comment
Вы можете использовать LaTeX в метках легенды, будет ли этого достаточно?   -  person Rody Oldenhuis    schedule 10.09.2013
comment
Да, не могли бы вы дать мне команды LaTeX для этой цели?   -  person nazemian    schedule 10.09.2013
comment
Итак, вы хотите стол с главой рядом с вашей легендой?   -  person Rody Oldenhuis    schedule 10.09.2013
comment
@RodyOldenhuis хорошо, мне было бы интересно, как использовать латекс\как создать таблицу в легенде ... :)   -  person Lucius II.    schedule 10.09.2013
comment
@LuciusDomitiusAhenobarbus: не таблица, конечно, а красиво напечатанный список значений параметров рядом с каждой меткой графика.   -  person Rody Oldenhuis    schedule 10.09.2013
comment
@RodyOldenhuis, это не предназначалось для критики, мне это действительно интересно!   -  person Lucius II.    schedule 10.09.2013
comment
@LuciusDomitiusAhenobarbus: хорошо, смотрите мой ответ :)   -  person Rody Oldenhuis    schedule 10.09.2013


Ответы (3)


Я собрал что-то достаточно общее, см. ниже.

Я немного обобщу это и опубликую на File Exchange, я думаю, что это довольно хороший инструмент, который нужно иметь под рукой :)

я собираюсь

  • автоматически настроить размер таблицы в соответствии с ее содержимым
  • сделать его подходящим для произвольного размещения легенды
  • соединить таблицу и легенду вместе при перемещении их мышью
  • сделать заголовок необязательным
  • поддержка различных типов ввода

Но сейчас:

% 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

Результат:

введите здесь описание изображения

person Rody Oldenhuis    schedule 10.09.2013
comment
@SardarUsama у меня есть эта ошибка с Matlab R2018a Error using imglegend (line 24) Each legend entry must have a corresponding row in the table. и Error using matlab.graphics.illustration.Legend/set Error setting property 'Position' of class 'Legend': Value must be numeric and finite - person Antonio; 08.06.2019
comment
Поведение легенды, кажется, изменилось в более новых версиях. С тем же кодом метки не оцениваются как предназначенные (R2018a Update-2). То же самое можно сделать с помощью labels = legendHandle.String; - person Sardar Usama; 08.06.2019
comment
@SardarUsama теперь работает. спасибо, вы были очень добры и терпеливы. Я изучаю, как работает код, чтобы понять - person Antonio; 08.06.2019

Ну, пожалуй, немного перебор:

Вы можете использовать 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 (получить текущую цифру) не работает! затем вы можете изменить размер и сделать все, что хотите, чтобы это выглядело красиво...

person Lucius II.    schedule 10.09.2013

Вы можете использовать функцию num2str для передачи параметров в легенду.

легенда(['красный' num2str(param1_red) ' ' num2str(param2_red)], ... )

person claudiop    schedule 10.09.2013