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

我想为变量的分布创建直方图。出于数据审查的原因,我只能显示具有两个以上观察结果的垃圾箱。有没有一种方法可以轻松地在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个观测值的箱? 也许还有一种方法可以从一开始就设置binwidth,这样就不会创建观测值少于3个的bins? 我希望我的问题足够准确,并感谢您的帮助!

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

不是最方便的方法,但是您可以从外部计算容器高度(也许有帮助:https://r.789695.n4.nabble.com/hist-data-without-plot-td796275.html),然后过滤合并的数据,然后绘制提供x和y美观度以及stat =“ identity”的直方图

或者以很少的观察结果物理地删除垃圾箱(例如,如果您想将合并的数据重用于其他内容),则可以使用第三个布尔变量来描述每一行(例如垃圾箱)是否符合您的条件并使用它作为填充色。然后设置scale_fill_manual(values = c(“ transparent”,“ black”)),这将使标准列中具有FALSE的垃圾箱透明。

,

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

我们从您的示例开始:

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)))
)

我们需要定义垃圾箱,在这种情况下,我们每1步都有一个垃圾箱,例如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")

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

h <- hist(df$weight,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)

我们将它们放在一起,除了外观上的细微差别外,它们是相同的 enter image description here

我们定义了临界值,并绘制了列表计数的子集:

CUTOFF=2
ggplot(subset(dat,n>CUTOFF),size=3)

enter image description here

,

使用ggplot2实际上很容易。我认为情节本身没有任何意义,但是这个想法可能在此范围之外具有实用性。您可以在ifelse内使用aes()条条件。

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

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

p <- ggplot(df,aes(x=weight)) +
  geom_histogram() +
  stat_bin(aes(y=..count.. + 2,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,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创建

本文链接:https://www.f2er.com/3111575.html

大家都在问