How I obtain bars with function bar3 and different widths for each bar?
graph, graphics, matlab, matlab-figure, width
Solution
This was a little hard to figure out, but it's easy once you get the pattern. The `'XData'` and `'YData'` properties of each `h(i)` are matrices that define the x- and y- width of each bar. Each group of 6 rows of those matrices defines a bar. So the trick is to modify `'XData'` and `'YData'` according to `values`.
values = [1.0 0.6 0.1; 0.0 1.0 0.3; 0.9 0.4 1.0];
h = bar3(values);
m = max(values(:))*2; %// normalizing constant for bar width
shading interp
for i = 1:length(h)
% Get the ZData matrix of the current group
xdata = get(h(i),'Xdata');
ydata = get(h(i),'Ydata');
zdata = get(h(i),'Zdata');
set(h(i),'Cdata',zdata)
for k = 1:6:size(xdata,1)
xdatak = xdata(k+(0:5),:);
xdatak = round(xdatak)+sign(xdatak-round(xdatak))*values(ceil(k/6),i)/m;
xdata(k+(0:5),:) = xdatak;
ydatak = ydata(k+(0:5),:);
ydatak = round(ydatak)+sign(ydatak-round(ydatak))*values(ceil(k/6),i)/m;
ydata(k+(0:5),:) = ydatak;
end
set(h(i),'XData',xdata);
set(h(i),'YData',ydata);
end
set(h,'EdgeColor','k')
view(-61, 68);
colormap cool
colorbar
Note that the above code scales linear size (width) according to `values`. To scale area just use the square root of `values`:
values = [1.0 0.6 0.1; 0.0 1.0 0.3; 0.9 0.4 1.0];
h = bar3(values);
svalues= sqrt(values);
m = max(svalues(:))*2; %// normalizing constant for bar width
shading interp
for i = 1:length(h)
% Get the ZData matrix of the current group
xdata = get(h(i),'Xdata');
ydata = get(h(i),'Ydata');
zdata = get(h(i),'Zdata');
set(h(i),'Cdata',zdata)
for k = 1:6:size(xdata,1)
xdatak = xdata(k+(0:5),:);
xdatak = round(xdatak)+sign(xdatak-round(xdatak))*svalues(ceil(k/6),i)/m;
xdata(k+(0:5),:) = xdatak;
ydatak = ydata(k+(0:5),:);
ydatak = round(ydatak)+sign(ydatak-round(ydatak))*svalues(ceil(k/6),i)/m;
ydata(k+(0:5),:) = ydatak;
end
set(h(i),'XData',xdata);
set(h(i),'YData',ydata);
end
set(h,'EdgeColor','k')
view(-61, 68);
colormap cool
colorbar
In either of the above, if you want all bars with equal height just replace the second line by
h = bar3(ones(size(values)));
Or if you prefer a 2D view, use
view(-90,90) %// view from above
axis equal %// set the same scale in x and y
Problem
I have the code: ``` values = [1.0 0.6 0.1; 0.0 1.0 0.3; 0.9 0.4 1.0]; h = bar3(values); shading interp for i = 1:length(h) % Get the ZData matrix of the current group zdata = get(h(i),'Zdata'); set(h(i),'Cdata',zdata) end set(h,'EdgeColor','k') view(-61, 68); colormap cool colorbar ``` And this is what the figure looks like: I want to obtain different widths for each bar dependent on the height of the bar. What I want looks like a picture in http://www.sdtools.com/help/ii_mac.html. blah http://www.sdtools.com/help/mac.gif