【问题标题】:Display percentage by column on a stacked bar graph在堆积条形图上按列显示百分比
【发布时间】:2017-09-15 04:50:51
【问题描述】:

我正在尝试绘制一个堆积条形图,显示列中每个组的相对百分比。

这是我的问题的一个说明,使用默认的 mpg 数据集:

mpg %>%
  ggplot(aes(x=manufacturer, group=class)) +
  geom_bar(aes(fill=class), stat="count") +
  geom_text(aes(label=scales::percent(..prop..)),
    stat="count",
    position=position_stack(vjust=0.5))

这是输出:

我的问题是这个输出显示了每个占总数的百分比,而不是每个制造商中的相对百分比。

例如,我希望第一列 (audi) 显示棕色(紧凑型)的 83.3% (15/18) 和绿色(中型)的 16.6% (3/18)。

我在这里发现了一个类似的问题: How to draw stacked bars in ggplot2 that show percentages based on group?

但我想知道在 ggplot2 中是否有更简单的方法来执行此操作,特别是因为我的实际数据集使用一堆 dplyr 管道来处理数据,然后最终将其输送到 ggplot2。

【问题讨论】:

    标签: r plot ggplot2


    【解决方案1】:

    如果我将您的问题与您提供的链接进行比较,区别在于链接“计算”了它们本身。这就是我所做的。我不确定这是否适合您的真实数据。

    library(ggplot2)
    library(dplyr)
    
    mpg %>%
      mutate(manufacturer = as.factor(manufacturer),
             class = as.factor(class)) %>%
      group_by(manufacturer, class) %>%
      summarise(count_class = n()) %>%
      group_by(manufacturer) %>%
      mutate(count_man = sum(count_class)) %>%
      mutate(percent = count_class / count_man * 100) %>%
      ggplot() +
      geom_bar(aes(x = manufacturer,
                   y = count_man, 
                   group = class,
                   fill = class), 
               stat = "identity") +
      geom_text(aes(x = manufacturer,
                    y = count_man,
                    label = sprintf("%0.1f%%", percent)),
                position = position_stack(vjust = 0.5))
    

    根据评论编辑:

    我为y 选择了错误的列,这是一个错误

    library(ggplot2)
    library(dplyr)
    
    mpg %>%
      mutate(manufacturer = as.factor(manufacturer),
             class = as.factor(class)) %>%
      group_by(manufacturer, class) %>%
      summarise(count_class = n()) %>%
      group_by(manufacturer) %>%
      mutate(count_man = sum(count_class)) %>%
      mutate(percent = count_class / count_man * 100) %>%
      ungroup() %>%
      ggplot(aes(x = manufacturer,
                 y = count_class,
                 group = class)) +
      geom_bar(aes(fill = class), 
               stat = "identity") +
      geom_text(aes(label = sprintf("%0.1f%%", percent)),
                position = position_stack(vjust = 0.5))
    

    【讨论】:

    • 使用您的方法,百分比是正确的,但块大小是错误的。但我认为这是正确的前进方向;让我玩一下 dplyr 看看我能不能把它弄好。
    • 我多么愚蠢!我也会看看并编辑答案!
    • 哇,现在完美了!我也想过做这样的事情,但没有意识到您可以使用 ungroup 将汇总数据恢复为原始形式。这对我来说是缺失的环节;谢谢! :)
    • 如果你忽略它也可以,但过去如果你使用很多组我会遇到一些问题,所以我的习惯是经常以ungroup结尾以避免这些问题。
    【解决方案2】:

    如果绘图需要数字和百分比作为彩色条形图顶部的文本,以帮助我们查看差异,也许最好将结果显示为一个简单的表格:

    round(prop.table(table(mpg$class, mpg$manufacturer), margin = 2), 3) * 100
    
    #             audi chevrolet dodge  ford honda hyundai  jeep land rover lincoln mercury nissan pontiac subaru toyota volkswagen
    # 2seater      0.0      26.3   0.0   0.0   0.0     0.0   0.0        0.0     0.0     0.0    0.0     0.0    0.0    0.0        0.0
    # compact     83.3       0.0   0.0   0.0   0.0     0.0   0.0        0.0     0.0     0.0   15.4     0.0   28.6   35.3       51.9
    # midsize     16.7      26.3   0.0   0.0   0.0    50.0   0.0        0.0     0.0     0.0   53.8   100.0    0.0   20.6       25.9
    # minivan      0.0       0.0  29.7   0.0   0.0     0.0   0.0        0.0     0.0     0.0    0.0     0.0    0.0    0.0        0.0
    # pickup       0.0       0.0  51.4  28.0   0.0     0.0   0.0        0.0     0.0     0.0    0.0     0.0    0.0   20.6        0.0
    # subcompact   0.0       0.0   0.0  36.0 100.0    50.0   0.0        0.0     0.0     0.0    0.0     0.0   28.6    0.0       22.2
    # suv          0.0      47.4  18.9  36.0   0.0     0.0 100.0      100.0   100.0   100.0   30.8     0.0   42.9   23.5        0.0
    

    【讨论】:

    • 感谢您的回答。这很有帮助,但不是我想要的,因为 mpg 数据集只是一个示例。但是,您的矩阵表示可能是显示此特定数据集的类制造商摘要的更好方法,这是一个很好的观点。
    猜你喜欢
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 2022-09-28
    • 2021-05-31
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 2017-08-29
    相关资源
    最近更新 更多