Soy bastante nuevo en Matlab y tienen un par de preguntas.
Tengo dos superficies y un avión en la misma figura.
Quiero usar los diferentes mapa de colores y colorbar para b y otro mapa de colores y colorbar para c. s es de color fijo así que no es un problema.

Déjame que te explique lo que estoy tratando de lograr:

cmap1=mapa de colores(topobathy) –>cmap1 es 64×3 doble como se esperaba

cmap2=mapa de colores(redwhitegreen)

crear cdata1 utilizando cmap1 (esta es la primera parte no puedo entender, cómo a escala z de datos utilizando cmap1, por defecto CData contiene los valores z)

b=surf(x,y,z,cdata1)

colorbar para b, utilizando los valores z

c=pcolor(x,y), (z-z0)) – quiero usar cmap2 para este.

colorbar para c el uso de (z-z0) los valores

Aquí es lo que tengo hasta ahora y los problemas que me encuentro

b=surf(x,y,z);
colormap(topobathy);
cbar1=colorbar;
set(get(cbar1,'ylabel'),'String', 'Elevation (m)', 'Rotation', 90)
hold on;
s=surf(x,y,z1,'FaceColor',[0.278 0.788 0.788])
hold on;
change=z-z0;     
c=pcolor(x,y,change)
set(c,'ZData',100 + 0*change); %plotting it above the other surfaces
colormap(redwhitegreen)`

en este punto de mapa de color se establece en redwhitegreen para b, colorbar de b
No puedo obtener el segundo colorbar con su propio clim etc.

He utilizado el freezeColors y cbfreeze explicado en este enlace:
http://blogs.mathworks.com/pick/2009/07/24/using-multiple-colormaps-in-a-single-figure/

pero una cosa funciona mientras cachondeo que otra cosa (probablemente todo es mi culpa). Quiero aprender a tener el control completo sobre mis objetos sin uso externo m archivos de todos modos.

Cualquier ayuda es muy apreciada.

OriginalEl autor theenemy | 2011-11-09

3 Comentarios

  1. 16

    La idea básica es que concatenar el colormaps y, a continuación, mayús/escala de los datos de color (CData) de los diferentes trama maneja en línea con las porciones deseadas del mapa de colores. Así que, sin saber lo que sus funciones personalizadas o datos específicos, se podría hacer algo como colormap(topobathy(64); redwhitegreen(64)) y la escala de la CData de b en el intervalo [1,64] y el CData de c en el intervalo [65,128].

    Hay un excelente guía en el sitio web de the MathWorks que explica todo esto (incluso utiliza surf() y pcolor() como en tu ejemplo):

    http://www.mathworks.com/support/tech-notes/1200/1215.html#Example_1

    Para la colorbar, usted puede falsificar las garrapatas y las etiquetas de una manera similar. Aquí es áspera tiro en la fabricación de una barra de color para el ejemplo anterior:

    h = colorbar;
    ticks = [1 16:16:64 64:16:128];
    ticks(5:6) = [62 66];
    set(h, 'YTick', ticks);
    
    labels = num2str(repmat(linspace(min(Z(:)), max(Z(:)), 5), 1, 2)', 2);
    set(h, 'YTickLabel', labels)

    Matlab: Cómo asignar diferentes colormaps/utilizar barras de color a las diferentes superficies en la misma Figura

    gracias por la respuesta – que es un buen enlace, yo era consciente de ello pero que no se aplica a mi problema – mi surf y pcolor están utilizando diferentes Z conjuntos de datos. Quiero sus correspondientes colorbar y mapa de colores para reflejar eso.
    No hay ningún requisito de que sean los mismos valores Z, y os animo a trabajar a través de ese ejemplo de cerca. El punto principal es simplemente que cada CData debe ser escalada/cambiado en su parte correspondiente de la concatenación de mapa de colores. Incluso el color de los mapas no tienen que ser 64-64, a pesar de tener el mismo tamaño siempre es más conveniente para mí.
    Además, si usted realmente desea 2 barras de color, que también es simple. Sólo en 2 de ellos y, a continuación, ajustar el Position de la propiedad, de modo que no se superpongan, y el YLim propiedad por lo que cada uno sólo se muestra una parte del mapa de colores.

    OriginalEl autor John Colby

  2. 1

    Yo tenía el mismo problema que tú, y el mejor (y único) de la solución que encontré fue la siguiente:

    1. Concatenar ambas colormaps que yo quería:

      cmap1 = jet(64); cmap2 = cobre(64); color_map = [cmap1 ; cmap2];

      Así, el primer mapa de colores (cmap1) será utilizado para Axes1, y el segundo mapa de colores (cmap2) para Axes2. Supongo que Axes1 y Axes2 están en la misma figura.

    2. Normalizar los datos, dando una escala de 0 a 1 para los datos de Axes1, y de 1 a 2 para los datos de Axes2. Así, Axes1 en [0, 1] y Axes2 en [1 2].

      data1 = data1 – lower_limit1;
      data1 = doble(data1./(upper_limit1 – lower_limit1));

      Para el conjunto de datos de Ejes 2:

      data2 = data2 - lower_limit;
      data2 = double(data2./(upper_limit2 - lower_limit2)) + 1;
    3. Cuando la representación de ellos:

      • Axes1:
      pcolor(handle_axes1, x_axis, y_axis, data1); shading(handle_axes1,'FLAT'); 
      caxis(handle_axes1, [0 2]);
      
      % Colorbar
      h_colorbar = colorbar('peer', handle_axes1);
      set(h_colorbar, 'YLim', [0 1]);
      
      labels = num2str(linspace(lower_limit1, upper_limit1, 6)', 2);
      set(h_colorbar, 'YTick', linspace(0, 1, 6));
      set(h_colorbar, 'YTickLabel', labels);
      • Axes2:
      pcolor(handle_axes2, x_axis, y_axis, data2); shading(handle_axes2,'FLAT'); 
      caxis(handle_axes2, [0 2]);
      
      % Colorbar
      h_colorbar2 = colorbar('peer', handle_axes2);
      set(h_colorbar2, 'YLim', [1 2]);
      
      labels = num2str(linspace(lower_limit2, upper_limit2, 6)', 2);
      set(h_colorbar2, 'YTick', linspace(1, 2, 6));
      set(h_colorbar2, 'YTickLabel', labels);

    Uso pcolor o surf, dependiendo de sus necesidades.
    Espero que ayude!

    OriginalEl autor YisasL

  3. 1

    Matlab ha proporcionado el código de una función newclim que resuelve este problema limpiamente por la concatenación de los colormaps en un mapa de colores. Sólo pude encontrar esta documentación en el 2012b Ayuda, pero no en línea.

    Tenga en cuenta que los ejes que se utilizan para actualizar el CLim como el último paso puede ser ejes de surf parcelas, que es cómo he aplicado este código.

    Calcular El Color De Los Límites De

    La clave de este ejemplo es calcular los valores para CLim que causa cada superficie a utilizar la sección del mapa de colores que contienen los colores apropiados.

    Para calcular los nuevos valores de CLim, usted necesita saber

    • La longitud total del mapa de colores (CmLength)

    • El principio de mapa de color de la ranura para el uso de cada uno de los ejes (BeginSlot)

    • El final de mapa de color de la ranura para el uso de cada uno de los ejes (EndSlot)

    • El mínimo y el máximo CData los valores de los objetos gráficos contenidos
      en los ejes. Es decir, los valores de los ejes CLim de la propiedad determinado
      por MATLAB cuando CLimMode es auto (CDmin y CDmax).

    Primero, definir subtrama regiones y trazado de las superficies.

    im1 = load('cape.mat');
    im2 = load('flujet.mat');
    ax1 = subplot(1,2,1); 
    imagesc(im1.X) 
    axis(ax1,'image')
    ax2 = subplot(1,2,2);
    imagesc(im2.X) 
    axis(ax2,'image')

    Concatenar dos colormaps e instalar el nuevo mapa de colores.

    colormap([im1.map;im2.map])

    Obtener los datos necesarios para calcular los nuevos valores para CLim.

    CmLength   = length(colormap);   % Colormap length
    BeginSlot1 = 1;                  % Beginning slot
    EndSlot1   = length(im1.map);    % Ending slot
    BeginSlot2 = EndSlot1 + 1; 
    EndSlot2   = CmLength;
    CLim1      = get(ax1,'CLim');  % CLim values for each axis
    CLim2      = get(ax2,'CLim');

    La definición de una Función para Calcular CLim Valores

    De computación nuevos valores para CLim consiste en determinar la porción del mapa de colores que desea cada uno de los ejes para uso en relación con el total de mapa de color tamaño y la escala de sus Clim gama en consecuencia. Se puede definir una función de MATLAB para ello.

    function CLim = newclim(BeginSlot,EndSlot,CDmin,CDmax,CmLength)
       %                Convert slot number and range
       %                to percent of colormap
       PBeginSlot    = (BeginSlot - 1) / (CmLength - 1);
       PEndSlot      = (EndSlot - 1) / (CmLength - 1);
       PCmRange      = PEndSlot - PBeginSlot;
       %                Determine range and min and max 
       %                of new CLim values
       DataRange     = CDmax - CDmin;
       ClimRange     = DataRange / PCmRange;
       NewCmin       = CDmin - (PBeginSlot * ClimRange);
       NewCmax       = CDmax + (1 - PEndSlot) * ClimRange;
       CLim          = [NewCmin,NewCmax];
    end

    Los argumentos de entrada son identificados en la lista con viñetas de arriba. La función primero se calcula el porcentaje del total de mapa de colores que desea utilizar para un determinado ejes (PCmRange) y, a continuación, calcula el CLim rango requerido para el uso de la porción del mapa de colores dada la CData rango en los ejes. Finalmente, se determina los valores máximo y mínimo necesario para el calculo de la CLim rango y devuelve estos valores. Estos valores son el color de los límites de la dada de los ejes.

    Utilizando la Función de

    Utilizar el newclim función para establecer el CLim los valores de cada uno de los ejes. La declaración de

    set(ax1,'CLim',newclim(BeginSlot1,EndSlot1,CLim1(1),...
            CLim1(2),CmLength))

    establece el CLim valores para el primero de los ejes de modo que la superficie utiliza el color ranuras de 65 a 120. La superficie iluminada usa el menor de 64 ranuras. Usted necesita para restablecer su CLim de valores.

    set(ax2,'CLim',newclim(BeginSlot2,EndSlot2,CLim2(1),...
            CLim2(2),CmLength))

    Cómo la Función Obras

    MATLAB permite especificar los valores para los ejes CLim de la propiedad, incluso si estos valores no se corresponden con la CData de los objetos gráficos se muestran en los ejes. El mínimo CLim valor siempre se asigna el primer color en el mapa de colores y el máximo CLim valor siempre se asigna el último color en el mapa de colores, si hay o no hay realmente ninguna CData valores correspondientes a estos colores. Por lo tanto, si se especifican valores para CLim que se extienden más allá del objeto real CData mínimo o máximo, MATLAB colores de los objetos con sólo un subconjunto de mapa de colores.

    La newclim función calcula los valores para CLim que el mapa de la gráfica del objeto real CData valores para el principio y final de mapa de colores ranuras que usted especifique. Esto se hace mediante la definición de una «virtual» objeto graphics tener la calculada CLim valores.

    OriginalEl autor yellowjacket05

Dejar respuesta

Please enter your comment!
Please enter your name here