【问题标题】:R accurate labels for stacked bar chart堆叠条形图的 R 准确标签
【发布时间】:2021-10-04 17:48:19
【问题描述】:

首先是一些代表数据:

df.test <- data.frame(
       stringsAsFactors = FALSE,
                                    
                                       GENDER = c("Male",
                                                  "Male","Male","Male",
                                                  "Male","Male","Female","Male",
                                                  "Male","Male","Male",
                                                  "Female","Female","Female","Male",
                                                  "Male","Male","Female",
                                                  "Male","Male","Male","Male",
                                                  "Male","Male","Male",
                                                  "Female","Female","Male","Female",
                                                  "Female"),
                                         ETHN = c("White",
                                                  "Hispanic","Hispanic",
                                                  "Black/African American",
                                                  "Black/African American",
                                                  "Black/African American",
                                                  "Declined to Answer","Hispanic","Hispanic",
                                                  "Hispanic",
                                                  "Hawaiian/Pacific Islander","Hispanic",
                                                  "Hispanic","Hispanic","White",
                                                  "White","White","Asian","Asian",
                                                  "Hispanic","Hispanic",
                                                  "Hispanic","Hispanic","Hispanic",
                                                  "Hispanic","White","White",
                                                  "White","Hispanic",
                                                  "Hispanic"),
                                  
                                
                                     
                                    GRDE_CODE = c("F",
                                                  "A-","B+","F","CRD","C",
                                                  "CRD","C+","B+","B+","B",
                                                  "B+","NCR","NCR","CRD","C-",
                                                  "C","A-","CRD","D","C+",
                                                  "B","B+","IP","INC","A",
                                                  "A","A","F","A"),
                                
                         
                                   Course.lvl = as.factor(c("200-level",
                                                            "300-level","300-level",
                                                            "200-level",
                                                            "300-level","200-level",
                                                            "100-level",
                                                            "300-level","300-level",
                                                            "400-level",
                                                            "300-level","200-level",
                                                            "200-level",
                                                            "200-level","100-level",
                                                            "200-level",
                                                            "300-level","200-level",
                                                            "200-level",
                                                            "100-level","300-level",
                                                            "300-level","300-level",
                                                            "400-level",
                                                            "300-level","300-level",
                                                            "300-level",
                                                            "200-level","100-level",
                                                            "300-level"))
                      )

我想要做的是使用上面的数据创建一个带有各个百分比标签的堆积条形图。我的代码运行良好,它可视化了所有内容,但我的问题是我似乎无法为我的数据获得准确的标签。

df.test %>%
  filter(!(GRDE_CODE %in% c("IP", "INC", "NG"))) %>%
  filter(Course.lvl %in% c("200-level", "100-level"
  )) %>%
  ggplot() +
  aes(x = GRDE_CODE, fill = GENDER) +
  geom_bar(position = "fill") +
  # geom_text(aes(label = (..count..)/sum(..count..)), position = position_fill(vjust = 0.5))+
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(values = c(Female = "#F99A46", 
                               Male = "#0BB021", `Not Reported` = "#3404DD")) +
  labs(x = "Grade Code", y = "% of Grade", title = "Math - 100/200") +
  coord_flip() +
  theme_classic() +
  facet_grid(vars(), vars(Course.lvl))

我尝试使用

geom_text(aes(label = (..count..)/sum(..count..)), position = position_fill(vjust = 0.5))

(生成的图表示例)

但我每次都会出错。有没有办法用相对百分比(可能每个条的计数)来标记条形,而不必求助于大量的 mutate 函数?如果没有,最好的跟踪方法是什么,以免我的数据被错误标记?

提前非常感谢!

【问题讨论】:

  • 首先,您需要在geom_text() 中添加stat = "count",尽管这不会为您按组计算百分比。我想你会对来自 GGallystat_prop() 感兴趣,如图所示here 来完成这项任务。计算兴趣比例对我来说似乎不是特别繁重,但对他们自己来说。请参阅带有 dplyr 示例代码和其他讨论的 this ggplot2 GitHub thread
  • 您是否能够通过您的示例生成所需的图表?
  • 也许吧?我不是 100% 肯定你想要的标签是什么,但我可以用标准 ggplot2 stat = "count"label = after_stat(count) 和另一个用使用 GGally 示例在每个栏中标记的每个“性别”的比例,其中 stat = "prop" 加上 by = factor(GRDE_CODE) 添加到 aes()
  • 很好奇,你知道我是否也可以在百分比旁边包含这些计数?它可能有点拥挤,但有时会很有用
  • 基于?GGally::state_prop,看起来count 是“计算变量”之一。这意味着如果使用after_stat(),您可以在标签中同时引用countprop。有关使用 after_stat()prop 的信息,请参阅该文档中的最后一个示例。您也许可以在其中使用paste() 以某种方式获得两者。

标签: r ggplot2 dplyr


【解决方案1】:
library(GGally, quietly = TRUE)

df.test %>%
  filter(!(GRDE_CODE %in% c("IP", "INC", "NG"))) %>%
  filter(Course.lvl %in% c("200-level", "100-level"
  )) %>%
  ggplot() +
  aes(x = GRDE_CODE, fill = GENDER, by=as.factor(GRDE_CODE)) +
  geom_bar(position = "fill") +
  geom_text(stat = "prop", position = position_fill(.5))+
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(values = c(Female = "#F99A46", 
                               Male = "#0BB021", `Not Reported` = "#3404DD")) +
  labs(x = "Grade Code", y = "% of Grade", title = "Math - 100/200") +
  coord_flip() +
  theme_classic() +
  facet_grid(vars(), vars(Course.lvl))

上面的代码给了我想要的输出。感谢aosmith 的帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    相关资源
    最近更新 更多