对数刻度中的条形图:截止条,缺失值

时间:2015-10-11 19:04:58

标签: r ggplot2 bar-chart

我试图从以下数据创建一个漂亮的条形图:

> counts$counts_16
[1] 46921  1546   248    78    31    15     1     3     2     2     0
> counts$score
[1]  0  1  2  3  4  5  6  7  8  9 10

使用以下代码:

ggplot(data = counts, aes(x=score, y=counts_16)) +  geom_bar(stat="identity", width=bar.width) + scale_y_continuous(trans=log2_trans())

不幸的是,结果看起来有点奇怪。首先,条形不是从x轴开始,而是位置太高。 然后,第6个值没有条形,应为1。 零,有一个条,虽然不应该有一个。

以下是一个例子:

barchart

现在,我理解为什么它在对数刻度上的值为0表示奇怪,但我该如何解决它?我该如何解决其他问题?

1 个答案:

答案 0 :(得分:3)

日志转换后,条形图的默认“基线”将为1,而不是零,因为log(0)为-Inf。所以当你的计数为1时,没有条形显示,因为条形顶部的底部都等于1.另一方面,因为log(0)= -Inf,计数为零的条形将对于小于1的任何较低y限制,向下延伸超出图的y范围的底部。

更新:关于您的评论,另一个选项是为绘图添加点,以便您获得y值等于1的点。ggplot还包括顶部 - y = 0的点的半部分,这种标记为零计数。例如:

counts = data.frame(score=0:6, counts_16=c(11000,10000,0:4))

ggplot(data = counts, aes(x=score, y=counts_16)) +  
  geom_bar(stat="identity", width=0.1, fill="grey50") +
  geom_point(pch=21, fill="red", size=4) + 
  scale_y_log10(limits=c(1e-1,2e4), breaks=10^seq(-1,4,1), 
                labels=c(0.1, sprintf("%1.0f", 10^seq(0,4,1)))) +
  scale_x_continuous(breaks=0:6)

当然,您可以使用点(也许是连接线来引导眼睛)并消除条形图,从而避免了对数刻度条形图的尴尬基线问题。

enter image description here