Questo è stato un po 'difficile da capire, ma è facile una volta che si ottiene il modello. Le proprietà 'XData'
e 'YData'
di ogni h(i)
sono matrici che definiscono la larghezza x e y di ciascuna barra. Ogni gruppo di 6 righe di quelle matrici definisce una barra. Quindi il trucco è modificare 'XData'
e 'YData'
in base allo 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

noti che il codice sopra scale dimensione lineare (larghezza) secondo values
. Per scalare zona basta usare la radice quadrata di 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 entrambi di quanto sopra, se si desidera che tutti i bar con uguale altezza basta sostituire la seconda linea da
h = bar3(ones(size(values)));
O se si preferire una vista 2D, utilizzare
view(-90,90) %// view from above
axis equal %// set the same scale in x and y

+1 per riproducibili (eseguibile) exampkle –
Questo sembra essere fine. Stai ridimensionando ogni barra in base ai valori. Quali sono i tuoi dubbi con questo codice? – rayryeng
@rayryeng Sembra che non voglia cambiare l'altezza delle barre, ma la larghezza x, y invece –