Trazar automáticamente diferentes líneas de colores

112

Estoy tratando de trazar varias estimaciones de densidad del kernel en el mismo gráfico y quiero que todas sean de diferentes colores. Tengo una solución kludged que usa una cadena 'rgbcmyk'y la paso por cada trama por separado, pero empiezo a tener duplicados después de 7 iteraciones. ¿Existe una forma más fácil / 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
Doresoom
fuente
30
¿Intentó simplemente hacer "mantener todo"? Eso dibuja automáticamente los colores de las noticias para cada nuevo comando de trama.
twerdster
3
"mantener todo" no es una respuesta a la pregunta real, pero puede ser una solución para muchas personas que terminan aquí porque un simple "aguantar" dibuja todas las curvas en azul. ¡Muchas gracias a @twerdster!
Rémi
8
A partir de R2014b , lo habitual hold ones funcionalmente equivalente a hold all. Sin embargo, permanece la cuestión de cómo obtener más de los 7 colores predeterminados. Un mapa de colores predeterminado puede ser una solución como la describe Azim o se puede usar una función para generar colores ajustados para una fácil discriminación visual, como se muestra a continuación .
chappjc
1
Cuando lo uso hold all, obtengo gráficos en diferentes colores (aunque debo decir que se ven bastante aburridos), mientras que cuando lo uso hold on, todos mis gráficos se vuelven azules. Entonces me pregunto qué es la equivalencia funcional.
Hola
4
@HelloGoodbye En R2014b y más reciente, hold onofrece gráficos de diferentes colores. Estás usando una versión anterior. De los documentos actuales , " hold alles lo mismo que hold on. Nota: esta sintaxis se eliminará en una versión futura. Utilizar en su hold onlugar". Consulte también las notas de la versión .
chappjc

Respuestas:

131

Puede utilizar 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 mapas de colores con nombres diferentes ( 'doc colormap' los enumera todos).

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

Azim
fuente
Lo estaba buscando. Esté bien @Azim.
profesor
Por el bien de la posteridad, elegí aceptar esta respuesta sobre la hold allsolución de @Mark Elliot debido a su versatilidad de poder elegir diferentes mapas de colores.
Doresoom
¿Cómo puedo hacer que funcione usando el comando plot de "línea" en lugar de plot?
Pedro77
106

En realidad, un método de atajo decente para hacer que los colores cambien es usar hold all;en lugar de hold on;. Cada sucesivo plotrotará (automáticamente para usted) a través del mapa de colores predeterminado de MATLAB.

Desde el sitio de MATLAB en hold:

hold allcontiene el trazado y el color de línea actual y el estilo de línea 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 recorriendo los colores y estilos de línea predefinidos desde donde se detuvo el último trazado en la lista.

Mark Elliot
fuente
36

Respuesta tardía, pero dos cosas para agregar:

  • Para obtener información sobre cómo cambiar la 'ColorOrder'propiedad y cómo establecer un valor predeterminado global con 'DefaultAxesColorOrder', consulte el "Apéndice" al final de esta publicación.
  • Existe una gran herramienta en MATLAB Central File Exchange para generar cualquier cantidad de colores visualmente distintos, si tiene la Caja de herramientas de procesamiento de imágenes para usarla. Siga leyendo para conocer los detalles.

La ColorOrder axespropiedad permite MATLAB para el ciclo de forma automática a través de una lista de colores cuando se utiliza hold on/all(de nuevo, véase el Apéndice continuación para saber cómo set/ getla ColorOrderde un eje específico o de forma global a través DefaultAxesColorOrder). Sin embargo, de forma predeterminada, MATLAB solo especifica una lista corta de colores ( solo 7 a partir de R2013b) para recorrer y, por otro lado, puede ser problemático encontrar un buen conjunto de colores para más series de datos. Para 10 parcelas, obviamente no puede confiar en el valor predeterminado ColorOrder.

Una excelente manera de definir N colores visualmente distintos es con el envío "Generar colores máximos perceptualmente distintos" (GMPDC) en MATLAB Central File File Exchange . 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 asemeja más a la percepción humana del color que el RGB. Dada una gran lista inicial de colores posibles, elige iterativamente la entrada en la lista que está más alejada (en el espacio del laboratorio) de todas las entradas elegidas previamente.

Por ejemplo, cuando se solicitan 25 colores:

25 "colores con máxima diferenciación perceptiva"

La presentación de GMPDC fue elegida en el blog oficial de MathWorks como Elección de la semana en 2010 en parte debido a la capacidad de solicitar una cantidad arbitraria de colores (en contraste con los 7 colores predeterminados de MATLAB integrados). Incluso hicieron la excelente sugerencia de configurar MATLAB en ColorOrderel inicio en,

distinguishable_colors(20)

Por supuesto, puede configurar el ColorOrderpara un solo eje o simplemente generar una lista de colores para usar de la manera que desee. Por ejemplo, para generar 10 "colores máximos perceptualmente distintos" y usarlos para 10 gráficos en el mismo eje ( pero sin usar ColorOrder, por lo que se requiere un bucle ):

% 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, sin necesidad de forbucle, con la ColorOrderpropiedad del eje :

% X del tamaño N-por-P-por-2
mpdc10 = colores_distinguibles (10)
ha = ejes; espera (ja, 'encendido')
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 ColorOrdermatriz RGB utilizada para el eje actual,

get(gca,'ColorOrder')

Para obtener el valor predeterminado ColorOrderpara ejes nuevos,

get(0,'DefaultAxesColorOrder')

Ejemplo de configuración de nuevo global ColorOrdercon 10 colores en MATLAB start, en startup.m:

set(0,'DefaultAxesColorOrder',distinguishable_colors(10))
chappjc
fuente
2
Solo una nota, esto parece requerir la Caja de herramientas de procesamiento de imágenes.
Doresoom
2
@Doresoom Gracias por la información. Actualicé la publicación.
chappjc
12

Tarde a la fiesta. Estaba investigando esto yo mismo 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 trazar una matriz y dejar que MATLAB recorra automáticamente los colores especificados.

consulte Cambiar el orden de color predeterminado

ejemplo

set(0,'DefaultAxesColorOrder',jet(5))
A=rand(10,5);
plot(A);
xcuadrado
fuente
1
Para un eje único:set(gca,'ColorOrder',jet(5));
Evgeni Sergeev
1
excelente solo para informar sobre jet (número) que no requiere ninguna
caja de
4

Si todos los vectores tienen el mismo tamaño, cree una matriz y trace una gráfica. Cada columna se traza con un color diferente automáticamente. Luego, puede usar legendpara indicar columnas:

data = randn(100, 5);

figure;
plot(data);

legend(cellstr(num2str((1:size(data,2))')))

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

legend(names)
Serg
fuente