2010-08-30 37 views
7

J'ai une parcelle 3D comme ceci:Comment puis-je ajuster le groupement de barres 3D et l'étiquetage de l'axe des y dans MATLAB?

alt text

Sur l'axe des y de la parcelle, chaque groupe de trois barres se réfère aux mêmes paramètres: x1, x2, x3. Je voudrais avoir un espacement sur l'axe des y pour chaque groupe de trois barres, de sorte qu'il devient plus clair que ces barres se réfèrent aux mêmes paramètres. Dans le même temps, je voudrais mettre une étiquette sur l'axe des y pour chaque groupe de trois barres. Par exemple, la mise en page de l'étiquette suivante pour l'axe y serait souhaitable:

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

Toutes les suggestions sont plus que bienvenus! Le code que je l'habitude de tracer les barres est donnée ci-dessous:

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]); 

Répondre

10

Vous pouvez ajouter un espacement entre vos groupes de barres en spécifiant une entrée supplémentaire à bar3 indiquant les positions où placer les colonnes de barres le long de la axe y. Vous pouvez également tracer texte complémentaire dans vos axes en utilisant la fonction 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

Notez que vous devrez peut-être ajuster les valeurs x et y de vos objets texte pour les amener à render où vous voulez pour la vue de caméra donnée que vous choisissez.

EDIT:

Si vous souhaitez également afficher les valeurs ci-dessus chaque barre, vous pouvez le faire en ajoutant ce qui suit au code ci-dessus:

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 

Il convient de souligner que le fait d'avoir ce texte trop compliqué devient un peu brouillon, car une partie du texte se chevauchera ou se cachera derrière les barreaux. Le texte est également un peu redondant, puisque le couleur des barres est vraiment destiné à montrer les valeurs.

+2

+1 Je pense qu'une sorte de colormap progressif serait plus esthétique: 'colormap (flipud (été))' – Amro

+0

@Amro: Oui, une palette de couleurs différente serait meilleure. J'essayais juste de reproduire la figure originale avec les modifications demandées par le PO. – gnovice

+0

Merci, ça fonctionne comme un charme! J'ai aussi besoin de tracer en haut de chaque barre, la valeur qui lui est associée (venant de Z). Je faisais sth. comme: h = texte (mymat (:, 1), mymat (:, 2) -0,20, Z (:), num2str (Z (:))); où mymat est utilisé comme matrice d'index. Savez-vous, s'il y a un moyen plus efficace de le faire? Dans mon cas, j'ai rempli 'mymat' comme suit: rows = 5; cols = 9; mymat = zéros (rangs * cols, 2); k = 1; pour j = 1: lignes pour i = 1: cols mymat (k, 1) = j; mymat (k, 2) = i; k = k + 1; end Meilleurs voeux – Javier