2016-12-08 129 views
0

主要問題:我想要顯示從0到1.0的數據作爲向上的條(從0開始),但不希望間隔等距但日誌間隔。ggplot barplot:如何使用日誌縮放y軸顯示小的正數

我想在下面的數據集中顯示標記爲「均值」的列作爲ggplot中的條形圖,但由於數值非常小,我想在對數刻度上顯示y軸而不是對數變換數據本身。換句話說,我想要有y軸標籤爲0,1e-8,1e-6 1e-4 1e-2和1e-0的正方形條(即從0到1.0,但間隔爲對數比例)。

下面的解決方案不適用於條形反轉。

> print(df) 
     type   mean   sd   se snp 
V7 outer 1.596946e-07 2.967432e-06 1.009740e-08 A 
V8 outer 7.472417e-07 6.598652e-06 2.245349e-08 B 
V9 outer 1.352327e-07 2.515771e-06 8.560512e-09 C 
V10 outer 2.307726e-07 3.235821e-06 1.101065e-08 D 
V11 outer 4.598375e-06 1.653457e-05 5.626284e-08 E 
V12 outer 5.963164e-07 5.372226e-06 1.828028e-08 F 
V71 middle 2.035414e-07 3.246161e-06 1.104584e-08 A 
V81 middle 9.000131e-07 7.261463e-06 2.470886e-08 B 
V91 middle 1.647716e-07 2.875840e-06 9.785733e-09 C 
V101 middle 3.290817e-07 3.886779e-06 1.322569e-08 D 
V111 middle 6.371170e-06 1.986268e-05 6.758752e-08 E 
V121 middle 8.312429e-07 6.329386e-06 2.153725e-08 F 

下面的代碼正確地產生與誤差棒分組barplot

ggplot(data=df, aes(x=snp,y=mean,fill=type))+ 
    geom_bar(stat="identity",position=position_dodge(),width=0.5) + 
    geom_errorbar(aes(ymin=mean-se, ymax=mean+se),width=.3, position=position_dodge(.45)) 

然而,我想使y軸日誌縮放,所以我在scale_y_log10添加()如下:

ggplot(data=df, aes(x=snp,y=mean,fill=type))+ 
    geom_bar(stat="identity",position=position_dodge(),width=0.5) + scale_y_log10() + 
    geom_errorbar(aes(ymin=mean-se, ymax=mean+se),width=.3, position=position_dodge(.45)) 

但奇怪的是,酒吧從上面掉下來,但我只是想讓他們上升(像往常一樣),不知道我做錯了什麼。

謝謝

+2

barplots以零來定義。你有很少的數字。非常小的數字是負數。酒吧從零下降到負數。 – Axeman

+0

我有點困惑,因爲我不是日誌轉換數據本身,所以數字仍然是積極的。此外,如果繪製數據,則會看到y軸單位仍然從1e-6(底部)增加到1e-3,但奇怪的是,條從頂部到底部「下降」,即從較大的數字到較小的數字。我只想查看日誌級別的數據,但不能轉換數據本身。我希望我有道理 –

+2

你是絕對的日誌轉換數據。 'scale_y_log10()'日誌在繪製數據之前轉換數據。 – hrbrmstr

回答

4

這裏有點黑客顯示,如果你試圖獲取在零上日誌規模開始吧會發生什麼。我已經使用geom_segment進行了說明,以便我可以創建延伸到任意範圍的「條」(實際上是寬線段)。爲了做到這一點,我還必須手動進行所有的避讓,這就是爲什麼x映射看起來很奇怪。

在下面的示例中,比例從y = 1e-20到y = 1。 y軸間隔是對數比例的,這意味着從1e-20到1e-19的物理距離與從1e-8到1e-7的物理距離相同,即使這些間隔的大小相差一萬億分之一。

無法顯示下降到零的條,因爲對數刻度上的零是圖底部以下的無限長度。例如,我們可以通過下面的代碼將1e-20更改爲1e-100。但這隻會使數據值之間已經很小的物理距離變得更小,因此更難以區分。

酒吧也以另一種方式誤導,因爲正如@hrbrmstr指出的那樣,我們的大腦線性地處理沿酒吧的距離,但沿着酒吧的每個距離增量所代表的距離大約每變化10倍在下面的例子中幾毫米。條只是不編碼有關數據的有意義的信息。

ggplot(data=df, aes(x=as.numeric(snp) + 0.3*(as.numeric(type) - 1.5), 
        y=mean, colour=type)) + 
    geom_errorbar(aes(ymin=mean-se, ymax=mean+se), width=.3) + 
    geom_segment(aes(xend=as.numeric(snp) + 0.3*(as.numeric(type) - 1.5), 
        y=1e-20, yend=mean), size=5) + 
    scale_y_log10(limits=c(1e-20, 1), breaks=10^(-100:0), expand=c(0,0)) + 
    scale_x_continuous(breaks=1:6, labels=LETTERS[1:6]) 

enter image description here

如果你想堅持數比例,也許繪製點會是一個更好的辦法:

pd = position=position_dodge(.5) 
ggplot(data=df, aes(x=snp,y=mean,fill=type))+ 
    geom_errorbar(aes(ymin=mean-se, ymax=mean+se, colour=type), width=.3, position=pd) + 
    geom_point(aes(colour=type), position=pd) + 
    scale_y_log10(limits=c(1e-7, 1e-5), breaks=10^(-10:0)) + 
    annotation_logticks(sides="l") 

enter image description here