【问题标题】:ggplot: barplot y value as grouped column valueggplot:条形图 y 值作为分组列值
【发布时间】:2020-01-24 00:02:31
【问题描述】:

我有一个数据集,我想通过对列进行分组来创建条形图,但我希望每个组的计数能够反映该组的唯一列值。

DT <- data.table(id=c(1,1,1,1,2,2,2,3,3,3,4,4,4,5,5),
                 time=c(0,1,2,3,0,1,2,0,1,2,0,1,2,0,1),
                 exposure=c(1,2,0,3,2,3,1,0,3,3,0,0,3,3,0),
                 tmin=c(rep(2,15)),
                 rule=c(rep("a",7),rep("b",6),rep("c",2)))
tmin <- 2

DT[time<=tmin,exposure.sum:=sum(exposure),by=rule]

我想对 rule 列进行分组,并让规则 a、b、c 的计数分别为 9、9、3。如exposure.sum 列中所示

> DT[time<=tmin,]
    id time exposure tmin rule exposure.sum
 1:  1    0        1    2    a            9
 2:  1    1        2    2    a            9
 3:  1    2        0    2    a            9
 4:  2    0        2    2    a            9
 5:  2    1        3    2    a            9
 6:  2    2        1    2    a            9
 7:  3    0        0    2    b            9
 8:  3    1        3    2    b            9
 9:  3    2        3    2    b            9
10:  4    0        0    2    b            9
11:  4    1        0    2    b            9
12:  4    2        3    2    b            9
13:  5    0        3    2    c            3
14:  5    1        0    2    c            3

现在,我创建了一个简单的条形图,但每个规则的计数结果是每个规则的 exposure.sum 的总和;当我实际上希望它们为 9,9,3(即该规则的 exposure.sum 的唯一值)时,我最终得到了一个计数为 54,54,6 的条形图

ggplot(DT[time<=tmin,]) +
  geom_bar(aes(x=rule,y=exposure.sum),stat="identity")

【问题讨论】:

    标签: r ggplot2 bar-chart


    【解决方案1】:

    这是使用 dplyr 的解决方案。

    library(tidyverse)
    
    DT <- data.table(id=c(1,1,1,1,2,2,2,3,3,3,4,4,4,5,5),
                     time=c(0,1,2,3,0,1,2,0,1,2,0,1,2,0,1),
                     exposure=c(1,2,0,3,2,3,1,0,3,3,0,0,3,3,0),
                     tmin=c(rep(2,15)),
                     rule=c(rep("a",7),rep("b",6),rep("c",2)))
    tmin <- 2
    
    DT[time<=tmin,exposure.sum:=sum(exposure),by=rule]
    
    DT[time <= tmin] %>% group_by(rule) %>% summarise(exposure.sum = sum(exposure)) %>% 
                ggplot(aes(x = rule, y = exposure.sum)) + geom_bar(stat = 'identity') + 
                scale_y_continuous(breaks = (1:9)) + geom_text(aes(label = exposure.sum, y = exposure.sum - 0.6), size = 10, color = 'white')
    

    产生以下输出:

    【讨论】:

    • 你不会碰巧知道如何在条形图本身的正上方直观地插入数字值吗?
    • 更改了代码/图片以显示数字。 geom_text 是您添加文本的方式。您可以更改 geom_text 中的 y 以在条形上方或下方显示标签。
    • 我看到了 dplyr 如何将信息“压缩”到每个规则和 exposure.sum 值的一行。有没有办法用暴露组的分区总和填充每个条? (例如,对于规则 a,具有值 2、4 和 3 的堆积条形图以及反映曝光值对每个值的贡献的图例)
    猜你喜欢
    • 2017-05-31
    • 2018-12-03
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多