¿Cómo generar un mapa de colores no lineal / barra de color?

Me gustaría mostrar una barra de color no uniforme como en la primera imagen. He intentado el código a continuación. ‘mycamp4’ es un mapa de color guardado manualmente. El resultado se muestra como la segunda figura. El número 0.1 y 1.5 estarán demasiado cerrados también. ¿Cómo puedo hacer que la barra de color sea como en la primera imagen?

 v = [0.1 1 1.5 5 7.5 10 30]; v_2 = [0.1 1.5 5 7.5 10 30]; contourf(X,Y,pdf_normal',v); h = colorbar; load('MyColormaps','mycmap4'); set(gcf,'Colormap',mycmap4); set(h, 'YTick', v_2) 

Foto 1:

enter image description here

Imagen 2:

enter image description here

    Aquí una explicación paso a paso.

    Primero considere el siguiente ejemplo:

     [X,Y,Z1] = peaks; figure(1) [~,h1] = contourf(X,Y,Z1,20); a1 = colorbar; colormap(jet) caxis([-6,6]) 

    que te dará la siguiente ttwig:

    enter image description here

    Tiene datos lineales y un mapa de colores lineal. Ahora quiero escalar Z -Data para que no sea lineal como en su caso. Elegí una cuadratura simple de los datos.

     Z2 = get(h1,'ZData'); scalefactor = @(x) sign(x).*x.^2; Z2 = scalefactor(Z2); 

    Esa es la información de ejemplo real, similar a la tuya:

     figure(2) [~,h2] = contourf(X,Y,Z2,20); a2 = colorbar; colormap(jet) caxis([-6^2,6^2]) 

    enter image description here

    Ahora tenemos datos no lineales, pero sigue siendo un colormap colorbar lineal y una colorbar .

    Hasta ahora todo era para generar datos de ejemplo similares al tuyo.


    Ahora la respuesta real:

    Obtenga los datos de su ttwig:

     Z3 = get(h2,'ZData'); 

    y escalarlo con una relación que ojalá sepas más o menos:

     descalefactor = @(x) sign(x).*abs(x).^(1/2); Z3 = descalefactor(Z3); 

    Trazar los datos escalados:

     figure(3) [~,h3] = contourf(X,Y,Z3,20); a3 = colorbar; colormap(jet) caxis([-6,6]) 

    obtén Y-Ticks y scale it with the inverse function , como tus datos:

     ticks = get(a3,'YTick'); ticks = scalefactor(ticks); 

    establezca estos ticks barra de color inversamente escalados:

     set(a3,'YTickLabel',ticks) 

    y finalmente obtienes un gráfico aparentemente linealizado (pero podrías simplemente hacer una copia de seguridad de tus datos no lineales de antes), con un marcador de color no lineal y ticks de barra de colores.

    enter image description here

    Como se esperaba, la ttwig se ve igual que en el primero, pero con un eje de barra de color a escala.

    Si no tiene ninguna relación funcional, intente obtener una, por ejemplo, con la caja de herramientas de ajuste de curvas.

    Puede personalizar el mapa de colores y las marcas en la barra de colores, pero la barra de colores en sí se basa en intervalos lineales y no puede cambiar eso.

    Sin embargo, hay una solución.

    Digamos que quiere que su barra de colores sea similar a la de la imagen 1 con N intervalos no lineales (por ejemplo, color_limits = [1 2 20], si N = 2). tienes que:

    1) define otra variable para tus datos. p.ej

     data2 = nan(size(data)); for i=1:N b = data>color_limits(i) & data>=color_limits(i+1); data2(b) = i-0.5; end 

    Básicamente, está agrupando datos, utilizando los intervalos en color_límites, en una variable diferente de datos2 que mostrará

    2) crea tu imagen de datos2

    3) define los límites de la barra de color: caxis ([0 N])

    4) definir un mapa de colores con N colores, por ejemplo, mapa de colores (jet (N))

    5) personalizar los ticks en la barra de colores

    Cuando pruebe doc colorbar , encontrará una referencia al mapa de colores. Y después de probar doc colormap básicamente dan 3 opciones para establecer el mapa de color.

    1. Ingrese un mapa (por ejemplo, uno obtenido por get o uno diseñado anteriormente, esto es lo que probó)
    2. Seleccione un mapa de colores incorporado con el Editor de propiedades.
    3. Utilice el Editor de mapa de colores, al que puede acceder desde Editar> Mapa de colores en el menú de figuras.

    @horchler ya lo mencionó, pero asumo que no has oído hablar antes del editor de mapas de color. Por lo tanto, sospecho que la opción 3 es la más adecuada para usted.

    uno puede probar Recolor_contourf. Tiene dos funciones más y es fácil de usar. En su ayuda el ejemplo dado de la siguiente manera. La función es enviada por mí. avísame si enfrentas algún problema

     X=1:10;Y=1:10; C=rand(10,10)*150; c=colormap(jet(7)); L=[10 20 50 60 70 100]; [cdd hc]=contourf(X,Y,C,[-5 L]); Recolor_contourf(hc,c,L,'vert');