ggplot2 直方图:仅显示具有 2 个以上观察值的 bin

ggplot2 histogram: show only bins with more than 2 observations

我想为变量的分布创建直方图。出于数据审查的原因,我只能显示包含两个以上观察值的箱子。有没有办法在 ggplot2 中轻松完成此任务? 这是一个例子:

library(ggplot2)
set.seed(1234)

df <- data.frame(
  weight=round(c(rnorm(200, mean=55, sd=5), rnorm(200, mean=65, sd=5)))
)

p <- ggplot(df, aes(x=weight)) +
  geom_histogram() +
  stat_bin(aes(y=..count.. + 2, label=..count..), geom="text")
p

如何限制直方图仅显示具有 n>2 个观测值的 bin? 也许还有一种方法可以从一开始就设置 binwidth,这样就不会创建观察值少于 3 个的 bin? 希望我的问题足够准确,感谢您的帮助!

不是最方便的,但您可以在外部计算 bin 高度(也许这有帮助:https://r.789695.n4.nabble.com/hist-data-without-plot-td796275.html),然后过滤分箱数据,然后绘制提供 x 和 y 美学和 stat="identity".

或者物理移除观察很少的 bin(即,如果您想将分箱数据重新用于其他内容),您可以使用第三个布尔变量来描述每一行(即 bin)是否符合您的标准,并且用它作为填充颜色。然后设置 scale_fill_manual(values=c("transparent", "black")),这将使标准列中带有 FALSE 的 bins 透明。

这是可行的,我的建议是你必须事先决定垃圾箱,否则过滤没有意义。

我们从你的例子开始:

library(ggplot2)
library(gridExtra)
set.seed(1234)

df <- data.frame(
  weight=round(c(rnorm(200, mean=55, sd=5), rnorm(200, mean=65, sd=5)))
)

我们需要定义 bins,在这种情况下,我们每步 1 都有一个 bin,例如 40,41,42..

BREAKS = seq(floor(min(df$weight)),ceiling(max(df$weight)),1)

p1 <- ggplot(df, aes(x=weight)) +
  geom_histogram(breaks=BREAKS) +
  stat_bin(aes(y=..count.. + 2, label=..count..), breaks=BREAKS,geom="text")

我们也可以使用 base R 中的 hist 函数手动计算并将其绘制为条形图:

h <- hist(df$weight,breaks=BREAKS,plot=FALSE)
dat <- data.frame(weight=h$mids,n=h$counts)

p2 <- ggplot(dat,aes(x=weight,y=n)) + 
geom_col() + geom_text(aes(label=n),vjust=-0.5,size=3)

我们把它们放在一起,它们是一样的,只是外观上有一点不同

我们定义截止值并绘制表格计数的一个子集:

CUTOFF=2
ggplot(subset(dat,n>CUTOFF),aes(x=weight,y=n)) + 
geom_col() + geom_text(aes(label=n),vjust=-0.5,size=3)

使用 ggplot2 这实际上很容易。我不认为情节本身有任何意义,但这个想法可以在这之外发挥作用。您可以在 aes() 中使用 ifelse 条件而不会出现任何问题。

library("ggplot2")
## set superior seed ;)
set.seed(42)

df <- data.frame(
  weight=round(c(rnorm(200, mean=55, sd=5), rnorm(200, mean=65, sd=5)))
)

p <- ggplot(df, aes(x=weight)) +
  geom_histogram() +
  stat_bin(aes(y=..count.. + 2, label=..count..), geom="text")
p
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.


p <- ggplot(df, aes(x=weight, y = ifelse(..count.. > 2, ..count.., 0))) +
  geom_histogram() +
  stat_bin(aes(label=..count..), geom="text")
p
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

reprex package (v0.3.0)

于 2019-11-13 创建