2017-08-05 4 views
1

Prenons l'exemple suivant:Terrain Matlab - entrée Légende pour plusieurs lignes de données - getColumn

x = magic(3); 
figure(1); clf(1); 
plot(x, '-r', 'DisplayName', 'Magic'); 
legend('show'); 

Les entrées de légende résultant en Matlab R2014a sont
getColumn (magie, 1)
getColumn (Magie, 2)
getcolumn (Magic, 3)

Le problème vient de function [leg,labelhandles,outH,outM] = legend(varargin) dans legend.m (Droit d'auteur 1984-2012 The MathWorks, Inc.), ligne 628:
str{k} = get(ch(k),'DisplayName');
Plus précisément, la fonction get

  • précèder getcolumn( et
  • ajouter ses , <Column Number>).

est-il un moyen facile d'afficher exactement une entrée de légende (ou multiple, mais sans les chaînes rajoutés) pour plusieurs lignes de données portant le nom DisplayName, qui ont les mêmes propriétés visuelles?

Une alternative serait bien sûr de créer plusieurs entrées de légende (ou une seule) par le biais de poignées de tracé (voir ci-dessous), mais je voudrais que les choses restent courtes et simples.

Une entrée:

x = magic(3); 
figure(1); clf(1); 
h = plot(x, '-r'); 
legend(h(1), 'Magic'); 

entrées multiples:

x = magic(3); 
figure(1); clf(1); 
h = plot(x, '-r'); 
strL = cell(1, numel(h)); 
for k = 1:numel(h) 
    strL{k} = sprintf('Magic %d', k); 
end 
legend(h, strL); 

dans Matlab R2014b, le problème avec getColumn (Nom, Row) ne semble pas plus pour la première exemple de code.

Répondre

1

Si vous souhaitez définir des noms d'affichage multiples pour les entrées de légende dans la syntaxe courte, il vous suffit de préparer une matrice de cellules avec eux, disons qu'il est appelé leg_names, puis utiliser set pour les appliquer à tous à la fois:

set(p,{'DisplayName'},leg_names); 

Jetons un coup d'oeil à un exemple:

x = magic(3); % your data 
p = plot(x,'-r'); % plot and get an array of handles to the lines 
% create a list of the desired names for the legend entries: 
leg_names = [repmat('Magic ',size(x,2),1) num2str((1:size(x,2)).')]; 
set(p,{'DisplayName'},cellstr(leg_names)); % set all display names 
legend('show'); % show the legend 

le résultat est exactement comme dans vos exemples à la fin de la question.

Notez également que la syntaxe: [lgd,icons,plots,txt] = legend(___) n'est pas recommandé (from the docs):

Note: Cette syntaxe est pas recommandée. Il crée une légende qui ne prend pas en charge toutes les fonctionnalités graphiques. Au lieu de cela, utilisez la syntaxe lgd = legend(__) pour retourner l'objet Légende et définir les propriétés de la légende.