修改 ggplot2 中 geom_bar 的 'percent' 格式
Modifying the 'percent' format for geom_bar in ggplot2
我试图让 geom_bar 将计数除以归一化因子,而不是除以总和(..counts..),例如
n=200
df = data.frame(let = letters[sample(1:26,n,replace=TRUE)],
cat=letters[sample(1:2,n,replace=TRUE)],
norm = as.integer(1+round(runif(n)*10))
d <- ggplot(df, aes(let,fill=cat)) +
geom_bar(aes(y = ((..count..)/sum(..count..))),position='dodge')
相反,我想除以归一化因子:
d <- ggplot(df, aes(let,fill=cat)) +
geom_bar(aes(y = ((..count..)/norm)),position='dodge')
但这会产生错误:
> d
Error in (count)/norm : non-numeric argument to binary operator
这只是一个玩具示例。我的实际代码有一个不同的错误,我还没有复制:
> ggplot(droplevels(dfR[keep,]), aes(x=loc_breakBinned,fill=amalgamated_group) ) +
geom_bar(aes(y = ((..count..)/subject_count_ASDvTD)),position='dodge')
Error in eval(expr, envir, enclos) :
object 'subject_count_ASDvTD' not found
ggplot2 坚持认为 subject_count_ASDvTD
不是 dfR 的一部分,但快速查看表明它显然是:
> str(dfR[keep,c('amalgamated_group','loc_breakBinned','subject_count_ASDvTD')])
'data.frame': 3694 obs. of 3 variables:
$ amalgamated_group : Factor w/ 6 levels "ASD","CONTRAST",..: 1 1 1 1 1 1 1 1 1 1 ...
$ loc_breakBinned : Factor w/ 18 levels "pos:(10.7,12.8]_totExonD:(-0.00822,1.64]",..: 14 1 8 8 14 4 8 13 8 14 ...
$ subject_count_ASDvTD: int 213 213 213 213 213 213 213 213 213 213 ...
这是怎么回事?为什么 ggplot 看不到 subject_count_ASDvTD
?
注意:同样的错误来自
ggplot(droplevels(dfR[keep,]), aes(x=loc_breakBinned,fill=amalgamated_group,y = ((..count..)/subject_count_ASDvTD) ) ) +
geom_bar(position='dodge')
解决办法是在aes中定义变量。感谢@aosmith 帮我解决了这个问题。可以在下面找到上述代码的更正版本:
d <- ggplot(df, aes(let,fill=cat,norm=norm)) +
geom_bar(aes(y = ((..count..)/norm)),position='dodge')
以及更复杂的实际代码:
ggplot(droplevels(dfR[keep,]), aes(subject_count=subject_count_ASDvTD,x=loc_breakBinned,fill=amalgamated_group,y = ((..count..)/subject_count) ) ) +
geom_bar(position='dodge')
我试图让 geom_bar 将计数除以归一化因子,而不是除以总和(..counts..),例如
n=200
df = data.frame(let = letters[sample(1:26,n,replace=TRUE)],
cat=letters[sample(1:2,n,replace=TRUE)],
norm = as.integer(1+round(runif(n)*10))
d <- ggplot(df, aes(let,fill=cat)) +
geom_bar(aes(y = ((..count..)/sum(..count..))),position='dodge')
相反,我想除以归一化因子:
d <- ggplot(df, aes(let,fill=cat)) +
geom_bar(aes(y = ((..count..)/norm)),position='dodge')
但这会产生错误:
> d
Error in (count)/norm : non-numeric argument to binary operator
这只是一个玩具示例。我的实际代码有一个不同的错误,我还没有复制:
> ggplot(droplevels(dfR[keep,]), aes(x=loc_breakBinned,fill=amalgamated_group) ) +
geom_bar(aes(y = ((..count..)/subject_count_ASDvTD)),position='dodge')
Error in eval(expr, envir, enclos) :
object 'subject_count_ASDvTD' not found
ggplot2 坚持认为 subject_count_ASDvTD
不是 dfR 的一部分,但快速查看表明它显然是:
> str(dfR[keep,c('amalgamated_group','loc_breakBinned','subject_count_ASDvTD')])
'data.frame': 3694 obs. of 3 variables:
$ amalgamated_group : Factor w/ 6 levels "ASD","CONTRAST",..: 1 1 1 1 1 1 1 1 1 1 ...
$ loc_breakBinned : Factor w/ 18 levels "pos:(10.7,12.8]_totExonD:(-0.00822,1.64]",..: 14 1 8 8 14 4 8 13 8 14 ...
$ subject_count_ASDvTD: int 213 213 213 213 213 213 213 213 213 213 ...
这是怎么回事?为什么 ggplot 看不到 subject_count_ASDvTD
?
注意:同样的错误来自
ggplot(droplevels(dfR[keep,]), aes(x=loc_breakBinned,fill=amalgamated_group,y = ((..count..)/subject_count_ASDvTD) ) ) +
geom_bar(position='dodge')
解决办法是在aes中定义变量。感谢@aosmith 帮我解决了这个问题。可以在下面找到上述代码的更正版本:
d <- ggplot(df, aes(let,fill=cat,norm=norm)) +
geom_bar(aes(y = ((..count..)/norm)),position='dodge')
以及更复杂的实际代码:
ggplot(droplevels(dfR[keep,]), aes(subject_count=subject_count_ASDvTD,x=loc_breakBinned,fill=amalgamated_group,y = ((..count..)/subject_count) ) ) +
geom_bar(position='dodge')