2010-08-30 8 views
7

I tienen una parcela 3D como esto:¿Cómo puedo ajustar la agrupación de barras 3-D y el etiquetado del eje y en MATLAB?

alt text

En el eje y de la trama, cada grupo de tres barras se refiere a los mismos parámetros: x1, x2, x3. Me gustaría tener un espaciado en el eje y para cada grupo de tres barras, de modo que quede más claro que esas barras se refieren a los mismos parámetros. Al mismo tiempo, me gustaría poner una etiqueta en el eje y para cada grupo de tres barras. Por ejemplo, sería deseable el siguiente diseño de etiqueta para el eje y:

x1 x2 x3 x1 x2 x3 x1 x2 x3 
    grid1  grid2  grid3 

Cualquier sugerencia es más que bienvenido! El código que he utilizado para trazar las barras se da a continuación:

Z = rand(9,5); 
h = bar3(Z); 
[r c] = size(Z); 

zdata = []; 
for i = 1:c 
    zdata = []; 
    for j = 1:r 
     zdata = [zdata; ones(6,4)*Z(j,i)]; 
    end 
set(h(i),'Cdata',zdata) 
end 
colormap 
colorbar 
set(gca,'YTickLabel',['x1';'x2';'x3';'x1';'x2';'x3';'x1';'x2';'x3']); 
view([-64 44]); 

Respuesta

10

Puede añadir espaciamiento entre sus grupos de barras mediante la especificación de una entrada adicional al bar3 que indica las posiciones en las que colocar las columnas de barras a lo largo de la eje y También puede trazar texto adicional en sus ejes utilizando la función text:

Z = rand(9, 5);    % Some random sample data 
[r, c] = size(Z);   % Size of Z 
Y = [1 2 3 5 6 7 9 10 11]; % The positions of bars along the y axis 
C = mat2cell(kron(Z, ones(6, 4)), 6*r, 4.*ones(1, c)).'; %' Color data for Z 

hBar = bar3(Y, Z);   % Create the bar graph 
set(hBar, {'CData'}, C);  % Add the color data 
set(gca, 'YTickLabel', {'x1' 'x2' 'x3'}); % Modify the y axis tick labels 
view(-70, 30);    % Change the camera view 
colorbar;     % Add the color bar 
text(-2, 2, 'grid1');  % Add "grid1" text 
text(-2, 6, 'grid2');  % Add "grid2" text 
text(-2, 10, 'grid3');  % Add "grid3" text 

enter image description here

Tenga en cuenta que es posible que tenga que ajustar los valores de x e y de sus objetos de texto para conseguir que se rinden en la que desea para la vista de cámara dada que elijas.

EDIT:

Si también desea mostrar los valores por encima de cada barra, que puede hacer que al añadir lo siguiente al código anterior:

hText = text(kron((1:c).', ones(r, 1)), ... %' Column of x values 
      repmat(Y(:), c, 1), ...   % Column of y values 
      Z(:)+0.05, ...      % Column of z values 
      num2str(Z(:)), ...     % Text strings 
      'HorizontalAlignment', 'center'); % Center the strings 

Debe indicarse que tener este texto trazado se vuelve un poco complicado, ya que parte del texto se superpondrá u ocultará detrás de las barras. El texto también es un poco redundante, ya que el color de las barras está realmente destinado a mostrar los valores.

+2

+1 Creo que algún tipo de mapa de colores gradual se vería mejor: 'colormap (flipud (verano))' – Amro

+0

@Amro: Sí, un mapa de colores diferente se vería mejor. Solo intentaba reproducir la figura original con las modificaciones que me pidió OP. – gnovice

+0

¡Gracias, funciona como un encanto! También necesito trazar en la parte superior de cada barra, el valor asociado (proveniente de Z). Estaba haciendo algo. como: h = texto (mymat (:, 1), mymat (:, 2) -0.20, Z (:), num2str (Z (:))); donde mymat se usa como una matriz de índices. ¿Sabes si hay una manera más eficiente de hacer eso? En mi caso, llené 'mymat' como: rows = 5; cols = 9; mymat = zeros (rows * cols, 2); k = 1; para j = 1: filas para i = 1: cols mymat (k, 1) = j; mymat (k, 2) = i; k = k + 1; final final Mis mejores deseos – Javier

Cuestiones relacionadas