我试图从以下数据创建一个漂亮的条形图:
> 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。 零,有一个条,虽然不应该有一个。
以下是一个例子:
现在,我理解为什么它在对数刻度上的值为0表示奇怪,但我该如何解决它?我该如何解决其他问题?
答案 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)
当然,您可以使用点(也许是连接线来引导眼睛)并消除条形图,从而避免了对数刻度条形图的尴尬基线问题。