如何将y轴更改为对数刻度?

时间:2017-10-17 01:24:46

标签: r ggplot2

此问题与之前的post相关。

说我有这组数据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> sup> -6 ,10 -5 ,10 -4 ... 10 0 )如果没有直接对数据进行对数转换,条形的高度就不会太远?另外,如何以图表中的NA值显示为零的方式完成此操作?

我也尝试了scale_y_log10()功能,但条形图从上到下。我希望他们不要这样。

enter image description here

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用geom_segment而不是geom_bar来指定您想要从0test$c值的栏。我们仍在使用scale_y_log10()时会发出警告。

我们需要从test$a aes(x=a, xend=a)创建一个细分,然后使用facet_wrap来分隔test$b xy

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

我不喜欢用NA替换0,缺少的值不是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的评论 - &#34;您不应该使用带有条形图的对数刻度。 log(0)处的基数无法绘制。选择不同的基值是任意的,可以根据所选的值使条形看起来像你想要的那样相似或不同。这是一种误导性的图形。如果你真的需要对数比例,请使用点图或其他内容。&#34;

enter image description here