2017-10-17 145 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