将条形图的刻度标签更改为对数刻度

时间:2014-06-13 09:21:01

标签: matlab

我对如何为以下示例绘制条形图感到困惑:

x_lims = [1000,10000;10000,100000;100000,1000000;1000000,10000000;10000000,...
    100000000;100000000,1000000000;1000000000,10000000000;...
    10000000000,100000000000;100000000000,1e12]; 
ex1 = [277422033.049038;24118536.4203188;2096819.03295482;...
    182293.402068030;15905;1330;105;16;1];

这里,x_lims是每个单独条形的x轴限制,ex1是计数。如何在条形图上绘制这些图,以便沿x轴的每个条的宽度由x_lims(:,1)和x_lims(:,2)之间的距离定义,y值由ex1定义?

到目前为止,我有:

bar(log10(x_lims(:,1)),log10(ex1));
set(gca,'Xtick',3:11,'YTick',0:9);
set(gca,'Xticklabel',10.^get(gca,'Xtick'),...
    'Yticklabel',10.^get(gca,'Ytick'));

enter image description here

但我想(1)标签与使用semilogx或semilogy创建的标签相同,例如: 10 ^ 9,和(2)我想删除条之间的空间,对于第一个条,例如,我希望它从1000到10000水平延伸,然后第二个条从10000到100000,等等。如何才能做到这一点?

刚才意识到我可以使用

'BarWidth', 1

定义条的宽度。

那么,如何将标签更改为10 ^,并使条形在x_lims中的valkues上延伸,而不是在tick中间(如果有意义)

2 个答案:

答案 0 :(得分:2)

怎么样

labels = arrayfun(@(x)(['10^', num2str(x)]), get(gca,'Xtick'), 'UniformOutput', false)
set(gca,'Xticklabel',labels,...
    'Yticklabel',10.^get(gca,'Ytick'));

答案 1 :(得分:1)

沿着这些方向尝试一些事情。对arrayfun部分的@Dan信用。

bar(log10(x_lims(:,1)),log10(ex1),'BarWidth',1);
labelsx = arrayfun(@(x)(['10^', num2str(x)]), log10(unique(x_lims(:))), ...
   'UniformOutput', false);
labelsy = arrayfun(@(x)(['10^', num2str(x)]), get(gca,'ytick'), ...
   'UniformOutput', false);
set(gca,'Xtick',2.5:11.5,'YTick',0:9);
set(gca,'Xticklabel',labelsx,'Yticklabel',labelsy);
set(gca,'TickDir', 'out') %// make ticks visible
set(gca,'Fontsize', 8) %// "separate" labels

enter image description here