Pregunta sobre legend, matlab – Gráfica MATLAB: asignando etiquetas de leyenda durante la gráfica

10

Estoy trazando datos en un formato típico de diagrama de dispersión MATLAB. Por lo general, al trazar múltiples conjuntos de datos, usaría el comando 'mantener'; y luego trazaré cada uno de los datos, seguido de esto para obtener mi leyenda:

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

Sin embargo, los conjuntos de datos (múltiples) que estoy trazando 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 cualquier combinación de estos mostrados (dependiendo de lo que el usuario elija mostrar). Obviamente, eso sería un montón de elseif si quisiera configurar la leyenda de la manera tradicional.

Lo que realmente me gustaría hacer es asignar un nombre a cada DataSetcomo se traza para que luego pueda recuperar una leyenda de todos los datos que se muestran.

... O, ¿alguna otra solución a este problema que alguien pueda pensar ...?

Tu respuesta

5   la respuesta
0

Hacer un bucle for. Pero antes del bucle for, haz 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). 
11

Una opción es aprovechar el'UserData' propiedad como tal:

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 salir de orden. Para solucionar este problema, especifique qué controlador va con qué etiqueta (en la versión fija, está en el orden correcto).

Este método parece mezclar los colores y los nombres ... ¿A menos que lo esté implementando incorrectamente? CaptainProg
Fantástico. Gracias. CaptainProg
¿Qué quieres decir exactamente? Ah, ya veo. Ok, prueba la nueva versión! tmpearce
¡Esta es una muy buena solución! H.Muster
19

Debería poder establecer la propiedad DisplayName para cada gráfico:

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: encontré muchos pequeños trucos como este haciendo que la figura se vea como quiero, luego seleccionando la opción de menú "Archivo" de la Figura "Generar archivo M ..." e inspeccionando el código de salida generado.

buena nota al margen! samad montazeri
3

Puedes probar algo como lo siguiente

for k = 1:10

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

end

legend(h, name);
Esto también funciona. CaptainProg
10

Utilizar'DisplayName' como unplot() propiedad, y llamar a su leyenda como

legend('-DynamicLegend');

Mi código se ve así:

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/

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

Preguntas relacionadas