【问题标题】:Modifying the 'percent' format for geom_bar in ggplot2修改 ggplot2 中 geom_bar 的“百分比”格式
【发布时间】:2016-03-31 06:25:59
【问题描述】:

我试图让 geom_bar 将计数除以归一化因子,而不是除以 sum(..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 中使用weight = 1/norm?我看不出您如何将计数(为每个组汇总)除以尚未汇总的内容(例如norm)。 This question 可能是相关的,尽管这是除以一个常数。另一种选择是只计算您想要在 ggplot2 之外绘制的值 - 这很简单。
  • 我不认为体重是我要找的。我正在尝试获取:合并组的 group_i 中观察到的基因座数/主题
  • 我不确定体重是我想要的。我正在尝试获取:amalgamated_groups 的 group_i 中观察到的基因座数/主题数。百分比给我:基因座数/合并组的 group_i 内的基因座数。 weight=subject_count 会给我:group_i of amalgamated_groups 内的主题数/amalgamated_groups group_i 内的基因座数?这与我正在寻找的相反。那么这行得通吗? ggplot(droplevels(dfR[keep,]), aes(x=subject_count_ASDvTD,fill=amalgamated_group,weight=loc_breakBinned ) + geom_bar(position='dodge')
  • 没关系,其他答案有效。谢谢@aosmith

标签: r ggplot2 geom-bar


【解决方案1】:

解决方案是在 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')

【讨论】:

    猜你喜欢
    • 2018-03-17
    • 2022-01-13
    • 1970-01-01
    • 2017-10-17
    • 2021-10-26
    • 2014-09-06
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多