看起来像是调用scale_y_log10
使用堆叠直方图导致 ggplot 绘制product每个堆栈中每个组件的计数x
垃圾桶。下面是一个演示。我们创建一个名为的数据框product.of.counts
包含产品,在每个x
每个的计数箱param.range
垃圾桶。我们用geom_text
将这些值添加到图中,并查看它们与每个直方图条形堆栈的顶部重合。
起初我以为这是一个错误,但后来一点搜索 https://stackoverflow.com/a/9507037/496488,我想起了 ggplot 进行对数转换的方式。正如链接的答案中所述,“scale_y_log10
进行计数,将其转换为对数,堆叠这些对数,然后以反对数形式显示比例。然而,堆叠日志并不是线性变换,因此你要求它做的事情没有任何意义。”
举一个更简单的例子,假设堆积条形图的五个组成部分的计数均为 100。那么所有五个组成部分的 log10(100) = 2,对数之和将为 10。然后 ggplot 取尺度的反对数,它给出条形的总高度(即 100^5)10^10,即使实际高度为 100x5=500。这正是你的情节所发生的情况。
library(dplyr)
library(ggplot2)
# Data
set.seed(1)
my.df <- data.frame(param=runif(10000,0,1),x=runif(10000,0.5,1))
my.df$param.range <- cut(my.df$param,breaks=5)
# Calculate product of counts within each x bin
product.of.counts = my.df %>%
group_by(param.range, breaks=cut(x, breaks=seq(-0.05, 1.05, 0.1), labels=seq(0,1,0.1))) %>%
tally %>%
group_by(breaks) %>%
summarise(prod = prod(n),
param.range=NA) %>%
ungroup %>%
mutate(breaks = as.numeric(as.character(breaks)))
ggplot(my.df, aes(x, fill=param.range)) +
geom_histogram(binwidth = 0.1, colour="grey30") +
scale_fill_grey() +
scale_y_log10(breaks=10^(0:14)) +
geom_text(data=product.of.counts, size=3.5,
aes(x=breaks, y=prod, label=format(prod, scientific=TRUE, digits=3)))