2012-08-13 142 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