2012-05-24 14 views
9

Sto analizzando i dati in un tipico formato di dispersione MATLAB. Di solito quando si stampa più set di dati, vorrei utilizzare il comando 'aggrapparsi;', e poi tracciare ognuno dei dati, seguita da questo per ottenere la mia leggenda:Disegno grafico MATLAB: assegnazione delle etichette delle legende durante il plottaggio

legend('DataSet1', 'DataSet2') % etcetera 

Tuttavia, i (più) insiemi di dati sto tramando sugli stessi assi non sono necessariamente gli stessi set di dati ogni volta. Sto tracciando fino a sei diversi set di dati sugli stessi assi, e potrebbe esserci una combinazione di questi (a seconda di cosa l'utente sceglie di visualizzare). Ovviamente quello sarebbe un sacco di elseif se volessi impostare la leggenda in modo tradizionale.

Quello che vorrei fare è assegnare a ciascun DataSet un nome in quanto è tracciato in modo che successivamente sia possibile richiamare una legenda di tutti i dati visualizzati.

... O qualsiasi altra soluzione a questo problema a cui qualcuno possa pensare ..?

risposta

11

Una possibilità è quella di sfruttare la proprietà 'UserData' in questo modo:

figure; 
hold on 
plot([0 1], [1 0], '-b', 'userdata', 'blue line') 
plot([1 0], [1 0], '--r', 'userdata', 'red dashes') 

% legend(get(get(gca, 'children'), 'userdata'))      % wrong 
legend(get(gca, 'children'), get(get(gca, 'children'), 'userdata')) % correct 

Edit: Come l'interrogante ha sottolineato, la versione originale potrebbe andare fuori ordine. Per risolvere questo problema, specifica quale handle va con quale etichetta (nella versione fissa, è nell'ordine corretto).

+0

Questo metodo sembra mescolare i colori e i nomi ... A meno che non lo stia implementando in modo errato? – CaptainProg

+0

cosa intendi, esattamente ... Ah, capisco. Ok, prova la nuova versione! – tmpearce

+0

Fantastico. Grazie. – CaptainProg

3

Si può provare qualcosa di simile al seguente

for k = 1:10 

    h(k) = plot(...); 
    name{k} = ['condition ' num2str(k)]; 

end 

legend(h, name); 
+0

Anche questo funziona. – CaptainProg

18

Si dovrebbe essere in grado di impostare la proprietà DisplayName per ogni trama:

figure 
hold on 
plot(...,'DisplayName','DataSet1') 
plot(...,'DisplayName','DataSet2') 
legend(gca,'show') 

http://www.mathworks.com/help/matlab/ref/line_props.html

Nota a margine: ho trovato un sacco di piccoli trucchi come questo da ottenere la cifra di guardare la modo che voglio, quindi scegliendo l'opzione di menu "File" della figura "Genera M-File ..." e ispezionando il codice di output generato.

+0

buon lato nota! –

10

Usa 'DisplayName' come una proprietà plot(), e chiamare il leggenda come

legend('-DynamicLegend'); 

Il mio codice è simile al seguente:

x = 0:h:xmax;         %// get an array of x-values 
y = someFunction;        %// function 
plot(x, y, 'DisplayName', 'Function plot 1'); %// plot with 'DisplayName' property 

legend('-DynamicLegend',2);     %// '-DynamicLegend' legend 

Fonte: http://undocumentedmatlab.com/blog/legend-semi-documented-feature/

+3

Questa o la risposta di Jonathan dovrebbero essere accettate! – Ela782

0

Fai un ciclo for. Ma prima del ciclo for, crea un array.

%for example 

legendset = {} 

for i = 1:10 

%blabla 
%Then in the fore loop say: 

legendset = [legendset;namedata(i)] 

%It puts all names in a column of legendset. 
%Make sure namedata are characters. 

%foreloop ends 
end 

%Then after the foreloop say: 

legend(legendset). 
Problemi correlati