automáticamente trazar diferentes líneas de color
-
19-09-2019 - |
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
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
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:
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.
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)