views:

49

answers:

1

Dear all,

I have a 3D plot like this:

alt text

In the Y-axis of the plot, each group of three bars refer to the same parameters: x1, x2, x3. I would like to have a spacing in the y-axis for each group of three bars, so that it becomes more clear that those bars are referring to the same parameters. At the same time, I would like to put a label on the Y-axis to each of group of three bars. For example, if we're on the y-axis the following layout would be desired:

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

Any suggestions are more than welcomed! The code that I used to plot the bars, is given below:

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]);
+5  A: 

You can add spacing in between your groups of bars by specifying an additional input to BAR3 indicating the positions at which to place the columns of bars along the y axis. You can also plot additional text in your axes using the function 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

alt text

Note that you may have to adjust the x and y values of your text objects to get them to render where you want for the given camera view that you choose.

EDIT:

If you'd also like to display the values above each bar, you can do that by adding the following to the above code:

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

It should be pointed out that having this much plotted text gets a little messy, since some of the text will be overlapping or hidden behind the bars. The text is also a bit redundant, since the color of the bars is really meant to show the values.

gnovice
+1 I think some kind of gradual colormap would look better: `colormap(flipud(summer))`
Amro
@Amro: Yeah, a different colormap would look better. I was just trying to reproduce the original figure with the modifications the OP asked for.
gnovice
Thanks, it works like a charm! I also need to plot at the top of each bar, the value associated to it (coming from Z). I was doing sth. like: h=text(mymat(:,1),mymat(:,2)-0.20,Z(:),num2str(Z(:)));where mymat is used as a matrix of indexes. Do you know, if there's a more efficient way to do that? In my case, I filled 'mymat' as: rows=5;cols=9; mymat=zeros(rows*cols,2); k=1; for j=1:rows for i=1:cols mymat(k,1) = j; mymat(k,2) = i; k = k + 1; end endBest wishes
Javier
@Javier: I updated my answer to show you another way to add the text you want, although it does make the plot harder to read.
gnovice

related questions