Pregunta

Estoy tratando de trazar varias estimaciones de la densidad del núcleo en el mismo gráfico, y los quiero a todos ser de colores diferentes. Tengo una solución kludged utilizando una cuerda y 'rgbcmyk' paso a paso a través de él para cada parcela por separado, pero comienza 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
¿Fue útil?

Solución

Se puede usar un mapa de colores como el VHS 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 diferentes con nombre ( 'mapa de colores doc' a todas las listas).

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

Otros consejos

En realidad, un método de acceso directo decente para conseguir los colores de ciclo es utilizar hold all; en lugar de hold on;. Cada plot sucesiva girará (automáticamente para usted) a través del mapa de colores por defecto de MATLAB.

Desde el sitio en MATLAB hold :

  

hold all sostiene la trama y el estilo actual color de la línea y la línea de trazado de manera que los comandos posteriores no restablecen los valores de las propiedades ColorOrder y LineStyleOrder al principio de la lista. Trazado de comandos siguen ciclismo a través de los colores predefinidos y estilos de línea desde donde la última trama se detuvo en la lista.

Respuesta tarde, pero dos cosas que añadir:

  • 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 este post.
  • Hay una gran herramienta en la Bolsa de Archivo Central de MATLAB para generar cualquier número de colores visualmente distintas, si usted tiene la Imagen Processing Toolbox para usarlo. Siga leyendo para conocer más detalles.

El href="http://www.mathworks.com/help/matlab/ref/axes_props.html#ColorOrder"> propiedad ColorOrder axes permite MATLAB para desplazarse automáticamente a través de una lista de colores cuando usando hold on/all (de nuevo, véase el apéndice a continuación cómo set / get la ColorOrder para un eje específico o globalmente a través de DefaultAxesColorOrder). Sin embargo, de forma predeterminada MATLAB sólo especifica una lista corta de colores ( sólo 7 a partir del R2013b) para recorrer, y por otro lado, puede ser problemático encontrar un buen un conjunto de colores para más series de datos. Durante 10 parcelas, es obvio que no se puede confiar en la ColorOrder por defecto.

Una gran manera de Definir N visualmente distintos colores es con el " Generar presentación en grado máximo perceptivamente distinta Colores"(GMPDC) en el MATLAB archivo central de Intercambio de archivos . Se describe mejor en las propias palabras del autor:

  

Esta función genera un conjunto de colores que se distinguen por referencia a la "Laboratorio" espacio de color, que más de cerca partidos percepción humana del color RGB. Dada una gran lista inicial de posibles colores, es iterativamente elige la entrada en la lista que está más lejos (en el espacio Lab) a partir de todas las entradas seleccionadas previamente.

Por ejemplo, cuando se solicitan 25 colores:

25 "colores al máximo perceptualmente distintas" " loading="lazy" fetchpriority="high"> </p>

<P> La presentación GMPDC fue elegido en el blog oficial MathWorks como <a href = "http://blogs.mathworks.com/pick/2010/12/23/generate-distinct-colors-for-your-matlab-plots / "> lo mejor de la semana en </a> 2010, en parte debido a la posibilidad de solicitar un número arbitrario de colores (en contraste con MATLAB construida en 7 colores por defecto). Incluso hicieron la excelente sugerencia para establecer <code>ColorOrder</code> de MATLAB en el arranque a, </p>

<pre><code>distinguishable_colors(20)
</code></pre>

<P> Por supuesto, se puede establecer el <code>ColorOrder</code> para un solo eje o simplemente generar una lista de colores a utilizar en cualquier forma que desee. Por ejemplo, para generar 10 "colores máximamente perceptualmente distintas" y utilizarlos para 10 parcelas en el mismo eje (<strong> pero que no utilizan <code>ColorOrder</code>, requiriendo así un bucle </strong>): </p>

<pre><code>% 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),

El proceso se simplifica, requiere ningún bucle for, con la propiedad eje ColorOrder :

% X of size N-by-P-by-2
mpdc10 = distinguishable_colors(10)
ha = axes; hold(ha,'on')
set(ha,'ColorOrder',mpdc10)    % --- set ColorOrder HERE ---
plot(X(:,:,1),X(:,:,2),'-.')   % loop NOT needed, 'Color' NOT needed. Yay!

APÉNDICE

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

get(gca,'ColorOrder')

Para obtener el ColorOrder defecto para los nuevos ejes,

get(0,'DefaultAxesColorOrder')

Ejemplo de ajuste nueva ColorOrder global con 10 colores en el arranque de MATLAB, en startup.m:

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

tarde a la fiesta. Yo estaba buscando en esto mismo y acabo de encontrar sobre este ejes opción llamada ColorOrder puede especificar el orden de los colores para la sesión o sólo por la figura y luego simplemente trazar una matriz y dejar que MATLAB ciclo de forma automática a través de los colores especificados.

Cambiar el defecto ColorOrder

ejemplo

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

Si todos los vectores tienen igual tamaño, crear una matriz y la trama de la misma. Cada columna se representa con un color diferente automáticamente A continuación, se puede utilizar para indicar legend columnas:

data = randn(100, 5);

figure;
plot(data);

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

O, si usted tiene una celda con nombres granos, utilice

legend(names)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top