如何为带有百分比标签的条形图创建函数

时间:2019-08-06 10:55:18

标签: r ggplot2 markdown r-markdown

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

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

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))

我想为上面的条形图创建一个函数,以便能够更改dfcol1col2

我尝试了以下操作:

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指定列来解决它,但这也不起作用。

2 个答案:

答案 0 :(得分:0)

由于您未提供任何示例数据,因此我无法将其转换为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)

答案 1 :(得分:0)

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

使用称为大括号的语法将对此有所帮助:

{{ }}

计算百分比

 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,则无需将其放置在函数中。

希望获得帮助!