Pour mon projet, j'ai six ensembles de données à mettre sur un nuage de points, comme ceci:

plot(ax, ay, '.r', bx, by, '.b', cx, cy, '.m', dx, dy, '.c', ex, ey, '.y', fx, fy, '.k');

Parfois, ces ensembles de données seront vides, donc bx et by pourraient ne rien contenir, donc être ignorés.

Existe-t-il un moyen de créer une légende qui correspondra à la bonne étiquette avec la bonne couleur de données? En d'autres termes, les données du [cx, cy] correspondraient toujours au libellé 'c' de la légende à côté d'un point magenta, même en l'absence de 'b'. Ma légende actuelle est la suivante:

legend('a', 'b', 'c', 'd', 'e', 'f', -1);

Merci!

1
Rosie 1 août 2017 à 21:00

2 réponses

Meilleure réponse

Vous pouvez obtenir les résultats souhaités si vous remplacez d'abord les ensembles contenant des données vides avec des valeurs NaN. Par exemple:

x = [];
y = [];

if isempty(x) || isempty(y)
  x = nan;
  y = nan;
end

plot(1:10, rand(1,10), 'r', x, y, 'g', 1:10, rand(1,10), 'b');
legend('r', 'g', 'b');

enter image description here

Laisser x et y vides donnerait un avertissement lors de la création de la légende et entraînerait une légende incorrecte. Lors de la transmission de vecteurs vides ([]) à plot, il ne crée tout simplement pas un objet ligne pour ces données. Lors du passage d'une valeur NaN, il crée mais ne rend pas un objet ligne, donc il existe toujours et peut avoir une entrée de légende générée pour lui.

3
gnovice 1 août 2017 à 18:29

Pour compléter @gnovice answer avec l'avantage proposé dans @ Guto answer, si l'ordre des lignes est important, vous pouvez toujours utiliser NaN et définir leur ordre après celui-ci:

x = 1:10;
% plot and get the handle to the lines:
p = plot(x,x,'--g',nan,nan,'r',x,x,'b','linewidth',2);
% set the order of the lines from front to back:
set(p(1).Parent,'Children',p(1).Parent.Children([3 2 1]))
% add the legend:
legend('data 1', 'data 2', 'data 3');

Dans l'exemple ci-dessus, nous plaçons la ligne verte au-dessus de la ligne bleue:

enter image description here

1
EBH 2 août 2017 à 16:02