问题描述
在我的情况下(见下文),基于绘制的变量,是否有办法将小平面换行中的y轴从0缩放为1?好像..count.. / max(..count..)
将被分组在gender
变量上。任何想法将不胜感激。
下面是我目前的尝试
ex[c("var1","var2","gender")] %>%
gather(-gender,key="var",value = "value") %>%
ggplot(aes(value,fill = gender)) + geom_histogram(aes(y=..count.. / max(..count..)),stat="count") +
facet_wrap(~var + gender,scales = "free_x",ncol= 2) +
ylab("% in each group")
数据样本:
structure(list(row = 1:100,var1 = c(" <25"," <25"," 25-50"," 50-75",">75"," <25"),var2 = c(0L,0L,1L,0L),gender = c("M","M","F","M"
)),class = "data.frame",row.names = c(NA,-100L))
解决方法
据我所知,没有现成的解决方案可以告诉facet_wrap
进行您要实现的标准化。相反,您必须手动执行此操作。
(至少)有两种方法可以实现这一目标:
- 简单的方法是预先计算(标准化的)计数并利用
geom_col
- 更精细的方法是使用
tapply
计算gender
的最大计数。对于这种方法,我建议切换到geom_bar
,而不要使用geom_histogram
。
这两种方法如下所示:
library(ggplot2)
library(tidyr)
library(dplyr)
ex[c("var1","var2","gender")] %>%
gather(-gender,key="var",value = "value") %>%
count(gender,var,value) %>%
group_by(gender) %>%
mutate(pct = n / max(n)) %>%
ggplot(aes(value,pct,fill = gender)) +
geom_col() +
facet_wrap(~var + gender,scales = "free_x",ncol= 2) +
ylab("% in each group")
ex[c("var1",value = "value") %>%
ggplot(aes(value,fill = gender)) +
geom_bar(aes(y = ..count.. / tapply(..count..,..fill..,function(x) max(x))[..fill..]),stat="count") +
facet_wrap(~var + gender,ncol= 2) +
ylab("% in each group")