2014-06-13 117 views
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是爲每個單獨的杆和EX1 x軸限制是伯爵。如何在條形圖上繪製這些圖形,以便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擴展(如果是有道理的)

+0

如果要改變x軸勾選'設置(GCA, 'XTICK',mytest_x_axis, 'XTickLabel',mytest_timeline)''這裏是my_test_x_axis' x軸例如1:10和'my_test_timeline'是一個包含10個元素的時間軸,我希望它們具有新的x軸。如果使用日誌級別'histc()'來計算每個bin中的計數。然後計算日誌,然後使用bar()來繪製新值。 –

回答

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

2

如何

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

+1。我已經借用了'arrayfun'的想法來解決我的問題(應有的功勞)。我希望你不介意 –