我对如何为以下示例绘制条形图感到困惑:
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'));
但我想(1)标签与使用semilogx或semilogy创建的标签相同,例如: 10 ^ 9,和(2)我想删除条之间的空间,对于第一个条,例如,我希望它从1000到10000水平延伸,然后第二个条从10000到100000,等等。如何才能做到这一点?
刚才意识到我可以使用
'BarWidth', 1
定义条的宽度。
那么,如何将标签更改为10 ^,并使条形在x_lims中的valkues上延伸,而不是在tick中间(如果有意义)
答案 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