【问题标题】:How to create a function for a bar chart with percentage labels如何为带有百分比标签的条形图创建函数
【发布时间】:2019-08-06 10:55:18
【问题描述】:

我想为包含带有相应百分比的标签的条形图创建一个函数。

以下代码创建了我希望看到的条形图:

percentData <- df %>% 
  group_by(col1) %>% 
  count(col2) %>% 
  mutate(ratio=scales::percent(n/sum(n)))

diagram <- ggplot(df, aes(x=col1, fill=col2)) 
  geom_bar(position = "fill") 
  geom_text(data=percentData, aes(y=n,label=ratio),
            position=position_fill(vjust=0.5))

我想为上面的条形图创建一个函数,以便能够更改df、col1 和col2。

我尝试了以下方法:

newdiagram <- function(data, col1, col2){
  percentData <- data %>% 
    group_by(col1) %>% 
    count(col2) %>% 
    mutate(ratio=scales::percent(n/sum(n)))

  diagram <- ggplot(data, aes(x=col1, fill=col2)) 
    geom_bar(position = "fill") 
    geom_text(data=percentData, aes(y=n,label=ratio), 
              position=position_fill(vjust=0.5))
  return(diagram)
}

newdiagram(df, column1, column2)

很遗憾,我收到了列未知的错误消息。我尝试通过使用data$col1 指定列来解决它,但这也不起作用。

【问题讨论】:

    标签: r ggplot2 markdown r-markdown


    【解决方案1】:

    由于您没有提供任何示例数据,我无法 100% 证明它会解决问题,但一般来说,如果您想用字符串处理数据框的列,这将是正确的语法:

    data[[col1]]
    

    这意味着这应该适合你:

    newdiagram <- function(data, col1, col2){
      percentData <- data %>% 
        group_by(data[[col1]]) %>% 
        count(data[[col2]]) %>% 
        mutate(ratio=scales::percent(n/sum(n)))
    
      diagram <- ggplot(data, aes(x=col1, fill=col2)) 
        geom_bar(position = "fill") 
        geom_text(data=percentData, aes(y=n,label=ratio), 
                  position=position_fill(vjust=0.5))
      return(diagram)
    }
    
    newdiagram(df, column1, column2)
    

    您还可以通过以下方式提供一个用于重现性的简约数据集:

    head(data)
    

    【讨论】:

      【解决方案2】:

      我建议您将百分比的计算和视觉效果的构建分成两个单独的函数。这样更容易发现错误。

      使用称为大括号的语法会有所帮助:

      {{ }}
      

      计算百分比

       library(tidyverse)
       library(magrittr)
      
       percentData_calculation <- function(col1){
       group_by({{col1}}) %>%
       count({{col1}}) %>%
       mutate(ratio = scales::percent(n/sum(n)))}
      

      建筑视觉

      newdiagram <- function(df, col1, col2){
       percentData_calculation({{col1}}) %>%
        ggplot({{df}}, aes(x={{col1}},y={{col2}}) +
        geom_bar(postion = fill) +
        geom_text(., aes(y = n , label = ration),
                postion = postion_fill(vjust = 0.5)
      

      在 geom_text 中,您不需要命名数据源,因为它来自计算。此外,如果您知道 ggplot 的某些方面不会改变,例如 df,那么您就不需要将它放在函数中。

      希望对您有所帮助!

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 2019-12-19
      相关资源
      最近更新 更多