2012-05-24 11 views
9

Estoy trazando datos en un formato de diagrama de dispersión MATLAB típico. Por lo general cuando se traza múltiples conjuntos de datos, me gustaría utilizar el comando 'aferrarse;', y luego trazar cada uno de los datos, seguido de esto para conseguir mi leyenda:Gráfico de gráfico MATLAB: asignación de etiquetas de leyenda durante el gráfico

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

Sin embargo, los (múltiples) de datos estoy conspirando en los mismos ejes no son necesariamente los mismos conjuntos de datos cada vez. Estoy trazando hasta seis conjuntos diferentes de datos en los mismos ejes, y podría haber una combinación de estos (dependiendo de lo que el usuario decida mostrar). Obviamente, eso sería mucho más si quisiera configurar la leyenda de la manera tradicional.

Lo que realmente me gustaría hacer es asignar a cada DataSet un nombre , ya que está tramado para que luego pueda simplemente recuperar una leyenda de todos los datos que se muestran.

... O, cualquier otra solución a este problema que a nadie se le ocurra ...?

Respuesta

11

Una opción es tomar ventaja de la propiedad 'UserData' así:

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: Como el interrogador señaló, la versión original podría desordenar Para solucionar esto, especifique qué identificador va con qué etiqueta (en la versión fija, está en el orden correcto).

+0

Este método parece mezclar los colores y nombres ... ¿A menos que lo implemente incorrectamente? – CaptainProg

+0

qué quieres decir, exactamente ... Ah, ya veo. Ok, prueba la nueva versión! – tmpearce

+0

Fantástico. Gracias. – CaptainProg

3

Usted puede intentar algo como lo siguiente

for k = 1:10 

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

end 

legend(h, name); 
+0

Esto también funciona. – CaptainProg

18

Usted debe ser capaz de establecer la propiedad DisplayName para cada parcela:

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

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

Nota al margen: He encontrado un montón de pequeños trucos como esto consiguiendo la cifra de buscar la de la forma que yo quiera, luego elija la opción de menú "Archivo" de la Figura "Generar M-Archivo ..." e inspeccione el código de salida generado.

+0

¡buena nota! –

10

Uso 'DisplayName' como una propiedad plot(), y llame a su leyenda como

legend('-DynamicLegend'); 

Mi código es el siguiente:

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 

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

+3

¡Esta o la respuesta de Jonathan deberían ser las aceptadas! – Ela782

0

Hacer un bucle. Pero antes del ciclo for, crea una matriz.

%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). 
Cuestiones relacionadas