2014-06-17 24 views
11

Ho il codice:Come ottengo le barre con la funzione bar3 e diverse larghezze per ogni barra?

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 

E questo è ciò che la figura assomiglia:

enter image description here

voglio ottenere differenti larghezze per ogni barra dipendente dalla altezza della barra.

Quello che voglio sembra una foto in http://www.sdtools.com/help/ii_mac.html.

blah http://www.sdtools.com/help/mac.gif

+3

+1 per riproducibili (eseguibile) exampkle –

+0

Questo sembra essere fine. Stai ridimensionando ogni barra in base ai valori. Quali sono i tuoi dubbi con questo codice? – rayryeng

+1

@rayryeng Sembra che non voglia cambiare l'altezza delle barre, ma la larghezza x, y invece –

risposta

7

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 

enter image description here

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 

enter image description here

+0

ben fatta Luis, stavo solo cercando di risolvere da solo ... +1 – bla

+0

Nice. Sto favorendo questo. Ben fatto entrambi: Luis Mendo e Natan. – rayryeng

+0

Grazie a tutti! Sono molto grato e molto sorpreso dalla tua velocità e interesse. Cordiali saluti e grazie ancora mille – JMSH

4

Solo per divertimento, questa è una soluzione 2D del problema:

values=values./max(values(:)); % normalize to 1 
cmap=cool(numel(unique(values(:)))); % set color map range 
hold on 
for n=1:numel(values) 
    [x y]=ind2sub(size(values),n); 
    revec(n,:)=[x-0.5*values(n) y-0.5*values(n) values(n) values(n)]; 
    try 
     rectangle('Position',revec(n,:),'FaceColor',cmap(round(values(n)*size(cmap,1)),:)) 
    end 
end 

enter image description here