Below is a function I implemented that acts as a bar3 replacement (partially).
In my version, bars are displayed by creating a graphic adapter object : we build a matrix of vertex coordinates and a list of persons connecting these vertices .
The idea is to first create one “3d cube” as a template, and then play it back as many bars as we have. Each rod is offset and scaled according to its position and height.
Vertex / face matrices are built in vector form (see ma, no loops!), And the result is a single patch object for all bars, as opposed to several patches one per bar (this is more efficient in terms of graphics performance ).
The function could be implemented by setting the coordinates of connected vertices that form polygons using the XData , YData , ZData and CData properties instead of the Vertices and Faces properties. This is actually what bar3 internally does. This approach usually requires big data to identify the patches (because we cannot have common points in the patch faces, although I didn’t care in my implementation). Here is a link where I tried to explain the structure of the data built with bar3 .
my_bar3.m
function pp = my_bar3(M, width) % MY_BAR3 3D bar graph. % % M - 2D matrix % width - bar width (1 means no separation between bars) % % See also: bar3, hist3 %% construct patch if nargin < 2, width = 0.8; end assert(ismatrix(M), 'Matrix expected.') % size of matrix [ny,nx] = size(M); % first we build a "template" column-bar (8 vertices and 6 faces) % (bar is initially centered at position (1,1) with width=? and height=1) hw = width / 2; % half width [X,Y,Z] = ndgrid([1-hw 1+hw], [1-hw 1+hw], [0 1]); v = [X(:) Y(:) Z(:)]; f = [ 1 2 4 3 ; % bottom 5 6 8 7 ; % top 1 2 6 5 ; % front 3 4 8 7 ; % back 1 5 7 3 ; % left 2 6 8 4 % right ]; % replicate vertices of "template" to form nx*ny bars [offsetX,offsetY] = meshgrid(0:nx-1,0:ny-1); offset = [offsetX(:) offsetY(:)]; offset(:,3) = 0; v = bsxfun(@plus, v, permute(offset,[3 2 1])); v = reshape(permute(v,[2 1 3]), 3,[]).'; % adjust bar heights to be equal to matrix values v(:,3) = v(:,3) .* kron(M(:), ones(8,1)); % replicate faces of "template" to form nx*ny bars increments = 0:8:8*(nx*ny-1); f = bsxfun(@plus, f, permute(increments,[1 3 2])); f = reshape(permute(f,[2 1 3]), 4,[]).'; %% plot % prepare plot if exist('OCTAVE_VERSION','builtin') > 0 % If running Octave, select OpenGL backend, gnuplot wont work graphics_toolkit('fltk'); hax = gca; else hax = newplot(); set(ancestor(hax,'figure'), 'Renderer','opengl') end % draw patch specified by faces/vertices % (we use a solid color for all faces) p = patch('Faces',f, 'Vertices',v, ... 'FaceColor',[0.75 0.85 0.95], 'EdgeColor','k', 'Parent',hax); view(hax,3); grid(hax,'on'); set(hax, 'XTick',1:nx, 'YTick',1:ny, 'Box','off', 'YDir','reverse', ... 'PlotBoxAspectRatio',[1 1 (sqrt(5)-1)/2]) % 1/GR (GR: golden ratio) % return handle to patch object if requested if nargout > 0 pp = p; end end
Here is an example to compare it with the built-in bar3 function in MATLAB:
subplot(121), bar3(magic(7)), axis tight subplot(122), my_bar3(magic(7)), axis tight

Please note that I chose the color of all bars in one solid color (similar to the output of hist3 function) while MATLAB emphasizes the columns of the matrix with the corresponding colors.
Easy to customize patch ; The following is an example of matching bar3 color mode using indexed color scaling :
M = membrane(1); M = M(1:3:end,1:3:end); h = my_bar3(M, 1.0); % 6 faces per bar fvcd = kron((1:numel(M))', ones(6,1)); set(h, 'FaceVertexCData',fvcd, 'FaceColor','flat', 'CDataMapping','scaled') colormap hsv; axis tight; view(50,25) set(h, 'FaceAlpha',0.85) % semi-transparent bars

Or say that you wanted to color the stripes using a gradient according to their heights :
M = 9^2 - spiral(9); h = my_bar3(M, 0.8); % use Z-coordinates as vertex colors (indexed color mapping) v = get(h, 'Vertices'); fvcd = v(:,3); set(h, 'FaceVertexCData',fvcd, 'FaceColor','interp') axis tight vis3d; daspect([1 1 10]); view(-40,20) set(h, 'EdgeColor','k', 'EdgeAlpha',0.1)

Note that in the last example, the "Renderer" property of the drawing will affect the appearance of the gradients. In MATLAB, rendering “OpenGL” will interpolate the colors along the RGB color space, while the other two renderings (“Artists” and “ZBuffer”) will interpolate according to the colors of the current color map used (so that the histograms will look like a mini colorbar passing through the jet palette , unlike the gradient from blue at the base to any color at a certain height, as shown above). See this post for more details.
I tested the function in Octave 3.6.4 and 3.8.1 , working on Windows, and they worked fine. If you run the examples above, you will find that some advanced 3D features are not yet implemented correctly in Octave (this includes transparency, lighting, etc.). In addition, I used functions not available in Octave, like membrane and spiral to create matrixes of samples, but they are not essential for the code, just replace them with your own data :)
