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 创建
我想为变量的分布创建直方图。出于数据审查的原因,我只能显示包含两个以上观察值的箱子。有没有办法在 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 创建