2012-08-13 186 views
2

我需要的是X軸以對數刻度顯示的直方圖。但是,我仍然希望直方圖中的每個條寬度都相同。無論如何,我想出了(或在)顯示條的較高值作爲較窄的那些(它們在普通尺度上具有相同的寬度,而不是在對數尺度上)。對數刻度(x軸)直方圖

這裏是我現在做:

edges = 10.^(c_min:0.1:c_max); 
h = histc(data, edges); 
bar(edges, h); set(gca, 'Xscale', 'log'); 

回答

2

因爲你的吧,應間隔均勻,可以用x值1,2,繪製出來..然後更改軸標籤。

edges = 10.^(c_min:0.1:c_max); 
h = histc(data, edges); 

centers = sqrt(edges(1:end-1).*edges(2:end)); 

bar(h) 

%# fix the x-labels, x-axis extents 
xlim([0.5,length(centers)+0.5]) 
set(gca,'xticklabel',num2str(centers(:),'%5.2f')) 
+0

好的和簡單的方法,你可能知道是否有辦法打印數字,如10^12很好嗎? – gintas 2012-08-13 14:01:23

+1

@gintas:查看[這個問題](http://stackoverflow.com/questions/3881492/select-a-different-base-for-a-logarithmic-plot-in-matlab)如何繪製很好格式的刻度標籤。 – Jonas 2012-08-13 14:20:44

+0

謝謝!那正是我需要的! – gintas 2012-08-13 14:55:10

1

使用patch而不是bar

figure, hold on 
edges = 10.^(c_min:0.1:c_max); 
h = histc(data, edges); 

for ii = 1:numel(edges)-1  
    patch(... 
     [edges(ii) edges(ii) edges(ii+1) edges(ii+1)], ... 
     [0 h(ii) h(ii) 0],... 
     'b'); 
end 

雖然你想要的這個特殊的代碼沒有做,那就是與edges的定義,而不是方法問題,所以你必須用edges(也許重新定義它們爲patch