Trazar automáticamente diferentes líneas de color

Estoy tratando de trazar varias estimaciones de densidad de kernel en el mismo gráfico, y quiero que todos sean de diferentes colores. Tengo una solución kludged usando una cadena 'rgbcmyk' y paso a través de cada diagtwig por separado, pero empiezo a tener duplicados después de 7 iteraciones. ¿Hay una manera más fácil / más eficiente de hacer esto y con más opciones de color?

 for n=1:10 source(n).data=normrnd(rand()*100,abs(rand()*50),100,1); %generate random data end cstring='rgbcmyk'; % color string figure hold on for n=1:length(source) [f,x]=ksdensity(source(n).data); % calculate the distribution plot(x,f,cstring(mod(n,7)+1)) % plot with a different color each time end 

Puede usar un mapa de colores como HSV para generar un conjunto de colores. Por ejemplo:

 cc=hsv(12); figure; hold on; for i=1:12 plot([0 1],[0 i],'color',cc(i,:)); end 

MATLAB tiene 13 diferentes mapas de color nombrados ( ‘doc colormap’ los enumera a todos).

Otra opción para trazar líneas en diferentes colores es usar la propiedad LineStyleOrder ; ver Definir el color de las líneas para trazar en la documentación de MATLAB para más información.

En realidad, un método abreviado decente para hacer que los colores funcionen es utilizar hold all; en lugar de hold on; . Cada plot sucesiva rotará (automáticamente para usted) a través del mapa de colores predeterminado de MATLAB.

Desde el sitio de MATLAB en hold :

hold all contiene el trazado y el color de línea y el estilo de línea actuales para que los comandos de trazado posteriores no restablezcan los valores de las propiedades ColorOrder y LineStyleOrder al principio de la lista. Los comandos de trazado continúan ciclando a través de los colores y estilos predefinidos desde donde se detuvo el último trazado en la lista.

Respuesta tardía, pero dos cosas para agregar:

  • Para obtener información sobre cómo cambiar la propiedad 'ColorOrder' y cómo establecer un valor predeterminado global con 'DefaultAxesColorOrder' , consulte el “Apéndice” en la parte inferior de esta publicación.
  • Existe una gran herramienta en MATLAB Central File Exchange para generar cualquier número de colores visualmente distintos, si tiene la Caja de herramientas de procesamiento de imágenes para usarlo. Sigue leyendo para más detalles.

La propiedad de axes ColorOrder permite a MATLAB recorrer automáticamente una lista de colores cuando usa hold on/all (nuevamente, consulte el Apéndice a continuación para saber cómo set / get el ColorOrder para un eje específico o globalmente a través de DefaultAxesColorOrder ). Sin embargo, de forma predeterminada, MATLAB solo especifica una lista breve de colores ( solo 7 a partir de R2013b) para pasar, y por otro lado puede ser problemático encontrar un buen conjunto de colores para más series de datos. Para 10 ttwigs, obviamente no puede confiar en el ColorOrder predeterminado.

Una excelente manera de definir N colores visualmente distintos es con la presentación “Generar colores significativamente distintos perceptibles” (GMPDC) en el intercambio central de archivos de archivos de MATLAB . Se describe mejor en las propias palabras del autor:

Esta función genera un conjunto de colores que se distinguen por referencia al espacio de color “Lab” , que se aproxima más a la percepción del color humano que RGB. Dada una gran lista inicial de colores posibles, selecciona iterativamente la entrada en la lista que está más alejada (en el espacio Lab) de todas las entradas elegidas previamente.

Por ejemplo, cuando se solicitan 25 colores:

25

La presentación de GMPDC se eligió en el blog oficial de MathWorks como Pick of the Week en 2010 en parte debido a la posibilidad de solicitar una cantidad arbitraria de colores (en contraste con los 7 colores predeterminados de MATLAB). Incluso hicieron la excelente sugerencia de establecer ColorOrder de MATLAB en el inicio para,

 distinguishable_colors(20) 

Por supuesto, puede configurar el ColorOrder para un solo eje o simplemente generar una lista de colores para usar de la manera que desee. Por ejemplo, para generar 10 “colores máximamente perceptualmente distintos” y usarlos para 10 trazados en el mismo eje ( pero no usando ColorOrder , lo que requiere un ciclo ):

 % Starting with X of size N-by-P-by-2, where P is number of plots mpdc10 = distinguishable_colors(10) % 10x3 color list hold on for ii=1:size(X,2), plot(X(:,ii,1),X(:,ii,2),'.','Color',mpdc10(ii,:)); end 

El proceso se simplifica y no requiere bucle, con la propiedad del eje ColorOrder :

 % X de tamaño N-by-P-by-2
 mpdc10 = distinguishable_colors (10)
 ha = ejes;  mantener (ha, 'on')
 set (ha, 'ColorOrder', mpdc10)% --- set ColorOrder AQUÍ ---
 plot (X (:,:, 1), X (:,:, 2), '-.')% loop NO es necesario, 'Color' NO es necesario.  ¡Hurra!

APÉNDICE

Para obtener la matriz ColorOrder RGB utilizada para el eje actual,

 get(gca,'ColorOrder') 

Para obtener el ColorOrder predeterminado para nuevos ejes,

 get(0,'DefaultAxesColorOrder') 

Ejemplo de configuración del nuevo ColorOrder global con 10 colores en el inicio de MATLAB, en startup.m :

 set(0,'DefaultAxesColorOrder',distinguishable_colors(10)) 

Tarde a la fiesta. Estuve investigando esto y acabo de encontrar esta opción de ejes llamada ColorOrder, puede especificar el orden de color para la sesión o solo para la figura y luego solo trazar una matriz y dejar que MATLAB automáticamente recorra los colores especificados.

ver Cambiar el ColorOrder predeterminado

ejemplo

 set(0,'DefaultAxesColorOrder',jet(5)) A=rand(10,5); plot(A); 

Si todos los vectores tienen el mismo tamaño, crea una matriz y traza. Cada columna se traza con un color diferente automáticamente. Luego puede usar la legend para indicar columnas:

 data = randn(100, 5); figure; plot(data); legend(cellstr(num2str((1:size(data,2))'))) 

O, si tiene una celda con nombres de kernels, use

 legend(names)