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

3

我有点困惑如何为以下示例绘制条形图:

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的值上延伸而不是在刻度的中间(如果有意义的话)。


如果您想更改x轴,请检查set(gca,'XTick',mytest_x_axis,'XTickLabel',mytest_timeline)。这里的my_test_x_axis是x轴,例如1:10,而my_test_timeline是一个具有10个元素的时间轴,我希望将其作为新的x轴。对于对数比例尺,请使用histc()计算每个bin中的计数。然后计算对数,然后使用bar()绘制新值。 - The Minion
2个回答

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

+1. 我借鉴了“arrayfun”的想法(并给予应有的功劳)。希望你不介意。 - Luis Mendo

1

尝试类似以下内容。感谢 @Dan 提供的 arrayfun 部分。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接