2017-10-17 144 views
0

此問題與之前的post有關。如何將y軸更改爲對數比例?

說我有這組數據test

a b  c 
1 a x  NA 
2 b x 5.1e-03 
3 c x 2.0e-01 
4 d x 6.7e-05 
5 e x  NA 
6 f y 6.2e-05 
7 g y 1.0e-02 
8 h y 2.5e-03 
9 i y 9.8e-02 
10 j y 8.7e-04 

> dput(test) 
structure(list(a = structure(1:10, .Label = c("a", "b", "c", 
"d", "e", "f", "g", "h", "i", "j"), class = "factor"), b = structure(c(1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), .Label = c("x", "y"), class = "factor"), 
c = c(NA, 0.0051, 0.2, 6.7e-05, NA, 6.2e-05, 0.01, 0.0025, 
0.098, 0.00087)), .Names = c("a", "b", "c"), row.names = c(NA, 
-10L), class = "data.frame") 

與ggplot定期繪製它會給這個圖:

ggplot of test

> ggplot(test, aes(fill=a,y=c,x=b)) + 
    geom_bar(position="dodge",stat="identity") 

如何設置y軸作爲對數標度(例如,0,10 -6,10 -5, 10 -4 ... 10 ),因此如果不直接對數據進行對數轉換,條形的高度就不會太遠。另外,我該如何完成此操作,以便它仍將NA值顯示爲圖中的零值?

我也嘗試了scale_y_log10()函數,但條形從上到下。我希望他們不要那樣。

enter image description here

謝謝!

+0

'P + scale_y_log10()' – Suren

+0

您應就如何使可重複的例子https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-閱讀可重現的例子 – Suren

+0

@DiscoSuperfly我試過了,但酒吧從上到下。我不知道如何繞過它。 – Dodong

回答

0

您可以使用geom_segment代替,而不是geom_bar指定要一間酒吧從0test$c值。由於我們仍在使用scale_y_log10(),所以會發出警告。

我們需要創建從每個test$a所以aes(x=a, xend=a)段,並使用facet_wrap分離test$bxy代替。

gg <- ggplot(test) + 
    geom_segment(aes(colour=a, y=0, yend=c, x=a, xend=a), size=10) + 
    scale_y_log10() + facet_wrap(~b, scales="free_x") + 
    ylab("log10 value") + xlab("") 
gg 

我不0更換NA的粉絲,缺少價值不0。而只是標籤NA

test$c_label <- test$c 
test$c_label[is.na(test$c)] <- "NA" 

gg + geom_label(data=subset(test, is.na(test$c)), aes(x=a, y=0.00001, label=c_label), size=5) 

雖然這可能是一個變通,我完成與@ DWW的評論表示贊同 - 「你不應該使用日誌規模與巴圖在日誌中的基地(0)是不可能的,以情節的選擇。一個不同的基值是任意的,並且可以用來使條看起來像你所希望的那樣相似或不同,這取決於所選擇的值,這是一種誤導性的圖形,使用點圖或其他的東西,如果你真的需要日誌規模「。

enter image description here

+0

它的工作原理!非常感謝!我只有一個後續問題。如何更改a的順序? – Dodong

+0

'factor''test $ a'並按照你想要的順序設置'levels'。 – Djork

+0

非常感謝! – Dodong