2012-12-03 2 views
34
t = 0 : 0.01 : 2 * pi; 
s = sin(t); 
c = cos(t); 
m = -sin(t); 

hold on; 
plot(t, s, 'r'); 
plot(t, c, 'b'); 
plot(t, m, 'g'); 
hold off; 

legend('', 'cosine', ''); 

The PlottingCome mostrare la legenda solo per un determinato sottoinsieme di curve nella stampa?

Non ci sono più curve nel mio tracciato. Voglio visualizzare la legenda solo per alcuni di essi. Come lo faccio?

Ad esempio, come si fa a rendere visibile solo la legenda per la curva del coseno nel disegno sopra? Quando chiamo le funzioni legend() come legend('', 'cosine'); invece di aggiungere il terzo parametro vuoto, in effetti la terza riga verde viene rimossa dalla legenda. Ma questo non risolve il mio problema, perché la linea rossa indesiderata rimane visibile.

risposta

26

Memorizzare le maniglie della legenda desiderate in in una variabile e passare la matrice su legend. Nel tuo caso, sarebbe solo un valore, in questo modo:

hold on; 
plot(t, s, 'r'); 
h2 = plot(t, c, 'b'); % # Storing only the desired handle 
plot(t, m, 'g'); 
hold off; 

legend(h2, 'cosine'); % # Passing only the desired handle 

Si dovrebbe ottenere questa trama:

enter image description here

+2

Si noti che con questo approccio, una volta che si disattiva la legenda e riaccendila tramite l'interfaccia utente, tutte le linee torneranno nella legenda. – Jonas

+0

@Jonas grazie per averlo indicato. –

+0

PNG è migliore per questo tipo di immagine. –

5

Cominciamo con le variabili e li Trama:

t = 0 : 0.01 : 2 * pi; 
s = sin(t); 
c = cos(t); 
m = -sin(t); 

figure; 
hold ('all'); 
hs = plot(t, s); 
hc = plot(t, c); 
hm = plot(t, m); 

C'è una proprietà chiamata IconDisplayStyle. È sepolto abbastanza in profondità. Il percorso è necessario seguire è:

Line -> Annotazione -> LegendInformation -> IconDisplayStyle

Impostare la proprietà IconDisplayStyleoff vi permetterà di saltare quella linea. Ad esempio, ho intenzione di disattivare la legenda di hs.

hsAnno = get(hs, 'Annotation'); 
hsLegend = get(hsAnno, 'LegendInformation'); 
set(hsLegend, 'IconDisplayStyle', 'off'); 

Naturalmente si può andare avanti e fare in questo modo:

set(get(get(hs, 'Annotation'), 'LegendInformation'), 'IconDisplayStyle', 'off'); 

ma trovo molto più difficile da capire.

Ora, la funzione legend salterà semplicemente hs.

Terminare il mio codice con questo:

legend('cosine', 'repeat for this handle') 

vi darà questa: enter image description here

EDIT: Jonas ha avuto un bel suggerimento nei commenti: Impostazione della proprietà DisplayName di hc in questo modo:

set(hc, 'DisplayName', 'cosine'); 
legend(gca, 'show'); 

ti daranno la leggenda di cui hai bisogno. Avrai associato il tuo handle di linea con 'cosine'. Quindi, puoi semplicemente chiamare la legenda con i parametri 'off' o 'show'.

+2

Suggerisco di impostare 'DisplayName' proprietà della linea gestisce, piuttosto che chiamare 'legend' con i nomi, in modo che il risultato sia lo stesso dopo aver attivato o disattivato la legenda nella GUI. – Jonas

+0

Grazie a @Jonas. Aggiornato la mia risposta. – HebeleHododo

1

Si potrebbe semplicemente cambiare l'ordine in wich le curve sono tracciate e applicare la leggenda alla prima curva:

t = 0 : 0.01 : 2 * pi; 
s = sin(t); 
c = cos(t); 
m = -sin(t); 

plot(t,c,t,s,t,m) % cosine is plotted FIRST 
legend('cosine') % legend for the FIRST element 

se avessi voglia di mettere in una leggenda per il coseno e -seno:

plot(t,c,t,m,t,s) % cosine and -sine are first and second curves 
legend('cosine', '-sine') 
31

Non mi piace memorizzare i valori di handle, diventa un disastro quando ho un sacco di grafici nelle mie figure. Quindi ho trovato un'altra soluzione.

t = 0 : 0.01 : 2 * pi; 
s = sin(t); 
c = cos(t); 
m = -sin(t); 
hold on; 
plot(t, s, 'r', 'HandleVisibility','off'); % Plotting and telling to hide legend handle 
h2 = plot(t, c, 'b', 'DisplayName', 'cosine'); % Plotting and giving legend name 
plot(t, m, 'g', 'HandleVisibility','off'); % Plotting and telling to hide legend handle 

legend show % Generating legend based on already submitted values 

Questo mi dà lo stesso grafico mostrato nella risposta di Eitan T.

Si noti che ciò influirà anche su altre funzioni MATLAB, ad esempio cla rimuovere solo i grafici menzionati nella legenda. Cerca HandleVisibility nella documentazione di Matlab per ulteriori informazioni al riguardo.

+3

+1 soluzione elegante ho usato questo. – neuronet

+2

ha usato anche questo, dato che utilizzo curve con nomi dinamici (funziona alla perfezione per tracciare una deviazione standard ma nascondendole nella legenda). – gaborous

+2

La soluzione migliore se si desidera apportare queste modifiche direttamente nell'interfaccia utente. –

1

Per espandere la risposta di Sebastian, ho un caso particolare in cui sto tracciando diverse linee in uno dei due formati (travi sia in compressione o tensione) ed è stato in grado di tracciare trama specifica maniglie nella leggenda fino a quando il etichette erano della stessa lunghezza

for ii=1:nBeams 
    if X(ii)<0 %Bars with negative force are in compession 
     h1=plot(linspace(beamCord(ii,1),beamCord(ii,3)),... 
      linspace(beamCord(ii,2),beamCord(ii,4)),'r:'); 
    elseif X(ii)>0 %Bars with positive force are in tension 
     h2=plot(linspace(beamCord(ii,1),beamCord(ii,3)),... 
      linspace(beamCord(ii,2),beamCord(ii,4)),'b'); 
    end 
end 

legend([h1;h2],['Compression';'Tension ']); 

Dove sono stati aggiunti 4 spazi dietro 'tensione' in modo che il numero di caratteri è coerente.

-2

rapida in-plot mod:

  1. tagliare tutto ciò che non si vuole apparire nella legenda
  2. Applicare leggenda
  3. Incolla
+0

Utilizzare una formattazione integrata chiara :) –

+0

Cosa intendi per taglia e incolla? Intendi spostare gli altri comandi 'plot' dopo il comando' legend'? Fornisci uno snippet di codice da dimostrare. – Cecilia