web-dev-qa-db-fra.com

Ajout à une légende après chaque itération

Je cours

loglog(x,y);
legend('First script');

depuis le premier script . Ensuite, hold on;. Je lance un deuxième script similaire . Je vois deux graphiques correctement, mais seule la légende initiale . Je veux incrémenter la légende à partir de scripts différents.

Comment pouvez-vous ajouter à la légende à partir d'un seul script?

Un autre moyen de le faire s'appelle 'DisplayName':

hold all
for ind=1:3
x=[0:0.1:10];
plot(x, sin(x)+ind, 'DisplayName',['sin + ' num2str(ind)]);
end
legend(gca,'show')

Utilisez simplement cette propriété lorsque vous tracez de n'importe où vers n'importe quel axe :)

Il y a encore plus de choses possibles, comme une légende dynamique!

Pour plus d'informations, voir ceci: légende dynamique de matlab non documenté

MODIFIER

vous devez mettre à jour la légende après chaque exécution d'un script. vous pouvez le faire avec la légende dynamique ou simplement avec légende ('off'); légende ('show')

18
Lucius II.

Le moyen le plus simple consiste à enregistrer le descripteur dans la légende lorsque vous la créez, puis vous êtes prêt à mettre à jour le tracé avec une nouvelle légende avec une autre série incluse, supprimez la légende et créez-en une nouvelle:

legendStrings = {'First script'};
h_legend = legend(legendStrings{:});
% ... computations, hold on and additional plot on axis
delete(h_legend);
legendStrings{end+1} = 'Second script';
h_legend = legend(legendStrings{:});
% rinse and repeat...

Habituellement, avec des objets graphiques, tels qu'une zone de texte, je dirais qu'il suffit de réutiliser l'objet via la poignée (ne pas delete). Cependant, si vous mettez à jour la légende au lieu de remplacez elle, vous devez vous préoccuper de plus que des chaînes. La solution MathWorks référencée par zroth semble en fait répondre à cette approche!

Comme alternative à delete et créer new, vous pouvez également activer/désactiver la légende avec legend('off'); legend('show'); comme le suggère la réponse dans le commentaire de Eugenio.

5
chappjc

Le moyen le plus simple est: 

hold all;
p1=plot(1:10,1:10);  
legend(p1,'1');  % in this way plot(x,y) is saved as variable p1 with name '1'   
p2=plot(1:10,11:20); % different data set

legend(p2,'2');  
legend(gca,'off');    
legend('show');

Ceci est la connexion de quelques méthodes, c'est très simple et il pourrait être utilisé partout.

2
gajun5

J'avais un problème similaire: j'ai d'abord tracé trois ensembles de données expérimentales, puis mon estimation des paramètres a été simulée pour simuler la fonction. . Et je voulais que la légende le montre. J'ai été capable de le faire avec une combinaison de solutions de différentes questions.

Commandes initiales (haut de ma main)

close all s'assurera que votre parcelle recommence chaque fois

Première parcelle (dans ma principale)

plot(points,expdata1,'ro','DisplayName','Experimental, L= 0.1 m'); hold on
plot(points,expdata2,'bo','DisplayName','Experimental, L= 0.2 m'); 
plot(points,expdata3,'go','DisplayName','Experimental, L= 0.3 m');   
legend('-DynamicLegend','Location','Best')
drawnow
h_old=plot(0,250);

drawnow force le complot à être tracé immédiatement, et h_old est juste un "espace réservé" que je me servirai plus tard. J'ai choisi 0,250 parce que c'est dans la plage des données (sinon ça gâche l'axe)

Deuxième tracé (dans la fonction appelée)

h(1)=plot(points,modeldata1,'r-','DisplayName','Model Data, L= 0.1 m');
h(2)=plot(points,modeldata2,'b-','DisplayName','Model Data, L= 0.2 m'); 
h(3)=plot(points,modeldata3,'g-','DisplayName','Model Data, L= 0.3 m');
delete(h_old);
h_old = h;
drawnow

Je supprime h_old et l'écrase avec les nouvelles parcelles que j'ai créées. De cette façon, à la deuxième itération, le tracé de la 2e itération sera tracé, le tracé de la 1ère sera supprimé et, après ces opérations, je l'aurai pour afficher le tracé (à nouveau drawnow).

1
laureapresa
plot(x,y);
legend('y');

hold on;
plot(x,z);
hold off;

% Now add a new item to the legend

h = legend();
newleg = h.String;
newleg{end+1} = 'z';
legend(newleg);
0
TyCoon